Это - мой исходный код Main.java. Это было захвачено от neo4j-apoc-1.0 примеров. Цель модификации сохранить 1M записи 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();
}
} );
}
}
После нескольких повторений (вокруг 150K) я получил сообщение об ошибке:
"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 (Команда 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 (Основные java:62) 28.05.2010 9:52:14 org.neo4j.kernel.impl.nioneo.store. PersistenceWindowPool logWarn, ПРЕДУПРЕЖДАЮЩИЙ: [neo4j-store-1M\neostore.propertystore.db.strings], Не могущий выделить прямой буфер"
Парни! Помогите мне plzzz, что я сделал неправильно, как я могу восстановить его? Протестированный на платформе Windows XP 32bit SP3. Возможно, решение в пользовательской конфигурации создания?
спасибо 4 каждых совета!
это проблема конфигурации в Windows, где Neo4j не может использовать буферы, отображаемые на память. Вместо этого создается Java-буфер на куче. В версии 1.0 этот буфер по умолчанию был 470MB, что больше, чем куча по умолчанию для Windows JVM. У вас есть два варианта:
Переключиться на APOC 1.1-SNAPSHOT вместо 1.0 в вашем pom.xml, который имеет автоконфигурацию, назначая максимум 50% доступной кучи JVM для Neo4j
Настроить кучу JVM на большее значение (например, 512 Мб), запустив Java с
java -Xmx512m ....
Вы даже можете вставить это в аргументы JVM в конфигурациях запуска в Eclipse
Дайте нам знать, если это поможет!
Кроме того, выполнение полной транзакции для каждой пары узлов займет много времени. Попробуйте открыть транзакцию в первом цикле и делать коммиты только каждые 1000 пар узлов?
/peter