Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/neo4j/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/wix/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java Neo4j在创建节点/关系时内存不足_Java_Neo4j_Out Of Memory - Fatal编程技术网

Java Neo4j在创建节点/关系时内存不足

Java Neo4j在创建节点/关系时内存不足,java,neo4j,out-of-memory,Java,Neo4j,Out Of Memory,我一直在研究Neo4j的一个生物信息学问题。我创建了大约20000个节点。这些节点 应分别与大约100个节点相关 我想将Java核心API与嵌入式Neo4j数据库一起使用,如[Java教程]中所述 () 在添加派生节点和关系之前,我必须首先查询数据库以获取现有节点 我很快就消耗了过多的内存。我在这里附上一个使Neo4J崩溃的Java方法。 请告诉我如何解决这个内存问题。解决这种情况的最佳做法是什么 我附加内存使用图(来自VisualVM的快照)来说明内存使用情况 配置: Platform :

我一直在研究Neo4j的一个生物信息学问题。我创建了大约20000个节点。这些节点 应分别与大约100个节点相关

我想将Java核心API与嵌入式Neo4j数据库一起使用,如[Java教程]中所述 ()

在添加派生节点和关系之前,我必须首先查询数据库以获取现有节点

我很快就消耗了过多的内存。我在这里附上一个使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();
    }

请注意,在Windows平台上,映射的_内存是JVM堆的一部分。您总共为映射内存分配了700M,最大堆大小为1G,剩下的内存会更少


要么增加最大堆,要么缩小映射内存。

我遇到了一个运行很长事务的程序的类似问题

我的程序基本上是逐行解析一个大的CSV文件,并为它解析的每一行注入节点和关系。这个大while循环包含在一个事务块中

我的内存泄漏和你描述的一样

但我发现,在VisualVM中,当while循环结束时,内存堆的大小大幅下降。所以我想知道:“在while循环中永久存在的对象是什么?”答案是事务对象

因此,我修补了我的程序,为文件解析循环的每次迭代创建一个事务,虽然这降低了解析的性能,但解决了内存泄漏问题,在运行一些迭代后,堆大小现在是稳定的

我希望这有帮助


如果Neo4j专家能够解释一下事务泄漏的原因,那将非常感谢。

上面的代码存在更大的问题

结果=engine.execute(查询)

本身应该在事务中,至少在概念上是这样。它返回一个延迟计算的迭代器,对该迭代器的每次调用都需要在它返回的节点上有一个读锁。因此,您实际上是在尝试将作为一个打开事务的结果的节点传递给编辑它们的第二个事务

假设在代码的中间,在生成迭代器之后,我做了一个第三个事务,删除了所有的节点,然后会发生什么?

本质上,您不应该试图将节点对象从一个事务传递到另一个事务。Neo4j是一个服务器,不能假设在您的事务关闭后,但在您的第二个事务打开之前,没有其他用户会编辑这些用户

我怀疑在服务器端,大量的死锁解决例程正在启动,以处理在同一个节点对象上有多个打开的事务的事实,其中至少有一个是写事务。这可能是造成您感知泄漏的原因


尝试将执行引擎代码放入事务中,然后在单个事务中对循环进行迭代。在一个事务中创建几千个实体是完全正确的,并且具有最小的堆空间开销。

切换到另一个选项卡,检查打开了多少ExecutionResult,消耗了多少JVM使用的内存,所有JDBC对象都缺少close(),否则它们将永远留在那里,只是JVM内存库中增加了!抱歉,但您如何查看ExecutionResult实例号(Sampler>Memory?我只找到org.neo4j.cypher.internal.complier.v2_1.PipeExecutionResult:最多796个实例)。我不使用JDBC(来自neo4j JDBC项目),因为我使用嵌入式数据库IMHO…使用嵌入式数据库时相关吗?每个事务的内容都完全保存在内存中,直到事务关闭,因为在事务成功提交之前无法将其放在磁盘上。这将在两个打开的事务以不同方式打开节点时启用回滚和解析。
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)