0

虽然 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 也比数据本身多得多。到目前为止我考虑的事情是:

  • 这是一个错误吗?或者在创建/打开数据库(缓存、事务?)时有一些参数会禁用此“功能”?

  • 这是我使用的 JDBM3 alpha 3 中的一个错误(当有 alpha 4 时)?我只需要在切换之前验证这一点,因为不兼容,我必须从头开始做所有事情。

  • 更新的 MapDB(以前的 JDBM4)会发生这种情况吗?我还需要在切换之前验证这一点。

  • 还是出于某种原因这是图书馆的正常行为?

4

1 回答 1

0

首先:OOEM 的常见原因是写入。JDMB3 将未提交的数据保存在内存中。因此,对于大型事务,您将耗尽内存。解决方案是提交每 N 个项目。或者您可以禁用事务(DBMaker 选项)以将更改直接写入文件。

第二:迭代键集不应该将所有数据加载到内存中。如果是这样,那就是错误。但是 JDBM3 不受支持,所以我建议迁移到 MapDB。

于 2013-02-16T17:57:14.903 回答