Question

Ceci est mon code source de Main.java. Il a été saisi d'exemples Neo4j-APOC-1.0. L'objectif de la modification pour stocker les enregistrements 1M de 2 noeuds et 1 relation:

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

Après quelques itérations (environ 150K) je suis arrivé message d'erreur:

"java.lang.OutOfMemoryError: espace tas 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)         à org.neo4j.kernel.EmbeddedGraphDbImpl $ TransactionImpl.finish (EmbeddedGraphDbImpl.java:329)         à javaapplication2.Main.main (Main.java:62) 28.05.2010 09:52:14 org.neo4j.kernel.impl.nioneo.store.PersistenceWindowPool logWarn MISE EN GARDE: [Neo4j magasin-1M \ neostore.propertystore.db.strings] Impossible d'allouer tampon directe "

Les gars! Aidez-moi plzzz, ce que je fait de mal, comment puis-je réparer? Testé sur la plate-forme 32 bits Windows XP SP3. Peut-être la solution au sein de la configuration personnalisée de création?

thnx 4 tous les conseils!

Était-ce utile?

La solution

est un problème de configuration sous Windows, où Neo4j ne peut pas utiliser des tampons de mémoire mappées. Au lieu de cela, un Java tampon sur le tas est créé. Dans ce tampon 1.0 est par défaut 470 Mo, ce qui est plus que le tas par défaut de la machine virtuelle Java de Windows. Vous avez deux options:

  1. Commutateur à APOC 1,1-SNAPSHOT au lieu de 1,0 dans le pom.xml qui a une autoconfiguration, en attribuant 50% maximum du segment JVM à la disposition de Neo4j

  2. Ajuster le tas JVM à plusieurs (par exemple 512Mb) en exécutant Java avec

    java -Xmx512m ....

    Vous pouvez même insérer que dans les arguments JVM dans les configurations Run dans Eclipse

Faites-nous savoir si cela aide!

En outre, faire une transaction complète pour chaque paire de nœuds va prendre beaucoup de temps. Essayez d'ouvrir une transaction dans la première boucle et faire engage que toutes les 1000 paires de noeuds?

/ peter

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top