Недостаточно памяти в neo4j с использованием периодических коммитов - PullRequest
0 голосов
/ 05 декабря 2018

Я пытаюсь загрузить довольно большой (~ 200 миллионов строк) файл в neo4j, используя LOAD CSV, например,

USING PERIODIC COMMIT
LOAD CSV WITH HEADERS FROM
'file:///home/manu/citation.csv.gz' AS line
MATCH (origin:`publication` {`id`: line.`cite_from`})
MATCH (destination:`publication` {`id`: line.`cite_to`})
MERGE (origin )-[rel:CITES ]->(destination );

, но продолжаю видеть ошибки памяти, такие как

raise CypherError.hydrate(**metadata)
neo4j.exceptions.TransientError: There is not enough memory to perform 
the current task. Please try increasing 'dbms.memory.heap.max_size' in 
the neo4j configuration (normally in 'conf/neo4j.conf' or, if you you 
are using Neo4j Desktop, found through the user interface) or if you 
are running an embedded installation increase the heap by using '-Xmx' 
command line flag, and then restart the database.

при запуске кода и на сервере

Exception: java.lang.OutOfMemoryError thrown from the UncaughtExceptionHandler in thread "neo4j.StorageMaintenance-14"
2018-12-05 15:44:32.967+0000 WARN   Java heap space
java.lang.OutOfMemoryError: Java heap space
2018-12-05 15:44:32.968+0000 WARN  Unexpected thread death: org.eclipse.jetty.util.thread.QueuedThreadPool$2@b6328a3 in QueuedThreadPool[qtp483052300]@1ccacb0c{STARTED,8<=8<=14,i=1,q=0}[ReservedThreadExecutor@f5cbd17{s=0/1,p=0}]
Exception in thread "neo4j.ServerTransactionTimeout-6" Exception in thread "neo4j.TransactionTimeoutMonitor-11" java.lang.OutOfMemoryError: Java heap space                                              
java.lang.OutOfMemoryError: Java heap

Конечно, я пытался установить эту вещь dbms.memory.heap.max_size (до 24 ГБ ... выше этого, мой 32-ГБ компьютер не будет дажебыть в состоянии начать neo4j), но я все еще получаю те.Я не совсем понимаю, какова цель части USING PERIODIC COMMIT, если (кажется) neo4j пытается загрузить все сразу?Глядя на руководство или, например, эту ветку , вы думаете, что USING PERIODIC COMMIT - это решение именно той проблемы, с которой я столкнулся.

Есть какие-нибудь подсказки?Единственный обходной путь, который приходит на ум, - это разделить файл на несколько частей, но это не выглядит элегантным решением (также, если это работает ... не мог бы neo4j сделать это для меня прозрачно?)

РЕДАКТИРОВАТЬ: план запроса, используя EXPLAIN

enter image description here

Cheers.

1 Ответ

0 голосов
/ 06 декабря 2018

Возможно, это скорее обходной путь, чем "решение", но наложение уникального ограничения на свойство, которое тщательно проверяется для этого запроса cypher , помогло мне:

CREATE CONSTRAINT ON (p:publication) ASSERT p.id IS UNIQUE
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...