Frage

Dies ist mein Quellcode Main.java. Es wurde von Neo4j-apoc-1.0 Beispielen packt. Das Ziel der Änderung zu speichern 1M Datensätze von 2 Knoten und 1-Beziehung:

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

Nach einigen Wiederholungen (etwa 150K) Ich habe Fehlermeldung:

"java.lang.OutOfMemoryError: Java Heap-Speicher bei java.nio.HeapByteBuffer. (HeapByteBuffer.java:39) bei java.nio.ByteBuffer.allocate (ByteBuffer.java:312) bei org.neo4j.kernel.impl.nioneo.store.PlainPersistenceWindow. (PlainPersistenceWindow.java:30) bei org.neo4j.kernel.impl.nioneo.store.PersistenceWindowPool.allocateNewWindow (PersistenceWindowPool.java:534) bei org.neo4j.kernel.impl.nioneo.store.PersistenceWindowPool.refreshBricks (PersistenceWindowPool.java:430) bei org.neo4j.kernel.impl.nioneo.store.PersistenceWindowPool.acquire (PersistenceWindowPool.java:122) bei org.neo4j.kernel.impl.nioneo.store.CommonAbstractStore.acquireWindow (CommonAbstractStore.java:459) bei org.neo4j.kernel.impl.nioneo.store.AbstractDynamicStore.updateRecord (AbstractDynamicStore.java:240) bei org.neo4j.kernel.impl.nioneo.store.PropertyStore.updateRecord (PropertyStore.java:209) bei org.neo4j.kernel.impl.nioneo.xa.Command $ PropertyCommand.execute (Command.java:513) bei org.neo4j.kernel.impl.nioneo.xa.NeoTransaction.doCommit (NeoTransaction.java:443) bei org.neo4j.kernel.impl.transaction.xaframework.XaTransaction.commit (XaTransaction.java:316) bei org.neo4j.kernel.impl.transaction.xaframework.XaResourceManager.commit (XaResourceManager.java:399) bei org.neo4j.kernel.impl.transaction.xaframework.XaResourceHelpImpl.commit (XaResourceHelpImpl.java:64) bei org.neo4j.kernel.impl.transaction.TransactionImpl.doCommit (TransactionImpl.java:514) bei org.neo4j.kernel.impl.transaction.TxManager.commit (TxManager.java:571) bei org.neo4j.kernel.impl.transaction.TxManager.commit (TxManager.java:543) bei org.neo4j.kernel.impl.transaction.TransactionImpl.commit (TransactionImpl.java:102) bei org.neo4j.kernel.EmbeddedGraphDbImpl $ TransactionImpl.finish (EmbeddedGraphDbImpl.java:329) bei javaapplication2.Main.main (Main.java:62) 28.05.2010 09.52.14 org.neo4j.kernel.impl.nioneo.store.PersistenceWindowPool logWarn ACHTUNG: [Neo4j-store-1M \ neostore.propertystore.db.strings] Kann nicht direkt Puffer "

zuzuteilen

Guys! Helfen Sie mir plzzz, was ich falsch gemacht habe, wie kann ich es reparieren? Getestet auf der Plattform Windows XP 32bit SP3. Vielleicht Lösung innerhalb der Schöpfung benutzerdefinierte Konfiguration?

thnx 4 jede Beratung!

War es hilfreich?

Lösung

Dies ist ein Konfigurationsproblem auf Windows, wo Neo4j nicht im Speicher abgebildeten Puffer verwenden kann. Stattdessen wird ein Java-Puffer auf dem Heap erstellt. In 1.0 wurde dieser Puffer 470 MB pro Standard, der mehr als der Standard-Heap für den Windows-JVM ist. Sie haben zwei Möglichkeiten:

  1. Zum APOC 1.1-SNAPSHOT statt 1,0 in Ihrem pom.xml, die eine Autokonfiguration hat, maximal 50% des verfügbaren JVM Heap Neo4j Zuordnung

  2. Stellen Sie den JVM-Heap zu mehr (z 512Mb) von Java ausgeführt werden mit

    java -Xmx512m ....

    Sie können sogar einsetzen, dass unter JVM-Argumente in den Run-Konfigurationen in Eclipse

Lassen Sie uns wissen, ob das hilft!

Auch für jedes Knotenpaar eine vollständige Transaktion tun wird eine lange Zeit in Anspruch nehmen. Versuchen Sie, eine Transaktion in der ersten Schleife zu öffnen und tun Commits nur alle 1000 Knotenpaare?

/ Peter

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top