這是我的Main.java的源代碼。它是從neo4j-apoc-1.0例子中抓取的。修改的目標存儲2個節點的1M記錄和1間的關係:Neo4j OutOfMemory問題
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) at java.nio.ByteBuffer.allocate(ByteBuffer.java:312) at org.neo4j.kernel.impl.nioneo.store.PlainPersistenceWindow。(PlainPersistenceWindow.java :30) at org.neo4j.kernel.impl.nioneo.store.PersistenceWindowPool.allocateNewWindow(PersistenceWindowPool.java:534) at org.ne o4j.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) at org.neo4j.kernel.impl.nioneo.store.AbstractDynamicStore.updateRecord(AbstractDynamicStore.java:240) at org.neo4j.kernel。 impl.nioneo.store.PropertyStore.updateRecord(PropertyStore.java:209) at org.neo4j.kernel.impl.nioneo.xa.Command $ PropertyCommand.execute(Command.java:513) at org.neo4j.kernel。 impl.nioneo.xa.NeoTransaction.doCommit(NeoTransaction.java:443) at org.neo4j.kernel.impl.transaction.xaframework.XaTransaction.commit(XaTransaction.java:316) at org.neo4j.kernel.impl.transaction.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。 (org.neo4j.kernel.impl.transaction.TransactionImpl.commit)(TransactionImpl.java:102) at org.neo4j.kernel.EmbeddedGraphDbImpl $ TransactionImpl.finish(TransactionManager.java:543) 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,我做錯了什麼,我該如何修復它?在平臺Windows XP 32bit SP3上測試。也許解決方案創建自定義配置?
thnx 4 every advice!
首先,將事務移動到外循環可以提高速度。然後是[批量插入器](http://wiki.neo4j.org/content/Batch_Insert)。有一些[配置設置](http://wiki.neo4j.org/content/Configuration_Settings)可以應用。不過,我不知道在這種情況下導致錯誤的原因是什麼(但似乎與Windows相關,無法使用Linux進行確認)。 – nawroth 2010-05-28 08:59:38