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