更新neo4j db中所有节点的属性导致内存不足

时间:2015-07-01 10:40:20

标签: neo4j cypher

我的图表数据库有350万个节点大小的数据库是1.6GB我正在尝试通过neo4jshell通过以下查询更新所有节点的属性。

Match (p:Person) set p.regId= toInt(p.regId) ;

在此之前,我已在Person regId添加索引。 在执行期间抛出以下错误

  

java.lang.MemoryError:超出GC开销限制

2 个答案:

答案 0 :(得分:5)

单个Cypher语句执行的所有更改都在同一事务中执行。事务在内存中建立,并在关闭时保持持久性。

我猜你的事务在这里变得很大,因此导致内存错误。

处理此问题的通常策略是在cypher语句上使用LIMIT来定义大小,报告所做的更改次数并运行语句x次,直到返回值为0。

在你的情况下:

Match (p:Person) 
where p.regId <> toInt(p.regId)
with p limit 10000
set p.regId= toInt(p.regId) 
return count(p)

答案 1 :(得分:1)

Here is a description of what's causing the error。基本上,你的内存不足,垃圾收集并没有找到任何额外的空闲内存。

neo4j performance tuning guide中有很多关于如何调整内存的指导。

首先要尝试的是为JVM提供更多内存;对于shell,你需要在启动shell之前设置JAVA_OPTS=-Xmx1024m之类的内容来调整JVM可以使用多少内存,这会增加堆大小。