10

これは私のMain.javaのソースコードです。これは、neo4j-apoc-1.0の例から取得したものです。2つのノードと1つのリレーションの1Mレコードを保存するための変更の目標:

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ヒープスペース、org.neo4j.kernel.impl.nioneoのjava.nio.ByteBuffer.allocate(ByteBuffer.java:312)。 store.PlainPersistenceWindow。(PlainPersistenceWindow.java:30)at org.neo4j.kernel.impl.nioneo.store.PersistenceWindowPool.allocateNewWindow(PersistenceWindowPool.java:534)at org.neo4j.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)org.neo4j.kernel.impl.nioneo.store.AbstractDynamicStore.updateRecord(AbstractDynamicStore.java:240)atorg.neo4j。kernel.impl.nioneo.store.PropertyStore.updateRecord(PropertyStore.java:209)at org.neo4j.kernel.impl.nioneo.xa.Command $ PropertyCommand.execute(Command.java:513)atorg.neo4j.kernel。 org.neo4j.kernel.impl.transaction.xaframework.XaTransaction.commit(XaTransaction.java:316)のimpl.nioneo.xa.NeoTransaction.doCommit(NeoTransaction.java:443) 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.impl.transaction.TxManager.commit(TxManager.java:543)at org 。neo4j.kernel.impl.transaction.TransactionImpl.commit(TransactionImpl.java:102)at org.neo4j.kernel.EmbeddedGraphDbImpl $ TransactionImpl.finish(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を手伝ってください、私が間違ったことを、どうすればそれを修復できますか?プラットフォームWindowsXP32ビットSP3でテスト済み。たぶん、カスタム構成の作成内の解決策ですか?

thnx 4すべてのアドバイス!

4

1 に答える 1

6

これは、Neo4jがメモリマップドバッファを使用できないWindowsの構成の問題です。代わりに、ヒープ上にJavaバッファーが作成されます。1.0では、このバッファはデフォルトあたり470MBでした。これは、WindowsJVMのデフォルトのヒープよりも多くなっています。2つのオプションがあります。

  1. 自動構成があるpom.xmlで1.0ではなくAPOC1.1-SNAPSHOTに切り替え、使用可能なJVMヒープの最大50%をNeo4jに割り当てます

  2. Javaを実行して、JVMヒープをより多く(512Mbなど)に調整します。

    java-Xmx512m...。

    Eclipseの実行構成のJVM引数の下にそれを挿入することもできます

これが役立つかどうかお知らせください。

また、すべてのノードペアに対して完全なトランザクションを実行するには、長い時間がかかります。最初のループでトランザクションを開いてみて、1000ノードペアごとにのみコミットしますか?

/ peter

于 2010-05-28T09:49:51.387 に答える