2010-05-28 73 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堆空間 在java.nio.HeapByteBuffer。(HeapByteBuffer.java:39) at java.nio.ByteBuffer.allocate(ByteBuffer.java:312) at org.neo4j.kernel.impl.nioneo.store.PlainPersistenceWindow。(PlainPersistenceWindow.java :30) at 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) at 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) at org.neo4j.kernel.impl.transaction.xaframework.XaResourceManager.commit(XaResourceManager.java:399) at org.neo4j.kernel.impl.transaction.xaframework.XaResourceHelpImpl.commit(XaResourceHelpImpl.java:64) at 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。 (org.neo4j.kernel.impl.transaction.TransactionImpl.commit)(TransactionImpl.java:102) at org.neo4j.kernel.EmbeddedGraphDbImpl $ TransactionImpl.finish(TransactionManager.java:543) EmbeddedGraphDbImpl.java:329) at javaapplication2.Main.main(Main.java:62) 28.05.2010 9:52:14 org.neo4j.kernel.impl .nioneo.store.PersistenceWindowPool logWarn 警告:[neo4j-store-1M \ neostore.propertystore.db.strings]無法分配直接緩衝區「

夥計們!幫助我plzzz,我做錯了什麼,我該如何修復它?在平臺Windows XP 32bit SP3上測試。也許解決方案創建自定義配置?

thnx 4 every advice!

+0

首先,將事務移動到外循環可以提高速度。然後是[批量插入器](http://wiki.neo4j.org/content/Batch_Insert)。有一些[配置設置](http://wiki.neo4j.org/content/Configuration_Settings)可以應用。不過,我不知道在這種情況下導致錯誤的原因是什麼(但似乎與Windows相關,無法使用Linux進行確認)。 – nawroth 2010-05-28 08:59:38

回答

6

這是Windows上的配置問題,其中Neo4j不能使用內存映射緩衝區。相反,會創建堆上的Java緩衝區。在1.0中,這個緩衝區默認爲470MB,這比Windows JVM的缺省堆大。你有兩個選擇:

  1. 切換到APOC 1.1快照,而不是在你的pom.xml它具有自動配置1.0,分配可用的JVM堆的最高50%的Neo4j

  2. 調整JVM通過運行Java與更多(例如512Mb)

    java -Xmx512m ....

    你甚至可以插入下的運行配置JVM參數在Eclipse

讓我們知道,如果這有助於!

此外,爲每個節點對執行完整事務將需要很長時間。嘗試在第一個循環中打開一個事務,並且只提交每1000個節點對?

/peter

+0

APOC 1.1-SNAPSHOT下載位於[此處](http://m2.neo4j.org/org/neo4j/examples/neo4j-apoc-examples/1.1-SNAPSHOT/)如果您不使用Maven(然後只是更新你的pom.xml)。 – nawroth 2010-05-28 10:03:02

+0

非常好!我試過-Xmx512m的參數,它現在正常工作4); 謝謝! – Edward83 2010-05-28 10:06:26

+0

不錯,很高興能夠幫助! – 2010-05-31 09:46:56