작은 배치 크기로 커밋 된 단일 트랜잭션에서 많은 수의 관계 또는 노드를 만들 때 내장 된 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();
}
좀 더 신중하게 거래 문서를 읽을 수 있어야합니다. 나는 success()와 close()의 의미가 JDBC Connection의 commit()과 close()와 같을 것으로 기대했다. 그러나 그것은 분명히 잘못되었습니다. 감사! –