3

これは次のようなものです: Neo4j の OutOfMemory 問題

しかし、それは時代遅れであり、私が知る限り解決策も明らかにそうです。

そのため、5.5M の関係を持つ約 100K ノードを挿入しようとしています (実際にはデータ セットを削減したため、2.8M の関係を持つ <100K ノードのようになりました)。

しばらくすると、メモリが不足し、次のような例外が発生します。

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();
4

2 に答える 2

11

ここに別の答えを追加します。したがって、コードを考えると、問題はトランザクションをコミットしないことです。トランザクションデータはコミットされるまでメモリに保持されるため、作成されたすべてのノードとリレーションシップはコミットを待つためにメモリ内にとどまり、最終的にOOMを取得するのはそのためです。

私はこのコード変更を提案します:

/*Postgresのクエリとセットアップのカット*/
トランザクションtx=graphDb.beginTx();
試す {
    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));
        関係=n_lo.createRelationshipTo(n_hi、RelTypes.PLAYED_WITH);
        Relationship.setProperty( "mean_percent"、rs.getDouble(5));

        //時々コミットしてメモリを解放します。
        if(i> 0 && i%10000 == 0){
            tx.success();
            tx.finish();
            tx =graphDb.beginTx();
        }
    }
    tx.success();
} ついに {
    tx.finish();
}
graphDb.shutdown();
于 2012-06-21T14:05:48.867 に答える