在Neo4j中删除大量节点时发生GC OutOfMemory错误
我有大量高度连接的节点,有时我希望从数据库中删除这些节点。通过几次遍历,我得到了一个要删除的节点列表:在Neo4j中删除大量节点时发生GC OutOfMemory错误,neo4j,Neo4j,我有大量高度连接的节点,有时我希望从数据库中删除这些节点。通过几次遍历,我得到了一个要删除的节点列表: for (Node nodeToDelete : nodesToDelete) { for (Relationship rel : nodeToDelete.getRelationships()) { rel.delete(); } nodeToDelete.delete(); } 问题是,无论我设置的堆有多大,我都会得到: java.
for (Node nodeToDelete : nodesToDelete)
{
for (Relationship rel : nodeToDelete.getRelationships())
{
rel.delete();
}
nodeToDelete.delete();
}
问题是,无论我设置的堆有多大,我都会得到:
java.lang.OutOfMemoryError:超出GC开销限制
删除大量节点列表的最佳方法是什么?我知道在实际删除它们之前,我必须先删除它们的关系-我一步一步地查看代码,但在删除关系时似乎失败了。有没有比我的功能更好的删除节点的功能?所有内容都封装在一个事务中,这非常重要,因为此删除的任何部分都不允许失败-这会是一个问题吗
谢谢 一批一批地做。问题是您的删除被包装在一个事务中,该事务可以恢复,但为了存储该恢复,它存储在内存中。试着这样做
long counter = 0;
for (Node nodeToDelete : nodesToDelete)
{
if (counter == 1000) {
tx.success();
tx.finish();
tx = db.beginTransaction();
counter = 0;
}
for (Relationship rel : nodeToDelete.getRelationships())
{
rel.delete();
}
nodeToDelete.delete();
counter++;
}
你不需要tx.success()吗;tx.finish()部分也在root for循环的末尾?是的,我假设他会在他上面提供的部分上注入此代码,即他会保留他已经拥有的
finish()
。如何使用Cypher进行批处理?我有一个9GB的数据库,有几百万个节点,我想删除其中的一大部分(但不是全部)。然而,即使使用-Xmx4g
-Xmx10g
,单个匹配({x:'something'})分离DELETE x
也会抛出内存错误
!!(总RAM为16GB)即使这样:MATCH(n:owl_Thing{{u partition:'lumen_yago'})返回计数(n)作为cnt
需要41秒:(使用-Xmx10g
。返回大约21000000的整数。(因此包含2100万个节点)