neo4j的“Java堆空间”错误 - 增加内存分配失败时

时间:2016-05-16 06:14:46

标签: neo4j heap-memory

我使用导入工具读取了大约100万个节点。现在是时候建立关系了。 (不幸的是,如果你想使用导入工具,你必须在csv中明确预定关系,所以这是不可能的。)

我做的第一件事就是在节点上放置一个索引。

接下来,我写了这个,我想知道是我的问题 - 即使有索引,这个陈述可能会导致过多的笛卡尔产品?:

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文件中更改我的内存设置可能有所帮助,所以我将设置一直更改为4GB(我有一个8 GB的系统):

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

仍有同样的错误。

现在,我被困住了。除此之外,我想不出任何其他策略:

1)重写声明
2)使用具有更多RAM的系统?
3)找到一些其他方式分批运行它?

任何建议都很棒。感谢neo4j SO社区提前。

1 个答案:

答案 0 :(得分:1)

:Player(player_id)上有索引或唯一约束吗?如果是前者,则删除索引并添加唯一约束。否则,可能有多个Player节点共享相同的player_id - 这可能会导致笛卡尔积,假设你有10倍于同一个播放器,这将最终为你的csv的每一行100个组合。

一旦你确定没有这样的重复,接下来要检查的是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)