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

ger*_*ger 5 neo4j cypher

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

Match (p:Person) set p.regId= toInt(p.regId) ;
Run Code Online (Sandbox Code Playgroud)

在这之前我已经在Person上添加了属性索引regId.在执行期间,抛出以下错误

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

Ste*_*ter 5

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

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

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

在你的情况下:

Match (p:Person) 
where p.regId <> toInt(p.regId)
with p limit 10000
set p.regId= toInt(p.regId) 
return count(p)
Run Code Online (Sandbox Code Playgroud)


Fro*_*its 1

以下是导致错误的原因的描述。基本上,您的内存不足,垃圾收集不会为您找到任何额外的可用内存。

neo4j 性能调优指南中,有很多关于如何调整内存的指导。

首先要尝试的是给 JVM 更多内存;对于 shell,您需要JAVA_OPTS=-Xmx1024m在启动 shell 之前进行一些设置,以调整 JVM 可以使用的内存量,这会增加堆大小。