我有大量高度连接的节点,有时我想从数据库中删除.通过几次遍历,我最后得到了一个我想要删除的节点列表:
for (Node nodeToDelete : nodesToDelete)
{
for (Relationship rel : nodeToDelete.getRelationships())
{
rel.delete();
}
nodeToDelete.delete();
}
Run Code Online (Sandbox Code Playgroud)
问题是无论我设置多大的Heap,我都会得到: java.lang.OutOfMemoryError:超出了GC开销限制
删除大型节点列表的最佳方法是什么?我知道在实际删除它们之前我必须首先删除它们之间的关系 - 我逐步完成代码,它似乎在删除关系时失败了.删除节点的功能是否比我的更好?一切都包含在一个非常重要的事务中,因为这个删除的任何部分都不允许失败 - 这可能是个问题吗?
谢谢!
做它作为批次.问题是你的删除被包装在一个可以恢复的事务中,但是为了存储该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++;
}
Run Code Online (Sandbox Code Playgroud)