2016-05-07 4 views
3

Ich versuche, 16807 Knoten mit 17,210.368 Beziehungen in einem Diagramm in Neo4j zu laden. Dazu lade ich eine Datei mit einer vincinity-Tabelle und erhalte eine Liste mit den Knoten, die mit einer Beziehung verbunden sein müssen.Neo4j Eingebettete Java - Transaktion wurde als erfolgreich markiert, konnte aber keine Transaktion rückgängig machen, also Rollback

unter meinem Code finden:

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

Wenn ich diesen Code ausführen es wirft mich der folgende Fehler. Ich benutze Neo4j 2.3.3 und Netbeans 8.1 mit Java 8. Ich möchte verstehen, ob das Problem der Heap-Speicher ist oder wenn es versucht, die Transaktion zu committen. Ich habe auch die Befehlszeilenoption -Xmx1g in meinem Projekt hinzugefügt, um den Heap-Speicher zu vergrößern.

Irgendwelche Ideen?

Suche Fehlermeldungen unter:

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 

Antwort

0

Wie ich realisiere, indem ich versuche, den gleichen Code in einem anderen System auszuführen, verstehe ich, dass das Problem der Heap-Speicherfehler war. Ich habe den Code in meinem System mit 3GB RAM ausgeführt und es erscheint der obige Fehler, aber wenn ich es in einem System mit 12GB RAM laufen lasse, läuft es normal. (Ich nehme an mit sogar 8GB RAM wird es kein Problem haben)

1

sollten Sie die Transaktionen verpflichten alle 1k - 10k Elemente alle Daten auf dem Heap zu vermeiden halten. Siehe zum Beispiel https://github.com/graphaware/neo4j-framework/tree/master/tx-executor#batch-transactional-operations

+0

Ich bin ein wenig verwirrt. Ich denke, dass die Aussage 'if (j> 0 && j% 10000 == 0)', die ich in meinem Code habe, genau diese Sache macht, die Transaktion alle 10k Beziehungen, die erstellt wurden, festlegt. – lostromos

+0

ja, tut mir leid. Könnten Sie versuchen, es auf 1000 zu ändern? Wenn das nicht hilft, wie wäre es dann mit etwas wie YourKit Profiler zu sehen, was tatsächlich den Speicher beansprucht? –

Verwandte Themen