我的图数据库有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可以使用的内存量,这会增加堆大小。