2010-05-28 12 views
9

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!

+0

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

Odpowiedz

6

Jest to problem konfiguracyjny w systemie Windows, w którym Neo4j nie może używać buforów odwzorowanych w pamięci. Zamiast tego tworzony jest bufor Java na sterty. W wersji 1.0 ten bufor miał domyślnie 470 MB, czyli więcej niż domyślna stuła dla maszyny JVM Windows. Masz dwie opcje:

  1. Przełącz do Ap 1,1-SNAPSHOT zamiast 1,0 w Twojej pom.xml który ma autokonfiguracji przypisywanie max 50% dostępnej sterty JVM do Neo4j

  2. Regulacja JVM stertę na więcej (np. 512 MB) przez uruchomienie Java z

    java -Xmx512m ....

    Można nawet wstawić że pod argumentów JVM w okresie konfiguracje w Eclipse

Daj nam znać, jeśli to pomoże!

Również wykonanie pełnej transakcji dla każdej pary węzłów zajmie dużo czasu. Spróbuj otworzyć transakcję w pierwszej pętli i czy zatwierdzasz tylko co 1000 węzłów?

/peter

+0

Pliki APOC 1.1-SNAPSHOT znajdują się tutaj (http://m2.neo4j.org/org/neo4j/examples/neo4j-apoc-examples/1.1-SNAPSHOT/) jeśli nie korzystasz z Mavena (po prostu zaktualizuj twój pom.xml). – nawroth

+0

Doskonale! Próbowałem argument -Xmx512m i teraz działa dobrze;) Dziękuję! – Edward83

+0

Miło, miło, że mogłem pomóc! –