2013-02-15 1 views
0

데이터를 액세스하고 쓸 때 JDBM3 데이터베이스가 매우 작은 메모리 사용을 약속하지만 다음과 같은 문제가 있습니다. TreeMap의 키 집합을 반복 할 때 모든 데이터가 메모리에로드 됨. 그래서 다음 코드를JDBM3에서 예기치 않은 메모리로드

db=DBMaker.openFile("Myfile") 
     .make(); 
    SortedMap<Integer, double[]> MyMap=db.getTreeMap("MyMap"); 
    int i=0; 
    final Set<Integer> keySet = MyMap.keySet(); 
    for (Object key : keySet) { 
     System.out.println(i++); 
    } 

는 메모리 및 마침내에서 OutOfMemory 오류에 대한 모든 이중 행렬을로드에 연결됩니다. 데이터 자체보다 많은 GB를로드하는 것으로 보입니다. 내가 지금까지 고려하신 사항은 다음과 같습니다

  • 이 버그인가요? 또는이 "기능"을 비활성화하는 db (캐시, 트랜잭션)를 만들거나 열 때 몇 가지 매개 변수가 있습니까?

  • 내가 사용하는 JDBM3 알파 3의 버그 (알파 4가있을 때)인가요? 호환성이 없기 때문에 전환하기 전에이를 확인해야합니다. 모든 것을 처음부터해야 할 것입니다.

  • 더 새로운 MapDB (이전의 JDBM4)에 발생합니까? 또한 전환하기 전에이를 확인해야합니다.

  • 또는 어떤 이유로이 기능이 정상적으로 작동합니까?

+0

캐시를 비활성화하면 작동하지 않는다는 것에 유의하십시오. –

+0

힙 분석기를 사용하여 메모리가 모두 어디에 있는지 확인 했습니까? – thkala

+0

예, Netbeans 프로파일 러는 모든 벡터가 메모리에로드되었음을 보여줍니다. 나는 .get() 메서드를 사용하지 않았다 ... 키셋을 반복한다! –

답변

0

우선 : OOEM의 일반적인 원인은 쓰기입니다. JDMB3은 커밋되지 않은 데이터를 메모리에 보관합니다. 따라서 대규모 트랜잭션의 경우 메모리가 부족합니다. 해결 방법은 N 개의 항목을 모두 커밋하는 것입니다. 또는 트랜잭션을 비활성화하여 (DBMaker 옵션) 파일에 직접 변경 사항을 기록 할 수 있습니다.

둘째 : 키 집합을 반복하여 모든 데이터를 메모리에로드하지 않아야합니다. 그것은 버그입니다. 그러나 JDBM3은 지원되지 않으므로 MapDB 로의 마이그레이션을 권장합니다.