Neo4j OutOfMemory проблема - PullRequest
9 голосов
/ 28 мая 2010

Это мой исходный код Main.java. Он был взят из примеров neo4j-apoc-1.0. Цель модификации для хранения 1М записей 2 узлов и 1 отношения:

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

После нескольких итераций (около 150К) я получил сообщение об ошибке:

"java.lang.OutOfMemoryError: пространство кучи Java в 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:534) в org.neo4j.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.java:240) в org.neo4j.kernel.impl.nioneo.store.PropertyStore.updateRecord (PropertyStore.java:209) в org.neo4j.kernel.impl.nioneo.xa.Command $ PropertyCommand.execute (Command.java:513) в 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.XaResourceManager.commit (XaResourceManager.java:399) в org.neo4j.kernel.impl.transaction.xaframework.XaResourceHelpImpl.commit (XaResourceHelpImpl.java:64) в org.neo4j.kernel.impl.transaction.TransactionImpl.doCommit (TransactionImpl.java:514) в org.neo4j.kernel.impl.transaction.TxManager.commit (TxManager.java:571) в org.neo4j.kernel.impl.transaction.TxManager.commit (TxManager.java:543) на org.neo4j.kernel.impl.transaction.TransactionImpl.commit (TransactionImpl.java:102) at org.neo4j.kernel.EmbeddedGraphDbImpl $ TransactionImpl.finish (EmbeddedGraphDbImpl.java:329) в 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] Невозможно выделить прямой буфер "

Ребята! Помогите мне плззз, что я сделал не так, как мне починить? Проверено на платформе Windows XP 32bit SP3. Может быть, решение в рамках создания пользовательской конфигурации?

Thnx 4 каждый совет!

1 Ответ

6 голосов
/ 28 мая 2010

это проблема конфигурации в Windows, где Neo4j не может использовать буферы с отображением памяти. Вместо этого создается Java-буфер в куче. В 1.0 этот буфер составлял 470 МБ по умолчанию, что больше, чем куча по умолчанию для JVM Windows. У вас есть два варианта:

  1. Переключитесь на APOC 1.1-SNAPSHOT вместо 1.0 в файле pom.xml, который имеет автоконфигурацию, назначив максимум 50% доступной кучи JVM для Neo4j

  2. Настройте кучу JVM на большее (например, 512 МБ), запустив Java с

    java -Xmx512m ....

    Вы даже можете вставить это под аргументами JVM в конфигурациях запуска в Eclipse

Дайте нам знать, если это поможет!

Кроме того, выполнение полной транзакции для каждой пары узлов займет много времени. Попробуйте открыть транзакцию в первом цикле и фиксирует только каждые 1000 пар узлов?

/ * питер 1021 *

...