Edw*_*d83 9 java windows heap out-of-memory neo4j
这是我的Main.java源代码.它是从neo4j-apoc-1.0示例中获取的.修改存储2个节点和1个关系的1M记录的目标:
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();
}
} );
}
}
Run Code Online (Sandbox Code Playgroud)
经过几次迭代(大约150K)后,我收到错误消息:
"java.lang.OutOfMemoryError:java.nio.HeapByteBuffer上的Java堆空间.(HeapByteBuffer.java:39),位于org.neo4j.kernel.impl.nioneo的java.nio.ByteBuffer.allocate(ByteBuffer.java:312). store.PlainPersistenceWindow.(PlainPersistenceWindow.java:30)org.neo4j.kernel.impl.nioneo.store.PersistenceWindowPool.allocateNewWindow(PersistenceWindowPool.java:534)at org.neo4j.kernel.impl.nioneo.store.PersistenceWindowPool.refreshBricks (PersistenceWindowPool.java:430)org.neo4j.kernel.impl.nioneo.store.PersistenceWindowPool.acquire(PersistenceWindowPool.java:122)at org.neo4j.kernel.impl.nioneo.store.CommonAbstractStore.acquireWindow(CommonAbstractStore.java) :459)在org.neo4j的org.neo4j.kernel.impl.nioneo.store.AbstractDynamicStore.updateRecord(AbstractDynamicStore.java:240).在org.neo4j.kernel的org.neo4j.kernel.impl.nioneo.xa.Command $ PropertyCommand.execute(Command.java:513)中的kernel.impl.nioneo.store.PropertyStore.updateRecord(PropertyStore.java:209).来自org.neo4j.kernel.impl.transaction的org.neo4j.kernel.impl.transaction.xaframework.XaTransaction.commit(XaTransaction.java:316)中的impl.nioneo.xa.NeoTransaction.doCommit(NeoTransaction.java:443).位于org.neo4j.kernel.impl.transaction.TransactionImpl.doCommit的org.neo4j.kernel.impl.transaction.xaframework.XaResourceHelpImpl.commit(XaResourceHelpImpl.java:64)的xaframework.XaResourceManager.commit(XaResourceManager.java:399) TransactionImpl.java:514)org.neo4j.kernel.impl.transaction.TxManager.commit(TxManager.java:571)atg.neo4j.kernel.impl.transaction.TxManager.commit(TxManager.java:543)at org .位于javaapplication2.Main.main(Main.java:62)的org.neo4j.kernel.EmbeddedGraphDbImpl $ TransactionImpl.finish(EmbeddedGraphDbImpl.java:329)中的neo4j.kernel.impl.transaction.TransactionImpl.commit(TransactionImpl.java:102) 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每个建议!
这是Windows上的配置问题,Neo4j无法使用内存映射缓冲区.而是创建堆上的Java缓冲区.在1.0中,此缓冲区默认为470MB,大于Windows JVM的默认堆.您有两种选择:
在具有自动配置的pom.xml中切换到APOC 1.1-SNAPSHOT而不是1.0,将最多50%的可用JVM堆分配给Neo4j
通过运行Java,将JVM堆调整为更多(例如512Mb)
java -Xmx512m ....
您甚至可以在Eclipse的Run Configurations中的JVM参数下插入它
如果这有帮助,请告诉我们!
此外,为每个节点对执行完整事务将花费很长时间.尝试在第一个循环中打开一个事务,并且只提交每1000个节点对吗?
/彼得