2013-03-11 2 views
2

메모리 관리와 관련하여 다소 혼란 스럽습니다.Neo4j 메모리는 언제 출시됩니까?

java 응용 프로그램에서 임베디드 모드로 neo4j를 사용하고 있습니다. 버전 - 1.8.1. JVM 버전 - 1.6

중첩 for 루프를 포함하는 for 루프가있는 단일 스레드 로더가 있습니다. 외부 for 루프 안에서, 나는 graphDb.beginTx();을 수행하고, mysql에서 테스트 객체의 id를 얻고 Node를 생성한다. inner for 루프에서 mysql을 쿼리하여 관련된 객체들을 얻는다. 나는 그들을위한 노드와 내가 외부 루프에서 만든 노드와의 대응 관계를 만든다.

외부 for 루프의 끝에는 tx.success()tx.finish()을 사용합니다.

for (int x = 0; x < 10000000; x++) { 
    Transaction tx = graphDb.beginTx(); 
    Node n = graphDb.createNode(); 
    Long id = n.getId(); 
    System.out.println("ID: " + id); 
    n.setProperty("TestId", x); 
    * * * get the mysql ids * * * * 
    for (int y = 0; y < mysqlidlist; y++) { 
     Node n1 = graphDb.createNode(); 
     Long id2 = n1.getId(); 
     n1.setProperty("InnerTestId", y); 
     Relationship rel = n.createRelationshipTo(n1, NodeRelation.ATTRIBUTE); 
     rel.setProperty("Weight", 0.3); 
    } 
    tx.success(); 
    tx.finish(); 
    tx = null; 
} 

내 수치를 바탕으로 Neo4j는 트랜잭션이 점유 한 메모리를 해제 할 것이라고 생각했습니다. 그러나, 나는 메모리 사용량이 항상 증가하고 얼마 동안 Xmx 설정에 도달 한 것을 본다. 다른 누수가 없는지 확인하기 위해 프로필을 작성하겠습니다. 끝에 다른 모든 변수를 null로 설정하면 GC가 더 나은 방법으로이를 확보하는 데 도움이됩니다.

내 이해가 잘못 되었나요? 그렇다면 메모리 관리에 권장되는 최상의 방법은 무엇입니까?

다음 단계 - 단일 스레드 로더가 멀티 스레드 스레드로 확장되어 메모리 관리 및 트랜잭션 관리가 강력 함을 보장하고자합니다.

감사합니다. 당신은 캐싱을 해제 시도 할 수

감사합니다,

Sachin

+0

코드를 표시 할 수 있습니까? – TizianoPiccardi

+0

옙 .... 코드. – user2158600

+0

네 .... 코드 용 \t ... \t INT (X = 0, X <10000000, X ++)을 graphDb.beginTx = TX \t \t \t \t { \t 트랜잭션(); \t \t \t 노드 n = graphDb.createNode(); \t \t \t 긴 ID = n.getId(); \t \t \t System.out.println ("ID :"+ id); \t \t \t n.setProperty ("TestId", x); \t \t \t *** 얻을 MySQL의 IDS **** (INT Y = 0, Y user2158600

답변

0

(사용 cache_type = 없음). docs.neo4j.org/chunked/milestone/configuration-caches.html

+0

감사합니다. Wes. 시도해 볼게. – user2158600

+0

웨스 (Wes) - 캐시를 꺼 놓았고 Xmx 한도에 미치지 못하는 데 도움이되었습니다. 그리고 다음 질문은 동적으로 끌 수 있는지 아닌지에 관한 질문이었습니다. 현재, 나는 처음부터 그것을한다. 감사합니다! – user2158600

+0

변경하기 위해 GraphDatabase를 다시 초기화해야 할 수도 있습니다. 어쩌면 네오 (Neo) 사람들 중 한 사람이 논평 할 수 있습니다. –

1

트랜잭션이 필요없는 대량 삽입의 경우 배치 삽입을 사용하는 것이 좋습니다.


또는

http://docs.neo4j.org/chunked/milestone/batchinsert.html

은하지 않는 것이 좋습니다 : 당신은 코드의 당신의 조각을 사용하려면 같은 추가 : 를하는 경우 (Y의 % 1000 == 0) {tx.success(); tx.finish()} for 루프 내부에서 사용 된 메모리를 모두 커밋하고 해제하려면 n 삽입하지만 느려질 것입니다.

+0

나는 배치가 좋았을 것이라는 점에 동의한다; 멀티 스레드 방식으로 사용하는 것은 권장하지 않습니다. 그리고 우리는 더 많은 멀티 스레드를위한 인프라를 구축 할 것입니다. 그리고 네, 일정한 간격으로 성공하려고 노력했지만 도움이되었습니다. 그러나 neo4j는 여전히 많이 캐시하고 있으며 공개하지 않습니다. Wes가 캐시를 끄도록 권유 한 것은 Xmx 한도에 미치지 못하는 데 도움이되었습니다. 그리고 다음 질문은 동적으로 끌 수 있는지 아닌지에 관한 질문이었습니다. 현재, 나는 처음부터 그것을한다. – user2158600

관련 문제