【问题标题】:Memory mapped collections in JavaJava中的内存映射集合
【发布时间】:2012-10-09 13:00:16
【问题描述】:

我正在填满 JVM 堆空间。

更改参数以向 JVM 提供更多堆空间,或更改代码中算法中的某些内容以不使用太多空间是最推荐的两个选项。

但是,如果这两个已经被尝试和应用过,并且我仍然遇到内存不足的异常,我想看看其他选项是什么。

我发现了这个“Using a memory mapped file for a huge matrix”示例和一个名为HugeCollections 的库,这是解决我的问题的一种有趣方式。不幸的是,这个库已经一年多没有更新了,而且它不在任何 Maven 存储库中——所以对我来说它不是一个真正可靠的。

我的问题是,是否有任何其他库这样做,或者实现它的好方法(具有集合对象(列表和集合)内存映射)?

【问题讨论】:

  • 只是因为一个项目不使用maven它不可靠?有趣的 POV。
  • 如果你看到源代码,它使用了 Maven。但它不在任何回购中。而且,自 2011 年 9 月 23 日以来没有更新。code.google.com/p/vanilla-java/source/list
  • “无更新”也可能意味着它功能齐全且无错误。 :D
  • 仍然没有说明项目质量的任何内容。要评估它的质量,您需要实际使用它的人的一些陈述或自己尝试一下。仅根据更新频率和 one 工具支持的存在来判断 IMO 的判断力很差。它同样没有根据,就像通过版本号来判断一个项目(就像我不想使用 1.0 之前的版本......许多 apache 项目已经 1.0 之前的 并且仍然被广泛使用 和 i> 有用)。

标签: java collections memory-mapping


【解决方案1】:

你没有说你正在使用什么样的集合,或者你使用它们的方式,所以很难给出建议。但是,请记住以下几点:

  • 将对象保存在 Java 堆上始终是最简单的选择,而且 RAM 相对便宜。
  • 盲目地移动到内存映射数据很可能会导致可怕的性能,尤其是当您在文件中移动和/或进行大量更改时。基于散列的集合类型是最差的,因为它们通过分发数据来工作。基于树的集合类型通常是更好的选择,而线性集合可以是双向的。
  • 一旦移出堆外,您需要一种方法将对象转换为 Java 或从 Java 转换。对象序列化是最简单的,但会增加很多开销。通过字节缓冲区访问的二进制对象通常是更好的选择,但您需要具有线程意识。
  • 您还必须管理自己的堆外对象垃圾收集。如果您所做的只是创建/更新,这不是问题,但如果您要删除,很快就会变得很痛苦。
  • 如果您有大量数据,并且需要以各种方式访问​​这些数据,那么数据库可能是您的最佳选择。

【讨论】:

    【解决方案2】:

    Unluckily, the library hasn't seen an update for over a year, and it's not in any Maven repo - so for me it's not a really reliable one我同意并写了。 ;)

    我建议你看看https://github.com/peter-lawrey/Java-Chronicle 哪个更高的性能已经使用了一点。它确实是为 List & Queue 设计的,但您可以将它用于带有其他数据结构的 Map 或 Set。

    根据您的要求,您可以编写自己的库。例如对于时间序列数据,我编写了一个不同的库,不幸的是它不是开源的,但可以非常干净地加载 500+ GB 的表。

    它不在任何 Maven 存储库中

    这也不是,但很高兴有人添加它。

    【讨论】:

    【解决方案3】:

    听起来您要么遇到内存泄漏问题,要么试图将太大的对象放入内存中。

    您是否尝试过粗略估计加载数据所需的内存量?

    【讨论】:

    • 问题是我不想仅仅添加更多 RAM 内存并增加 JVM 堆,这是简单的解决方案,但不是理想的解决方案 :)
    【解决方案4】:

    假设您没有内存泄漏或其他问题,并且确实需要那么多存储空间,而您无法将其放入堆中(我认为这不太可能),您基本上只有一个选择:

    不要将数据放在堆上。就那么简单。现在,您使用哪种方法将数据移出在很大程度上取决于您的要求(什么样的数据、更新频率以及 多少 是真的?)。

    注意:您可以在 64 位 VM 中使用非常大的堆,并在必要时扩大操作系统的交换空间。粗暴地增加最大堆大小(即使这意味着大量交换)可能是最简单的解决方案。在你描述的情况下,我当然会先尝试。

    【讨论】:

    • 我要选择“不要将数据放在堆上”选项。我有一些自定义对象,然后将它们添加到列表或集合中。
    猜你喜欢
    • 2014-01-10
    • 2018-03-30
    • 1970-01-01
    • 2021-12-12
    • 2010-11-04
    • 1970-01-01
    • 2011-05-14
    • 2011-02-25
    • 1970-01-01
    相关资源
    最近更新 更多