To jest mój kod źródłowy Main.java. Został złapany z przykładów neo4j-apoc-1.0. Celem modyfikacji do przechowywania 1M rekordy 2 węzły i 1 zależnością:Neo4j OutOfMemory problem
package javaapplication2;
import org.neo4j.graphdb.GraphDatabaseService;
import org.neo4j.graphdb.Node;
import org.neo4j.graphdb.RelationshipType;
import org.neo4j.graphdb.Transaction;
import org.neo4j.kernel.EmbeddedGraphDatabase;
public class Main
{
private static final String DB_PATH = "neo4j-store-1M";
private static final String NAME_KEY = "name";
private static enum ExampleRelationshipTypes implements RelationshipType
{
EXAMPLE
}
public static void main(String[] args)
{
GraphDatabaseService graphDb = null;
try
{
System.out.println("Init database...");
graphDb = new EmbeddedGraphDatabase(DB_PATH);
registerShutdownHook(graphDb);
System.out.println("Start of creating database...");
int valIndex = 0;
for(int i=0; i<1000; ++i)
{
for(int j=0; j<1000; ++j)
{
Transaction tx = graphDb.beginTx();
try
{
Node firstNode = graphDb.createNode();
firstNode.setProperty(NAME_KEY, "Hello" + valIndex);
Node secondNode = graphDb.createNode();
secondNode.setProperty(NAME_KEY, "World" + valIndex);
firstNode.createRelationshipTo(
secondNode, ExampleRelationshipTypes.EXAMPLE);
tx.success();
++valIndex;
}
finally
{
tx.finish();
}
}
}
System.out.println("Ok, client processing finished!");
}
finally
{
System.out.println("Shutting down database ...");
graphDb.shutdown();
}
}
private static void registerShutdownHook(final GraphDatabaseService graphDb)
{
// Registers a shutdown hook for the Neo4j instance so that it
// shuts down nicely when the VM exits (even if you "Ctrl-C" the
// running example before it's completed)
Runtime.getRuntime().addShutdownHook(new Thread()
{
@Override
public void run()
{
graphDb.shutdown();
}
});
}
}
po kilku iteracjach (około 150K) mam komunikat o błędzie:
„java.lang.OutOfMemoryError: przestrzeń sterty Java na java.nio.HeapByteBuffer. (HeapByteBuffer.java:39) na java.nio.ByteBuffer.allocate (ByteBuffer.java:312) na org.neo4j.kernel.impl.nioneo.store.PlainPersistenceWindow. (PlainPersistenceWindow.java : 30) w org.neo4j.kernel.impl.nioneo.store.PersistenceWindowPool.allocateNewWindow (PersistenceWindowPool.java:534) at org.ne o4j.kernel.impl.nioneo.store.PersistenceWindowPool.refreshBricks (PersistenceWindowPool.java:430) at org.neo4j.kernel.impl.nioneo.store.PersistenceWindowPool.acquire (PersistenceWindowPool.java:122) at org.neo4j. kernel.impl.nioneo.store.CommonAbstractStore.acquireWindow (CommonAbstractStore.java:459) at org.neo4j.kernel.impl.nioneo.store.AbstractDynamicStore.updateRecord (AbstractDynamicStore.java:240) at org.neo4j.kernel. impl.nioneo.store.PropertyStore.updateRecord (PropertyStore.java:209) na org.neo4j.kernel.impl.nioneo.xa.Command $ PropertyCommand.execute (Command.java:513) at org.neo4j.kernel. impl.nioneo.xa.NeoTransaction.doCommit (NeoTransaction.java:443) at org.neo4j.kernel.impl.transaction.xaframework.XaTransaction.commit (XaTransaction.java:316) w org.neo4j.kernel.impl.transaction.xaframework.XaResourceManager.commit (XaResourceManager.java:399) w org.neo4j.kernel.impl.transaction.xaframework.XaResourceHelpImpl.commit (XaResourceHelpImpl.java:64) w org.neo4j.kernel.impl.transaction.TransactionImpl.doCommit (TransactionImpl.java:514) at org.neo4j.kernel.impl.transaction.TxManager.commit (TxManager.java:571) at org.neo4j.kernel. impl.transaction.TxManager.commit (TxManager.java:543) na org.neo4j.kernel.impl.transaction.TransactionImpl.commit (TransactionImpl.java:102) na org.neo4j.kernel.EmbeddedGraphDbImpl $ TransactionImpl.finish (EmbeddedGraphDbImpl.java:329) na javaapplication2.Main.main (Main.java:62) 28.05.2010 9:52:14 org.neo4j.kernel.impl .nioneo.store.PersistenceWindowPool logWarn OSTRZEŻENIE: [neo4j-store-1M \ neostore.propertystore.db.strings] Nie można przydzielić bezpośredniego bufora "
Faceci! Pomóż mi plzzz, co zrobiłem źle, jak mogę to naprawić? Przetestowano na platformie Windows XP 32bit SP3. Może rozwiązanie w niestandardowej konfiguracji tworzenia?
thnx 4 każda rada!
Przede wszystkim przeniesienie transakcji do zewnętrznej pętli znacznie poprawia prędkość. Następnie jest [wstawianie wsadowe] (http://wiki.neo4j.org/content/Batch_Insert). Istnieje kilka [ustawień konfiguracyjnych] (http://wiki.neo4j.org/content/Configuration_Settings), które można zastosować. Nadal nie wiem, co powoduje błąd w tym przypadku (ale wydaje się, że związane z systemem Windows, nie można potwierdzić za pomocą systemu Linux). – nawroth