Neo4j的嵌入式2.2.1异常在线程“GC-Monitor的” java.lang.OutOfMemoryError:Java堆空间


0

我试图做我的批量插入到现有的数据库,但我得到了以下异常:

Exception in thread "GC-Monitor" java.lang.OutOfMemoryError: Java heap space at java.util.Arrays.copyOf(Arrays.java:2245) at java.util.Arrays.copyOf(Arrays.java:2219) at java.util.ArrayList.grow(ArrayList.java:242) at java.util.ArrayList.ensureExplicitCapacity(ArrayList.java:216) at java.util.ArrayList.ensureCapacityInternal(ArrayList.java:208) at java.util.ArrayList.add(ArrayList.java:440) at java.util.Formatter.parse(Formatter.java:2525) at java.util.Formatter.format(Formatter.java:2469) at java.util.Formatter.format(Formatter.java:2423) at java.lang.String.format(String.java:2792) at org.neo4j.kernel.impl.cache.MeasureDoNothing.run(MeasureDoNothing.java:64) Fail: Transaction was marked as successful, but unable to commit transaction so rolled back.

这里是我的插入代码的结构:

public void parseExecutionRecordFile(Node episodeVersionNode, String filePath, Integer insertionBatchSize) throws Exception { 
     Gson gson = new Gson(); 
     BufferedReader reader = new BufferedReader(new FileReader(filePath)); 
     String aDataRow = ""; 
     List<ExecutionRecord> executionRecords = new LinkedList<>(); 

     Integer numberOfProcessedExecutionRecords = 0; 
     Integer insertionCounter = 0; 
     ExecutionRecord lastProcessedExecutionRecord = null; 
     Node lastProcessedExecutionRecordNode = null; 

     Long start = System.nanoTime(); 
     while((aDataRow = reader.readLine()) != null) { 
      JsonReader jsonReader = new JsonReader(new StringReader(aDataRow)); 
      jsonReader.setLenient(true); 
      ExecutionRecord executionRecord = gson.fromJson(jsonReader, ExecutionRecord.class); 
      executionRecords.add(executionRecord); 

      insertionCounter++; 

      if(insertionCounter == insertionBatchSize || executionRecord.getType() == ExecutionRecord.Type.END_MESSAGE) { 
       lastProcessedExecutionRecordNode = appendEpisodeData(episodeVersionNode, lastProcessedExecutionRecordNode, executionRecords, lastProcessedExecutionRecord == null ? null : lastProcessedExecutionRecord.getTraceSequenceNumber()); 
       executionRecords = new LinkedList<>(); 
       lastProcessedExecutionRecord = executionRecord; 
       numberOfProcessedExecutionRecords += insertionCounter; 
       insertionCounter = 0; 
      } 
     } 
    } 

public Node appendEpisodeData(Node episodeVersionNode, Node previousExecutionRecordNode, List<ExecutionRecord> executionRecordList, Integer traceCounter) { 
     Iterator<ExecutionRecord> executionRecordIterator = executionRecordList.iterator(); 

     Node previousTraceNode = null; 
     Node currentTraceNode = null; 
     Node currentExecutionRecordNode = null; 

     try (Transaction tx = dbInstance.beginTx()) { 
      // some graph insertion 

      tx.success(); 
      return currentExecutionRecordNode; 
     } 
    } 

所以基本上,我从一个文件中(约20000个对象)读取JSON对象并将其插入到每10000条记录Neo4j的。如果我在文件中只有10,000个JSON对象,那么它工作正常。但是,当我有20,000时,它会抛出异常。

在此先感谢和任何帮助将非常感谢!

  0

你使用了多少堆? 06 8月. 152015-08-06 19:41:59

  0

您为这20k行插入了多少关系?您的批处理大小不在您的代码示例中。 06 8月. 152015-08-06 19:43:16

  0

嗨@MichaelHunger,我使用1024 Mb堆大小。实际上,这些10K记录的插入与插入其他类型的节点一起可以是10K的一半。有ca. 40K与10K记录的关系。所以总共:15K节点+ 40K关系。 我已经设法调整我的代码,并批量插入10K批处理大小的作品。但它不能超过10K。如果我将上述例外设置为20K,它会崩溃。 10 8月. 152015-08-10 15:25:47

  0

你也可以升级到2.2.4吗? 12 8月. 152015-08-12 15:01:12

2

如果10000个对象有效,只要至少重复堆内存。 看看以下站点:http://neo4j.com/docs/stable/server-performance.html

wrapper.java.maxmemory选项可以解决您的问题。


1

由于您还插入了几个k属性,所有tx状态将被保存在内存中。所以我认为10k批量大小对于堆的数量来说是很好的。

你也不关闭你的JSON阅读器,所以它可能在里面徘徊StringReader

您还应该使用以批量大小初始化的ArrayList,并使用list.clear()代替重新创建/重新分配。

  0

感谢迈克尔的回应。当我使用.clear()清除批处理列表时,即使我的10K批处理插入也会给我outOfMemoryException。 :( StringReader和JsonReader的关闭会增加流逝的时间并且不会解决异常问题:( 11 8月. 152015-08-11 16:56:49

  0

题外话题,可以使用Future来提高插入性能吗?我自己试过了,我需要等待对于每个线程来完成从下一个线程开始,否则它会再次抛出一个outOfMemoryException异常。这种方式不会带来任何性能优势。 11 8月. 152015-08-11 17:03:04

  0

这真的很奇怪。现在第一次尝试插入(在db文件初始化后)始终返回这个outOfMemoryException。但是,下面的试验,然后成功 11 8月. 152015-08-11 17:55:45

  0

你可以与我分享完整的代码和你的数据源文件吗?在neo4j.com迈克尔? 12 8月. 152015-08-12 15:00:56

  0

谢谢你的意愿审查它,我已经发送给你电子邮件,期待收到您的反馈! 13 8月. 152015-08-13 20:11:31