3

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

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

    nodeToDelete.delete();
}   

问题是,无论我设置多大的堆,我都会收到: java.lang.OutOfMemoryError: GC overhead limit exceeded

删除大量节点的最佳方法是什么?我知道我必须先删除他们的关系,然后才能真正删除它们——我单步执行代码,它似乎在删除关系时失败了。有没有比我有更好的删除节点的功能?一切都包含在一个非常重要的事务中,因为这个删除的任何部分都不允许失败——这可能是个问题吗?

谢谢!

4

1 回答 1

5

做一个批次。问题是您的删除被包装在一个可以还原的事务中,但是为了存储该还原,它存储在内存中。尝试这样做。

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++;
}   
于 2012-08-26T01:43:46.573 回答