2010-05-28 25 views
9

Đây là mã nguồn của Main.java. Nó được lấy từ ví dụ neo4j-apoc-1.0. Mục tiêu của điều chỉnh để lưu trữ hồ sơ 1M 2 nút và 1 mối quan hệ: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(); 
      } 
     }); 
    } 
} 

Sau một vài lần lặp (khoảng 150K) Tôi đã nhận thông báo lỗi:

"java.lang.OutOfMemoryError: Java không gian đống tại java.nio.HeapByteBuffer. (HeapByteBuffer.java:39) tại java.nio.ByteBuffer.allocate (ByteBuffer.java:312) tại org.neo4j.kernel.impl.nioneo.store.PlainPersistenceWindow. (PlainPersistenceWindow.java : 30) tại org.neo4j.kernel.impl.nioneo.store.PersistenceWindowPool.allocateNewWindow (PersistenceWindowPool.java WEBC34) tại org.ne o4j.kernel.impl.nioneo.store.PersistenceWindowPool.refreshBricks (PersistenceWindowPool.java:430) tại org.neo4j.kernel.impl.nioneo.store.PersistenceWindowPool.acquire (PersistenceWindowPool.java:122) tại org.neo4j. kernel.impl.nioneo.store.CommonAbstractStore.acquireWindow (CommonAbstractStore.java:459) tại org.neo4j.kernel.impl.nioneo.store.AbstractDynamicStore.updateRecord (AbstractDynamicStore.java:240) tại org.neo4j.kernel. impl.nioneo.store.PropertyStore.updateRecord (PropertyStore.java:209) tại org.neo4j.kernel.impl.nioneo.xa.Command $ PropertyCommand.execute (Command.java WEBC13) tại org.neo4j.kernel. impl.nioneo.xa.NeoTransaction.doCommit (NeoTransaction.java:443) tại org.neo4j.kernel.impl.transaction.xaframework.XaTransaction.commit (XaTransaction.java:316) tại org.neo4j.kernel.impl.transaction.xaframework.XaResourceManager.commit (XaResourceManager.java:399) tại org.neo4j.kernel.impl.transaction.xaframework.XaResourceHelpImpl.commit (XaResourceHelpImpl.java:64) tại org.neo4j.kernel.impl.transaction.TransactionImpl.doCommit (TransactionImpl.java WEBC14) tại org.neo4j.kernel.impl.transaction.TxManager.commit (TxManager.java WEBC71) tại org.neo4j.kernel. impl.transaction.TxManager.commit (TxManager.java WEBC43) tại org.neo4j.kernel.impl.transaction.TransactionImpl.commit (TransactionImpl.java:102) tại org.neo4j.kernel.EmbeddedGraphDbImpl $ TransactionImpl.finish (EmbeddedGraphDbImpl.java:329) tại javaapplication2.Main.main (Main.java:62) 28.05.2010 9:52:14 org.neo4j.kernel.impl .nioneo.store.PersistenceWindowPool logWarn CẢNH BÁO: [neo4j-store-1M \ neostore.propertystore.db.strings] Không thể cấp phát bộ đệm trực tiếp "

Guys! Giúp tôi plzzz, những gì tôi đã làm sai, làm thế nào tôi có thể sửa chữa nó? Thử nghiệm trên nền tảng Windows XP 32bit SP3. Có thể giải pháp trong cấu hình tùy chỉnh tạo?

thnx 4 mọi lời khuyên!

+0

Để bắt đầu, di chuyển giao dịch đến vòng ngoài cải thiện tốc độ rất nhiều. Sau đó có [batch inserter] (http://wiki.neo4j.org/content/Batch_Insert). Có một số [thiết lập cấu hình] (http://wiki.neo4j.org/content/Configuration_Settings) bạn có thể áp dụng. Tuy nhiên, tôi không biết những gì gây ra lỗi trong trường hợp này (nhưng có vẻ như liên quan đến Windows, không thể xác nhận nó bằng cách sử dụng Linux). – nawroth

Trả lời

6

đây là sự cố cấu hình trên Windows, nơi Neo4j không thể sử dụng bộ đệm được ánh xạ bộ nhớ. Thay vào đó, một bộ đệm Java trên heap được tạo ra. Trong 1.0 bộ đệm này là 470MB cho mỗi mặc định, mà là nhiều hơn heap mặc định cho Windows JVM. Bạn có hai lựa chọn:

  1. Đổi thành APOC 1.1-SNAPSHOT thay vì 1,0 trong pom.xml của bạn trong đó có một cấu hình tự động, gán tối đa 50% của heap JVM có sẵn để Neo4j

  2. Điều chỉnh JVM heap đến nhiều hơn (ví dụ: 512Mb) bằng cách chạy Java với

    java -Xmx512m ....

    Bạn thậm chí có thể chèn rằng dưới đối số JVM trong Run Configurations trong Eclipse

Cho chúng tôi biết nếu điều này giúp!

Ngoài ra, thực hiện giao dịch đầy đủ cho mỗi cặp nút sẽ mất nhiều thời gian. Thử mở một giao dịch trong vòng lặp đầu tiên và chỉ cam kết mỗi 1000 cặp nút?

/peter

+0

Tải xuống APOC 1.1-SNAPSHOT được đặt tại đây (http://m2.neo4j.org/org/neo4j/examples/neo4j-apoc-examples/1.1-SNAPSHOT/) nếu bạn không sử dụng Maven (sau đó chỉ cần cập nhật pom.xml của bạn). – nawroth

+0

Tuyệt vời! Tôi đã thử đối số -Xmx512m và nó hoạt động tốt 4 bây giờ;) Cảm ơn bạn! – Edward83

+0

Rất vui khi được giúp đỡ! –