2016-05-07 3 views
3

Neo4jのグラフに16,807個のノードを17.210.368の関係でロードしようとしています。そうするために、私はvincinityテーブルを含むファイルをロードし、私は関係と結ばれなければならないノードを持つリストを取得します。Neo4j組み込みJava - トランザクションは成功とマークされましたが、トランザクションをコミットできませんでした。ロールバックされました。

は、以下の私のコードを検索:私はこのコードを実行すると

String inputFile = "Desktop\kron7cd_unix.t01"; 
    FileInputStream in = new FileInputStream(inputFile); 
    FileChannel ch = in.getChannel(); 
    ByteBuffer buf = ByteBuffer.allocate(1024); 

    ArrayList<Integer> list = new ArrayList<Integer>(); 
    int NumOfOnes = 0; 
    int column=-1; 
    int row=0; 
    int rd; 
    while ((rd = ch.read(buf)) != -1){ 
     buf.flip(); 
     while (buf.hasRemaining()){ 
      byte byteVal = buf.get(); 
      if((byteVal == 48) || (byteVal == 49)){// when finds 1 or 0 
       column++; 
      } 
      if (byteVal == 92){//when finds '/' 
        row++; 
        column=-1; 
      } 
      if(byteVal == 49){//when finds 1 
       NumOfOnes++; 
       list.add(column); 
       list.add(row); 
      } 
     } 
    buf.clear(); 
    } 
    ch.close(); 


    GraphDatabaseFactory dbFactory = new GraphDatabaseFactory(); 
    GraphDatabaseService graphDb = dbFactory.newEmbeddedDatabase("C:\Neo4j\default.graphdb"); 

    Transaction tx = graphDb.beginTx(); 
    try { 

     Label myLabel = DynamicLabel.label("Data"); 
     ArrayList<Node> nodelist = new ArrayList<Node>(); 

     for (int k = 0; k < row; k++) { 
      nodelist.add(graphDb.createNode()); 
     } 

     for (int k = 0; k < row; k++) { 
      nodelist.get(k).setProperty("ID", k); 
      nodelist.get(k).setProperty("Group","Random"); 
      nodelist.get(k).addLabel(myLabel); 
     } 

     Relationship rel; 
     final RelationshipType type2 = DynamicRelationshipType.withName("Rel"); 

     for (int j = 0; j < list.size()-1 ; j += 2) { //list.size()=34420736 

      rel = nodelist.get(list.get(j)).createRelationshipTo(nodelist.get(list.get(j+1)), type2); 
      rel.setProperty("Team", "Common"); 

      if (j > 0 && j % 10000 == 0) {// as to commit transaction every now and then and dont throw heap space 
       tx.success(); 
       tx.close(); 
       tx = graphDb.beginTx(); 
      }     

     } 

     tx.success(); 
    } 

    finally { 
     tx.close(); 
    } 
    graphDb.shutdown(); 

それは私に次のエラーがスローされます。私はNeo4j 2.3.3とNetbeans 8.1をJava 8で使用しています。問題がヒープスペースであるか、トランザクションをコミットしようとしているかを理解したいと思います。ヒープスペースを増やすために、私のプロジェクトにコマンドラインオプション-Xmx1gを追加しました。

アイデア?以下

検索エラーメッセージが: - 10K要素ヒープ上のすべてのデータを保持しないようにする

Exception in thread "main" org.neo4j.graphdb.TransactionFailureException: Transaction was marked as successful, but unable to commit transaction so rolled back. 
at org.neo4j.kernel.TopLevelTransaction.close(TopLevelTransaction.java:121) 
at com.mycompany.traverse_test.traverse_main.main(traverse_main.java:232) 

Caused by: org.neo4j.kernel.api.exceptions.TransactionFailureException: Could not apply the transaction to the store after written to log 
at org.neo4j.kernel.impl.api.TransactionRepresentationCommitProcess.applyToStore(TransactionRepresentationCommitProcess.java:105) 
at org.neo4j.kernel.impl.api.TransactionRepresentationCommitProcess.commit(TransactionRepresentationCommitProcess.java:58) 
at org.neo4j.kernel.impl.api.KernelTransactionImplementation.commit(KernelTransactionImplementation.java:565) 
at org.neo4j.kernel.impl.api.KernelTransactionImplementation.close(KernelTransactionImplementation.java:458) 
at org.neo4j.kernel.TopLevelTransaction.close(TopLevelTransaction.java:97) 
... 1 more 

Caused by: java.lang.OutOfMemoryError 
at sun.misc.Unsafe.allocateMemory(Native Method) 
at org.neo4j.unsafe.impl.internal.dragons.UnsafeUtil.allocateMemory(UnsafeUtil.java:386) 
at org.neo4j.unsafe.impl.internal.dragons.MemoryManager$Slab.<init>(MemoryManager.java:111) 
at org.neo4j.unsafe.impl.internal.dragons.MemoryManager.allocateAligned(MemoryManager.java:82) 
at org.neo4j.io.pagecache.impl.muninn.MuninnPage.initBuffer(MuninnPage.java:417) 
at org.neo4j.io.pagecache.impl.muninn.MuninnPageCursor.pageFault(MuninnPageCursor.java:230) 
at org.neo4j.io.pagecache.impl.muninn.MuninnPageCursor.pin(MuninnPageCursor.java:157) 
at org.neo4j.io.pagecache.impl.muninn.MuninnWritePageCursor.next(MuninnWritePageCursor.java:58) 
at org.neo4j.kernel.impl.store.PropertyStore.updateRecord(PropertyStore.java:144) 
at org.neo4j.kernel.impl.transaction.command.NeoStoreTransactionApplier.visitPropertyCommand(NeoStoreTransactionApplier.java:99) 
at org.neo4j.kernel.impl.api.CommandApplierFacade.visitPropertyCommand(CommandApplierFacade.java:120) 
at org.neo4j.kernel.impl.transaction.command.Command$PropertyCommand.handle(Command.java:288) 
at org.neo4j.kernel.impl.api.CommandApplierFacade.visit(CommandApplierFacade.java:82) 
at org.neo4j.kernel.impl.api.CommandApplierFacade.visit(CommandApplierFacade.java:45) 
at org.neo4j.kernel.impl.transaction.log.PhysicalTransactionRepresentation.accept(PhysicalTransactionRepresentation.java:69) 
at org.neo4j.kernel.impl.api.TransactionRepresentationStoreApplier.apply(TransactionRepresentationStoreApplier.java:111) 
at org.neo4j.kernel.impl.api.TransactionRepresentationCommitProcess.applyToStore(TransactionRepresentationCommitProcess.java:100) 
... 5 more 

答えて

0

同じコードを別のシステムで実行しようとすると、問題がヒープスペースエラーであることがわかります。 3GBのRAMを搭載したシステムでコードを実行していましたが、上記のエラーが発生しましたが、12GBのRAMを搭載したシステムで正常に動作します。 (私も8GBのRAMでそれは問題がないと思う)

1

あなたはすべて1Kトランザクションをコミットする必要があります。例えば、https://github.com/graphaware/neo4j-framework/tree/master/tx-executor#batch-transactional-operations

+0

私は少し混乱しています。私は自分のコードにあるif(j> 0 && j%10000 == 0)という文が、正確なことを行い、作成された10kの関係毎にトランザクションをコミットすると思います。 – lostromos

+0

ええ、申し訳ありません。 1000に変更してみてください。また、それが役に立たない場合は、YourKitプロファイラーのようなものを使って実際に何がメモリを占有しているかを見てみましょう。 –

関連する問題