Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/neo4j/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在Neo4j中删除大量节点时发生GC OutOfMemory错误_Neo4j - Fatal编程技术网

在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万个节点)