2010-05-28 16 views
9

Questo è il mio codice sorgente di Main.java. E 'stato afferrato da esempi neo4j-apoc-1.0. L'obiettivo della modifica per memorizzare record 1M di 2 nodi e 1 relazione: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(); 
      } 
     }); 
    } 
} 

Dopo poche iterazioni (circa 150K) ho ricevuto un messaggio di errore:

"java.lang.OutOfMemoryError: lo spazio di heap Java a java.nio.HeapByteBuffer. (HeapByteBuffer.java:39) a java.nio.ByteBuffer.allocate (ByteBuffer.java:312) a org.neo4j.kernel.impl.nioneo.store.PlainPersistenceWindow. (PlainPersistenceWindow.java : 30) presso org.neo4j.kernel.impl.nioneo.store.PersistenceWindowPool.allocateNewWindow (PersistenceWindowPool.java:534) presso org.ne o4j.kernel.impl.nioneo.store.PersistenceWindowPool.refreshBricks (PersistenceWindowPool.java:430) a org.neo4j.kernel.impl.nioneo.store.PersistenceWindowPool.acquire (PersistenceWindowPool.java:122) a org.neo4j. kernel.impl.nioneo.store.CommonAbstractStore.acquireWindow (CommonAbstractStore.java:459) in org.neo4j.kernel.impl.nioneo.store.AbstractDynamicStore.updateRecord (AbstractDynamicStore.java:240) presso org.neo4j.kernel. impl.nioneo.store.PropertyStore.updateRecord (PropertyStore.java:209) in org.neo4j.kernel.impl.nioneo.xa.Command $ PropertyCommand.execute (Command.java:513) in org.neo4j.kernel. impl.nioneo.xa.NeoTransaction.doCommit (NeoTransaction.java:443) presso org.neo4j.kernel.impl.transaction.xaframework.XaTransaction.commit (XaTransaction.java:316) in org.neo4j.kernel.impl.transaction.xaframework.XaResourceManager.commit (XaResourceManager.java:399) in org.neo4j.kernel.impl.transaction.xaframework.XaResourceHelpImpl.commit (XaResourceHelpImpl.java:64) in org.neo4j.kernel.impl.transaction.TransactionImpl.doCommit (TransactionImpl.java:514) in org.neo4j.kernel.impl.transaction.TxManager.commit (TxManager.java:571) in org.neo4j.kernel. impl.transaction.TxManager.commit (TxManager.java:543) presso org.neo4j.kernel.impl.transaction.TransactionImpl.commit (TransactionImpl.java:102) presso org.neo4j.kernel.EmbeddedGraphDbImpl $ TransactionImpl.finish (EmbeddedGraphDbImpl.java:329) all'indirizzo javaapplication2.Main.main (Main.java:62) 28.05.2010 9:52:14 org.neo4j.kernel.impl .nioneo.store.PersistenceWindowPool logWarn AVVERTENZA: [Neo4j-store-1M \ neostore.propertystore.db.strings] Impossibile allocare il buffer diretta"

Guys! Aiutami a plzzz, cosa ho fatto di sbagliato, come posso ripararlo? Testato su piattaforma Windows XP 32 bit SP3. Forse la soluzione nella configurazione personalizzata di creazione?

thnx 4 ogni consiglio!

+0

Per cominciare, spostare la transazione sul ciclo esterno migliora molto la velocità. Poi c'è il [di inserimento lotto] (http://wiki.neo4j.org/content/Batch_Insert). C'è un po '[impostazioni di configurazione] (http://wiki.neo4j.org/content/Configuration_Settings) si potrebbe applicare. Eppure, non so che cosa sta causando l'errore in questo caso (ma sembra di Windows-correlate, non ha potuto confermare utilizzando Linux). – nawroth

risposta

6

questo è un problema di configurazione su Windows, in cui Neo4j non può utilizzare i buffer mappati in memoria. Invece, viene creato un buffer Java sull'heap. In 1.0 questo buffer era 470 MB per impostazione predefinita, che è più dell'heap predefinito per Windows JVM. Sono disponibili due opzioni:

  1. Passa alla APOC 1.1-SNAPSHOT invece di 1,0 nel vostro pom.xml che ha una configurazione automatica, l'assegnazione di massimo il 50% del mucchio JVM a disposizione Neo4j

  2. Regolare la JVM heap a più (ad esempio 512 Mb) eseguendo Java con

    java -Xmx512m ....

    Si può anche inserire che in argomenti JVM nelle configurazioni Run in Eclipse

Fateci sapere se questo aiuta!

Inoltre, facendo una transazione completa per ogni coppia di nodi sta andando a prendere un lungo periodo di tempo. Prova ad aprire una transazione nel primo ciclo e commetti solo ogni 1000 coppie di nodi?

/peter

+0

APOC download 1.1-snapshot si trovano [qui] (http://m2.neo4j.org/org/neo4j/examples/neo4j-apoc-examples/1.1-SNAPSHOT/) se non si sta usando Maven (poi basta aggiornare il tuo pom.xml). – nawroth

+0

Eccellente! Ho provato argomento -Xmx512m e funziona benissimo 4 ora;) Grazie! – Edward83

+0

Nizza, felice di essere in grado di aiutare! –