【问题标题】:Unexpected memory load with JDBM3使用 JDBM3 的意外内存负载
【发布时间】:2013-02-15 17:41:14
【问题描述】:

虽然 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)会发生这种情况吗?我还需要在切换之前验证这一点。

  • 或者这是由于某种原因库的正常行为?

【问题讨论】:

  • 请注意,禁用缓存不起作用...
  • 您是否使用过堆分析器来查看所有内存在哪里?
  • 是的,Netbeans 分析器显示每个向量都加载到内存中。我什至没有使用 .get() 方法...只是在键集中迭代!

标签: java memory memory-leaks


【解决方案1】:

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

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

【讨论】:

    猜你喜欢
    • 2022-08-20
    • 1970-01-01
    • 2016-12-04
    • 2017-11-12
    • 2018-02-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多