2016-05-16 3 views
1

Я использовал инструмент импорта для чтения в ~ 1 миллион узлов. Теперь настало время установить отношения. (К сожалению, похоже, что вы должны иметь явно заданные отношения в csv, если вы хотите использовать инструмент импорта, так что это не может быть и речи.)Ошибка «Java heap space» с neo4j - при сбое выделения памяти

Первое, что я сделал, это поместить индекс на узлы ,

Далее, я написал, что мне интересно, моя проблема - даже с индексом, это утверждение может вызвать слишком много декартовы продукции ?:

USING PERIODIC COMMIT 500 
LOAD CSV WITH HEADERS FROM 
'file:///home/monica/...relationship.csv' AS line 
MATCH (p1:Player {player_id: line.player1_id}), (p2:Player {player_id: line.player2_id}) 
MERGE (p1)-[:VERSUS]-(p2) 

Видимо USING PERIODIC COMMIT 500 не помогло, как я получил свою ошибку,

Java heap space 

погуглить вокруг, я узнал, что это могло бы помочь изменить мои настройки памяти в файле Neo4j-wrapper.conf, поэтому я изменил настройки вплоть до 4 Гб (у меня есть система восьми GB):

wrapper.java.initmemory=4096 
wrapper.java.maxmemory=4096 

По-прежнему такая же ошибка.

Теперь я застрял. Я не могу думать о каких-либо других стратегиях, кроме того:

1) переписать заявление
2) использовать систему с большим объемом оперативной памяти?
3) найти другой способ запустить это партиями?

Любые советы были бы замечательными. Благодаря сообществу neo4j SO заранее.

ответ

1

У вас есть какой-либо индекс или уникальное ограничение на :Player(player_id)? если первый, отбросьте индекс и добавьте вместо него уникальное ограничение. В противном случае возможно, что несколько узлов Игрока разделяют один и тот же player_id, что может привести к декартовым продуктам, предположим, что у вас в 10 раз больше того же игрока, это приведет к 100 комбинациям для каждой строки вашего csv.

После того, как вы уверены, что такого дублирования нет, следующая вещь для проверки: EagerPipe. Если план запроса (без PERIODIC COMMIT)

EXPLAIN LOAD CSV WITH HEADERS FROM 
'file:///home/monica/...relationship.csv' AS line 
MATCH (b1:Player {player_id: line.player1_id}), (p2:Player {player_id:  line.player2_id}) 
MERGE (p1)-[:VERSUS]-(p2) 

показывает что-то с eager затем PERIODIC COMMIT не применяется, см http://www.markhneedham.com/blog/2014/10/23/neo4j-cypher-avoiding-the-eager/ для деталей.

Случаи, когда это может случиться, становятся все меньше и меньше с более новой версией Neo4j.

обновление

Я просто понял, что вы используете b1 в матче и в Слить p1 - так что последний не существует, и будет создаваться в качестве нового узла в процессе слияния.

Можете ли вы попробовать:

USING PERIODIC COMMIT 500 
LOAD CSV WITH HEADERS FROM 
'file:///home/monica/...relationship.csv' AS line 
MATCH (p1:Player {player_id: line.player1_id}) 
MATCH (p2:Player {player_id: line.player2_id}) 
MERGE (p1)-[:VERSUS]-(p2) 
+0

Я сделал, как вы сказали; Я удалил индекс, добавил уникальное ограничение, а затем проверил план запроса. В самом деле ... есть «жаждущий» скрываться! Теперь мне нужно прочитать документацию и посмотреть, как я могу обойти это. Спасибо, что указал мне в этом направлении. –

+0

Ссылка на блог Марка Нидхэма рекомендует избегать слишком многого во время любой итерации 'LOAD CSV'. В моем случае, я делаю одно дело только на одной итерации 'LOAD CSV' ... –

+0

Какая версия neo4j у вас есть? –

Смежные вопросы