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



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

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

在此之前,我已经为属性regId添加了Person的索引。在执行过程中,引发了以下错误

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

单个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)

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

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

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

最新更新