删除Neo4j中的大量节点时出现GC OutOfMemory错误

时间:2012-08-25 20:28:28

标签: neo4j

我有大量高度连接的节点,我有时想从数据库中删除它们。通过几次遍历,我得到了一个我想要删除的节点列表:

for (Node nodeToDelete : nodesToDelete)
{
    for (Relationship rel : nodeToDelete.getRelationships())
    {
        rel.delete();
    }

    nodeToDelete.delete();
}   

问题在于,无论我设置多大的堆,我都会得到: java.lang.OutOfMemoryError:超出GC开销限制

删除大量节点列表的最佳方法是什么?我知道在实际删除它们之前我必须首先删除它们之间的关系 - 我逐步完成代码,它似乎在删除关系时失败了。删除节点的功能是否比我的更好?一切都包含在一个非常重要的事务中,因为这个删除的任何部分都不允许失败 - 这可能是个问题吗?

谢谢!

1 个答案:

答案 0 :(得分:5)

批量处理。问题是你的删除被包装在一个可以恢复的事务中,但是为了存储该reversion,它被存储在内存中。试着这样做。

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++;
}