2010-05-28 18 views
9

यह मेरा स्रोत कोड Main.java है। यह neo4j-apoc-1.0 उदाहरणों से पकड़ा गया था। संशोधन के लक्ष्य को 2 नोड्स के 1M रिकॉर्ड और 1 संबंध स्टोर करने के लिए:Neo4j OutOfMemory समस्या

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

कुछ पुनरावृत्तियों के बाद (150K के आसपास) मैं त्रुटि संदेश मिला:

"java.lang.OutOfMemoryError: जावा ढेर अंतरिक्ष java.nio.HeapByteBuffer पर। (HeapByteBuffer.java:39) java.nio.ByteBuffer.allocate (ByteBuffer.java:312) org.neo4j.kernel.impl.nioneo.store.PlainPersistenceWindow पर। (PlainPersistenceWindow.java : 30) org.neo4j.kernel.impl.nioneo.store.PersistenceWindowPool.allocateNewWindow (PersistenceWindowPool.java:5234) org.ne पर o4j.kernel.impl.nioneo.store.PersistenceWindowPool.refreshBricks (PersistenceWindowPool.java:430) org.neo4j.kernel.impl.nioneo.store.PersistenceWindowPool.acquire (PersistenceWindowPool.java:122) पर org.neo4j पर । kernel.impl.nioneo.store.CommonAbstractStore.acquireWindow (CommonAbstractStore.java:459) org.neo4j.kernel.impl.nioneo.store.AbstractDynamicStore.updateRecord (AbstractDynamicStore.java4040) org.neo4j. कर्नेल पर। impl.nioneo.store.PropertyStore.updateRecord (PropertyStore.java:209) org.neo4j.kernel.impl.nioneo.xa.Command $ PropertyCommand.execute (Command.java:5213) org.neo4j.kernel पर। impl.nioneo.xa.NeoTransaction.doCommit (NeoTransaction.java:443) org.neo4j.kernel.impl.transaction.xaframework.XaTransaction.commit (XaTransaction.java:316)org.neo4j.kernel.impl.transaction.xaframework.XaResourceHelpImpl.commit (XaResourceHelpImpl.java:64) पर org.neo4j.kernel.impl.transaction.xaframework.XaResourceManager.commit (XaResourceManager.java:399) परपर org.neo4j.kernel.impl.transaction.TransactionImpl.doCommit (TransactionImpl.javaoci14) org.neo4j.kernel.impl.transaction.TxManager.commit (TxManager.java:5271) org.neo4j.kernel पर। impl.transaction.TxManager.commit (TxManager.java:5243) org.neo4j.kernel.impl.transaction.TransactionImpl.commit (TransactionImpl.java:102) org.neo4j.kernel.EmbeddedGraphDbImpl $ TransactionImpl.finish (एम्बेडेड GraphDbImpl.java:329) javaapplication2.Main.main (Main.java:62) 28.05.2010 9:52:14 org.neo4j.kernel.impl .nioneo.store.PersistenceWindowPool logWarn चेतावनी: [neo4j-दुकान-1M \ neostore.propertystore.db.strings] प्रत्यक्ष बफर "

दोस्तों आवंटित करने में असमर्थ! मुझे मदद करें, मैंने क्या गलत किया, मैं इसे कैसे सुधार सकता हूं? मंच विंडोज एक्सपी 32 बिट एसपी 3 पर परीक्षण किया। सृजन कस्टम विन्यास के भीतर शायद समाधान?

thnx 4 प्रत्येक सलाह!

+0

आरंभ करने के लिए, बाहरी लूप में लेनदेन को स्थानांतरित करने से गति बहुत बढ़ जाती है। फिर वहां [बैच इंसर्टर] है (http://wiki.neo4j.org/content/Batch_Insert)। कुछ [कॉन्फ़िगरेशन सेटिंग्स] हैं (http://wiki.neo4j.org/content/Configuration_Settings) आप आवेदन कर सकते हैं। फिर भी, मुझे नहीं पता कि इस मामले में त्रुटि क्या हो रही है (लेकिन ऐसा लगता है कि विंडोज से संबंधित, लिनक्स का उपयोग करके इसकी पुष्टि नहीं कर सका)। – nawroth

उत्तर

6

यह विंडोज पर एक कॉन्फ़िगरेशन समस्या है, जहां Neo4j स्मृति मैप किए गए बफर का उपयोग नहीं कर सकता है। इसके बजाय, ढेर पर एक जावा बफर बनाया गया है। 1.0 में यह बफर प्रति डिफ़ॉल्ट 470 एमबी था, जो विंडोज जेवीएम के लिए डिफ़ॉल्ट ढेर से अधिक है। Neo4j को

  • JVM समायोजित

    1. स्विच APOC के बजाय 1.1-SNAPSHOT अपने pom.xml जो एक स्वचालित है में 1.0, बताए उपलब्ध JVM ढेर के अधिकतम 50%: आपके पास दो विकल्प

      जावा -Xmx512m के साथ जावा चलाकर अधिक (उदाहरण के लिए 512 एमबी) ढेर करें।

      तुम भी ग्रहण

    2. में

    हमें पता है कि अगर यह मदद करता है चलो सम्मिलित कर सकते हैं कि भागो विन्यास में JVM तर्क के तहत!

    इसके अलावा, प्रत्येक नोड जोड़ी के लिए पूर्ण लेनदेन करने में काफी समय लग रहा है। पहले लूप में लेनदेन खोलने का प्रयास करें और केवल हर 1000 नोड जोड़े करता है?

    /पीटर

  • +0

    एपीओसी 1.1-स्नैपशॉट डाउनलोड [यहां] हैं (http://m2.neo4j.org/org/neo4j/examples/neo4j-apoc-examples/1.1-SNAPSHOT/) यदि आप मेवेन का उपयोग नहीं कर रहे हैं (तो बस अपडेट करें आपका pom.xml)। – nawroth

    +0

    बढ़िया! मैंने कोशिश की-Xmx512m तर्क और यह अब ठीक काम करता है;) धन्यवाद! – Edward83

    +0

    अच्छा, मदद करने में सक्षम होने के लिए खुश! –