【发布时间】:2014-07-02 10:51:39
【问题描述】:
我一直在研究 Neo4j 的生物信息学问题。我创建了大约 20000 个节点。这些节点 每个应该与大约 100 个节点相关。
我想将 Java 核心 API 与嵌入式 Neo4j 数据库一起使用,如 [Java 教程] 中所述 (http://docs.neo4j.org/chunked/milestone/tutorials-java-embedded-hello-world.html)
在添加派生节点和关系之前,我必须先查询数据库以获取现有节点。
我很快就遇到了过多的内存消耗。我在这里附上了一个使 Neo4J 崩溃的 Java 方法。 拜托,你能给我一个关于如何解决这个内存问题的提示吗?解决这种情况的最佳做法是什么?
我附上内存使用图(来自 VisualVM 的快照)来说明内存使用、、。
配置:
Platform : Windows-7 win32, java-1.7.0_51 (Program arguments -Xms512m -Xmx1024m)
neo4j.properties
use_memory_mapped_buffers=true
neostore.nodestore.db.mapped_memory=100M
neostore.relationshipstore.db.mapped_memory=150M
neostore.propertystore.db.mapped_memory=150M
neostore.propertystore.db.strings.mapped_memory=150M
neostore.propertystore.db.arrays.mapped_memory=150M
neo4j-wrapper.conf
wrapper.java.additional=-XX:+UseConcMarkSweepGC
wrapper.java.additional=-XX:+CMSClassUnloadingEnabled
wrapper.java.initmemory=512
wrapper.java.maxmemory=1024
提前致谢, 最好的问候
代码:值的限制不同,平均值应该在100左右。
static void stackoverflowNativeAPIMemoryIssue() {
String DB_PATH = "C:/neo4j/Neo4j-2.1.2/data/graph.db";
GraphDatabaseService db = new GraphDatabaseFactory()
.newEmbeddedDatabase(DB_PATH);
// *** query
String query = "match (n:ExistingNode) return n;";
ExecutionEngine engine = new ExecutionEngine(db);
ExecutionResult result;
Label labelFrom = DynamicLabel.label("From");
result = engine.execute(query);
Iterator<Node> n_column = result.columnAs("n");
Node nodeFrom = null;
Relationship relationship = null;
int count = 0;
int i = 0;
for (Node nodeTo : IteratorUtil.asIterable(n_column)) {
// loop which makes the code break!
//for (i = 0; i < 5; i++) {
try (Transaction tx = db.beginTx()) {
++count;
nodeFrom = db.createNode(labelFrom);
nodeFrom.setProperty("name", "name-" + count + "-" + i);
relationship = nodeFrom.createRelationshipTo(nodeTo,
Relation.MY_RELATION);
relationship.setProperty("name", "relation-" + count
+ "- " + i);
tx.success();
}
//}
}
db.shutdown();
}
无循环:程序一直运行到结束...
循环 5 -> 内存扩展,但进程正常终止。
循环 10 次 -> 内存不足 没有节点,也没有创建关系,尽管应该在每个节点上触发事务并创建关系。
Exception in thread "GC-Monitor" Exception in thread "main" java.lang.OutOfMemoryError:
Java heap space
at java.lang.AbstractStringBuilder.append(Unknown Source)
at java.lang.StringBuilder.append(Unknown Source)
at org.neo4j.kernel.impl.cache.MeasureDoNothing.run(MeasureDoNothing.java:84)
java.lang.OutOfMemoryError: Java heap space
at org.neo4j.kernel.impl.util.VersionedHashMap.put(VersionedHashMap.java:185)
at java.util.Collections$SetFromMap.add(Unknown Source)
at org.neo4j.kernel.impl.util.DiffSets.add(DiffSets.java:100)
at org.neo4j.kernel.impl.api.state.TxStateImpl.nodeDoCreate(TxStateImpl.java:363)
at org.neo4j.kernel.impl.api.StateHandlingStatementOperations.nodeCreate(StateHandlingStatementOperations.java:101)
at org.neo4j.kernel.impl.api.ConstraintEnforcingEntityOperations.nodeCreate(ConstraintEnforcingEntityOperations.java:390)
at org.neo4j.kernel.impl.api.LockingStatementOperations.nodeCreate(LockingStatementOperations.java:208)
at org.neo4j.kernel.impl.api.OperationsFacade.nodeCreate(OperationsFacade.java:500)
at org.neo4j.kernel.InternalAbstractGraphDatabase.createNode(InternalAbstractGraphDatabase.java:1125)
【问题讨论】:
-
切换到另一个选项卡并检查打开了多少 ExecutionResult,消耗了多少 JVM 使用的内存,您缺少所有 JDBC 对象的 close() ,否则它们将永远留在那里,只是增加JVM内存
-
谢谢!抱歉,您如何查看 ExecutionResult 实例编号(Sampler>Memory?我只找到 org.neo4j.cypher.internal.complier.v2_1.PipeExecutionResult :最多 796 个实例)。我不使用 JDBC(来自 neo4j-jdbc 项目),因为我使用嵌入式数据库恕我直言......
标签: java neo4j out-of-memory