我的图表数据库有350万个节点大小的数据库是1.6GB我正在尝试通过neo4jshell
通过以下查询更新所有节点的属性。
Match (p:Person) set p.regId= toInt(p.regId) ;
在此之前,我已在Person regId
添加索引。
在执行期间抛出以下错误
java.lang.MemoryError:超出GC开销限制
答案 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可以使用多少内存,这会增加堆大小。