虽然JDBM3数据库承诺(据我所知)在访问和写入数据时使用非常小的内存,但我遇到以下问题: 即使在TreeMap的键集内迭代,似乎所有数据都加载到内存中。所以下面的代码:
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 :(得分:0)
首先:OOEM的常见原因是写入。 JDMB3将未提交的数据保存在内存中。因此,对于大型事务,您将耗尽内存。 解决方案是提交每N个项目。或者您可以禁用事务(DBMaker选项)以将更改直接写入文件。
第二:迭代键集不应该将所有数据加载到内存中。如果是这样的话就是bug。但是JDBM3不受支持,所以我建议迁移到MapDB。