Запрос всех простых (циклических) путей возвращает слишком много данных -> переполнение кучи

#node.js #neo4j #cypher #neo4j-driver #neo4j-desktop

Вопрос:

Я совсем новичок в Neo4j и использую настольную версию Neo4j с драйвером Javascript. Мой график имеет около 30.000 узлов и 40.000 ребер. Окончательный подход состоял бы в том, чтобы получить все простые циклы на графике, но я сталкиваюсь с переполнением кучи при попытке выполнить следующий запрос шифра:

 let res = await session.run('MATCH p=(n)-[*2..4]-(n) RETURN nodes(p)')
 

Это, конечно, потому, что запрос пытается вернуть все найденные простые циклы, что слишком много для моей кучи и, к сожалению, увеличивает объем памяти для node.js это не вариант.

Итак, есть ли какой — нибудь способ обойти эту проблему и получить все простые циклы из графика?

Вот ошибка переполнения кучи, которую я получил:

 /Users/paulus/.nvm/versions/node/v15.10.0/bin/node /Users/paulus/routeplanner/RouteFinder.js

<--- Last few GCs --->

[39630:0x104e00000]   227813 ms: Scavenge (reduce) 2033.5 (2077.9) -> 2032.1 (2072.1) MB, 113.5 / 0.0 ms  (average mu = 0.577, current mu = 0.321) allocation failure 
[39630:0x104e00000]   228171 ms: Scavenge (reduce) 2036.5 (2072.6) -> 2035.5 (2075.6) MB, 28.6 / 0.0 ms  (average mu = 0.577, current mu = 0.321) allocation failure 
[39630:0x104e00000]   228558 ms: Scavenge (reduce) 2039.1 (2075.6) -> 2038.5 (2080.4) MB, 28.2 / 0.0 ms  (average mu = 0.577, current mu = 0.321) allocation failure 


<--- JS stacktrace --->


<--- Last few GCs --->

[39630:0x104e00000]   227813 ms: Scavenge (reduce) 2033.5 (2077.9) -> 2032.1 (2072.1) MB, 113.5 / 0.0 ms  (average mu = 0.577, current mu = 0.321) allocation failure 
[39630:0x104e00000]   228171 ms: Scavenge (reduce) 2036.5 (2072.6) -> 2035.5 (2075.6) MB, 28.6 / 0.0 ms  (average mu = 0.577, current mu = 0.321) allocation failure 
[39630:0x104e00000]   228558 ms: Scavenge (reduce) 2039.1 (2075.6) -> 2038.5 (2080.4) MB, 28.2 / 0.0 ms  (average mu = 0.577, current mu = 0.321) allocation failure 


<--- JS stacktrace --->

FATAL ERROR: MarkCompactCollector: young object promotion failed Allocation failed - JavaScript heap out of memory
FATAL ERROR: MarkCompactCollector: young object promotion failed Allocation failed - JavaScript heap out of memory

<--- Last few GCs --->

[39630:0x104e00000]   227813 ms: Scavenge (reduce) 2033.5 (2077.9) -> 2032.1 (2072.1) MB, 113.5 / 0.0 ms  (average mu = 0.577, current mu = 0.321) allocation failure 
[39630:0x104e00000]   228171 ms: Scavenge (reduce) 2036.5 (2072.6) -> 2035.5 (2075.6) MB, 28.6 / 0.0 ms  (average mu = 0.577, current mu = 0.321) allocation failure 
[39630:0x104e00000]   228558 ms: Scavenge (reduce) 2039.1 (2075.6) -> 2038.5 (2080.4) MB, 28.2 / 0.0 ms  (average mu = 0.577, current mu = 0.321) allocation failure 


<--- JS stacktrace --->

FATAL ERROR: MarkCompactCollector: young object promotion failed Allocation failed - JavaScript heap out of memory

Process finished with exit code 139 (interrupted by signal 11: SIGSEGV)
 

Ответ №1:

Трудно дать вам точное решение, не зная модели данных вашего графика, но это может помочь использовать пропуск/ограничение для получения данных в меньших объемах.

Это позволит получить первые 100 паттернов:

 MATCH p=(n)-[*2..4]-(n) RETURN nodes(p) SKIP 0 LIMIT 100
 

И это следующие 100:

 MATCH p=(n)-[*2..4]-(n) RETURN nodes(p) SKIP 100 LIMIT 100
 

Комментарии:

1. Это работает идеально, но как мне узнать предел?

2. Если вы ссылаетесь на общее количество шаблонов, вы можете сначала сделать запрос с количеством (СОВПАДЕНИЕ p=(n)-[*2..4]-(n) КОЛИЧЕСТВО возвратов(p)), чтобы узнать общее количество. Но если вы ссылаетесь на объемный размер, вы должны рассчитать его на основе объема имеющихся у вас данных и их размера (достаточно большого, чтобы не выполнять много запросов, но не настолько большого, чтобы он мог завершиться неудачей).

3. Я искал общее количество шаблонов… Спасибо!