Java neo4j在一个迭代器上处理长事务
我想检查一下图中的所有“用户”节点,并对它们执行一些操作 问题是我有太多的“用户”节点,并且我不能将它们全部保存在堆上 所以,做一些类似于:Java neo4j在一个迭代器上处理长事务,java,neo4j,Java,Neo4j,我想检查一下图中的所有“用户”节点,并对它们执行一些操作 问题是我有太多的“用户”节点,并且我不能将它们全部保存在堆上 所以,做一些类似于: try (Transaction tx = graphDb.beginTx()) { Iterator<Node> n_column = autoNodeIndex.get( "type", "user" ); while (n_column.hasNext()) { //create relationship
try (Transaction tx = graphDb.beginTx())
{
Iterator<Node> n_column = autoNodeIndex.get( "type", "user" );
while (n_column.hasNext()) {
//create relationship for node...
}
tx.success();
}
try(事务tx=graphDb.beginTx())
{
迭代器n_column=autoNodeIndex.get(“类型”、“用户”);
while(n_column.hasNext()){
//为节点创建关系。。。
}
成功();
}
将导致GC开销异常
如何在同一迭代器上将其拆分为几个事务
我考虑过嵌套事务,但手册中的说法不同。嵌套事务将本地内存滚动到事务的顶部 只需添加一个计数器,然后每隔50000个节点提交并启动一个新事务
Transaction tx = graphDb.beginTx();
Iterator<Node> n_column = autoNodeIndex.get( "type", "user" );
int counter=0;
while (n_column.hasNext()) {
//create relationship for node...
if (++counter % 50000 == 0) {
tx.success(); tx.close();
tx = graphDb.beginTx();
}
}
tx.success();
tx.close();
Transaction tx=graphDb.beginTx();
迭代器n_column=autoNodeIndex.get(“类型”、“用户”);
int计数器=0;
while(n_column.hasNext()){
//为节点创建关系。。。
如果(++计数器%50000==0){
发送成功();发送关闭();
tx=graphDb.beginTx();
}
}
成功();
tx.close();
有效!我想当我关闭事务时,它会杀死迭代器。我想不是…我的数据库变得更大了,现在它有1000万用户。所以现在,它不再起作用了。。。在大约60k个用户之后,我在java堆上再次出现“outOfMemory”错误。我认为每次关闭事务时,关系都会被清除,但迭代器会继续在堆上保存数据。我怎样才能避免呢?