2014-07-15 4 views
0

작은 배치 크기로 커밋 된 단일 트랜잭션에서 많은 수의 관계 또는 노드를 만들 때 내장 된 Neo4j 2.1.2 데이터베이스를 사용하고 있으며 메모리 문제가 발생합니다. 단일 장기 실행 트랜잭션을 사용하지 않아야합니까? 대신 커밋 일괄 처리 크기로 메모리 사용량이 증가 할 것으로 예상 했었습니다.Neo4j를 오래 실행하면 OutOfMemoryError가 발생합니다.

이 간단한 코드 오류를 재현 할 수 580.000 노드의 512MB 힙 크기를 삽입 한 후 내가 OutOfMemoryError가 무엇입니까

try (Transaction tx = db.beginTx()) { 
    for (int idx=1; idx<=amount; idx++) { 
     if (idx % 10000 == 0) { 
      tx.success(); 
     } 
     Node n = db.createNode(); 
    } 
    tx.success(); 
} 

. 사용되는 VM의 플래그는 다음과 같습니다 -server -Xmx512m -XX:+UseConcMarkSweepGC

나는 매우 빠르게 잘 작동하고 각 배치에 대한 새로운 트랜잭션을 사용하도록 코드를 수정하는 경우 :

Transaction tx = db.beginTx(); 
try { 
    for (int idx=1; idx<=amount; idx++) { 
     if (idx % 10000 == 0) { 
      tx.success(); 
      tx.close(); 
      tx = db.beginTx(); 
     } 
     Node n = db.createNode(); 
    } 
    tx.success(); 

} finally { 
    tx.close(); 
} 

답변

0

이 내 생각은 당신의 노드에 대한 참조가 유지 될 것 그들은 트랜잭션에 위치하며 롤백 목적으로 유지되어야하므로 힙에 580 000 노드 이후에 메모리가 부족합니다. 작은 일괄 처리 크기로 동일한 코드를 실행하면 일괄 처리 크기가 580 000을 초과하지 않는 한 문제가 해결됩니다.

두 번째 질문은 Java 힙 메모리가 할당되었지만 프로그램을 확장 할 때 동적으로 증가시킬 수 없습니다. more need

void close()를 트리거해야합니다. 그렇지 않으면 자원을 해제하지 않습니다.

http://api.neo4j.org/current/org/neo4j/graphdb/Transaction.html#close()success() 또는 failure()가 이전에 호출되었는지 여부에 따라 롤백에 대해이 트랜잭션을 커밋하거나 표시합니다.

이 질문이 방법에 의해 중복 생각 :

Java Neo4J out of memory

+0

좀 더 신중하게 거래 문서를 읽을 수 있어야합니다. 나는 success()와 close()의 의미가 JDBC Connection의 commit()과 close()와 같을 것으로 기대했다. 그러나 그것은 분명히 잘못되었습니다. 감사! –

관련 문제