gpt4 book ai didi

Java Neo4J 内存不足

转载 作者:塔克拉玛干 更新时间:2023-11-01 21:41:12 31 4
gpt4 key购买 nike

这有点像这样:Neo4j OutOfMemory problem

但它已经过时,据我所知,解决方案显然也是如此。

所以我尝试插入大约 10 万个节点和 550 万个关系(我实际上缩减了我的数据集,所以它现在更像是 <10 万个节点和 280 万个关系)。

一段时间后,内存不足,我得到如下异常:

Exception in thread "GC-Monitor" java.lang.OutOfMemoryError: Java heap space
at java.util.Arrays.copyOfRange(Unknown Source)
at java.lang.String.<init>(Unknown Source)
at java.lang.StringBuilder.toString(Unknown Source)
at org.neo4j.kernel.impl.util.StringLogger$ActualStringLogger.logMessage(StringLogger.java:276)
at org.neo4j.kernel.impl.cache.MeasureDoNothing.run(MeasureDoNothing.java:85)
Exception in thread "main" java.lang.OutOfMemoryError: Java heap space
at java.util.LinkedList.addBefore(Unknown Source)
at java.util.LinkedList.add(Unknown Source)
at org.neo4j.kernel.impl.nioneo.store.IdGeneratorImpl.freeId(IdGeneratorImpl.java:291)
at org.neo4j.kernel.impl.nioneo.store.CommonAbstractStore.freeId(CommonAbstractStore.java:382)
at org.neo4j.kernel.impl.nioneo.xa.WriteTransaction.doRollback(WriteTransaction.java:315)
at org.neo4j.kernel.impl.transaction.xaframework.XaTransaction.rollback(XaTransaction.java:278)
at org.neo4j.kernel.impl.transaction.xaframework.XaResourceManager.rollback(XaResourceManager.java:518)
at org.neo4j.kernel.impl.transaction.xaframework.XaResourceHelpImpl.rollback(XaResourceHelpImpl.java:111)
at org.neo4j.kernel.impl.transaction.TransactionImpl.doRollback(TransactionImpl.java:558)
at org.neo4j.kernel.impl.transaction.TxManager.rollback(TxManager.java:610)
at org.neo4j.kernel.impl.transaction.TransactionImpl.rollback(TransactionImpl.java:129)
at org.neo4j.kernel.TopLevelTransaction.finish(TopLevelTransaction.java:119)
at sqlToGraph.SqlToGraph.main(SqlToGraph.java:81)

我已经尝试将 -Xmx1500m 传递给 java,这大约是我可以传递的限制,因为在它提示无法分配堆空间之前。它持续的时间明显更长,但仍未结束。

这是(略有编辑的)代码:

/* Postgres query and setup stuff cut */
Transaction tx = graphDb.beginTx();
try {
while (rs.next()) {
user_lo = rs.getInt(1);
user_hi = rs.getInt(2);
n_lo = getOrCreate(user_lo, graphDb);
n_lo.setProperty("user_id", user_lo);
n_lo.setProperty("total", rs.getInt(3));
n_hi = getOrCreate(user_hi, graphDb);
n_hi.setProperty("user_id", user_hi);
n_hi.setProperty("total", rs.getInt(4));
relationship = n_lo.createRelationshipTo(n_hi, RelTypes.PLAYED_WITH);
relationship.setProperty("mean_percent", rs.getDouble(5));
}
tx.success();
} finally {
tx.finish();
}
graphDb.shutdown();

最佳答案

在这里添加另一个答案。所以给定代码,问题是你永远不会提交你的事务。事务数据在提交之前一直保存在内存中,因此您创建的所有节点和关系都将保存在内存中等待提交,这就是您最终会出现 OOM 的原因。

我建议更改此代码:

/* Postgres query and setup stuff cut */Transaction tx = graphDb.beginTx();try {    for (int i = 0; rs.next(); i++) {        user_lo = rs.getInt(1);        user_hi = rs.getInt(2);        n_lo = getOrCreate(user_lo, graphDb);        n_lo.setProperty("user_id", user_lo);        n_lo.setProperty("total", rs.getInt(3));        n_hi = getOrCreate(user_hi, graphDb);        n_hi.setProperty("user_id", user_hi);        n_hi.setProperty("total", rs.getInt(4));        relationship = n_lo.createRelationshipTo(n_hi, RelTypes.PLAYED_WITH);        relationship.setProperty("mean_percent", rs.getDouble(5));        // Commit every now and then to free memory.        if ( i > 0 && i % 10000 == 0 ) {            tx.success();            tx.finish();            tx = graphDb.beginTx();        }    }    tx.success();} finally {    tx.finish();}graphDb.shutdown();

关于Java Neo4J 内存不足,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11103436/

31 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com