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
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
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? –