2013-02-15 52 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 alpha 3中的一個錯誤(當存在alpha 4時)?我只需要在切換前驗證一下,因爲沒有兼容性,我將不得不從頭開始做所有事情。

  • 這發生在新的MapDB(以前稱爲JDBM4)嗎?我還需要在切換之前驗證這一點。

  • 或者這是庫的正常行爲出於某種原因?

+0

請注意,禁用緩存不起作用... – 2013-02-15 17:42:19

+0

您是否使用了堆分析器來查看所有內存的位置? – thkala 2013-02-15 20:10:57

+0

是的,Netbeans分析器顯示每個向量都加載到內存中。我甚至沒有使用.get()方法...只是迭代鍵集! – 2013-02-16 12:23:41

回答

0

第一:OOEM的常見原因是寫入。 JDMB3將未被取消的數據保留在內存中。因此,對於大型交易,您將耗盡內存。 解決方案是提交每N個項目。或者您可以禁用事務(DBMaker選項)將更改直接寫入文件。

第二:遍歷鍵集不應該加載所有數據到內存中。這是錯誤的,如果它。但JDBM3不受支持,所以我建議遷移到MapDB。