繁体   English   中英

Java中的内存映射集合

[英]Memory mapped collections in Java

我正在填充JVM堆空间。

推荐使用两个方法,即更改参数以为JVM提供更多的堆空间,或在代码中的算法中更改某些内容以免使用太多空间。

但是,如果已经尝试并应用了这两个方法,而我仍然遇到内存异常,那么我想看看其他选项是什么。

我发现了有关“ 使用内存映射文件处理巨大矩阵的示例”和一个名为HugeCollections的库的示例 ,它们是解决我的问题的一种有趣方法。 不幸的是,该库已经一年多没有见到更新了,而且也没有任何Maven回购-因此对我而言,这不是一个真正可靠的回购。

我的问题是,是否还有其他库正在执行此操作,或者是否是实现此操作的好方法(具有映射的集合对象(列表和集合)的内存)?

您不会说您正在使用哪种收藏集,也不会说出它们的使用方式,因此很难提出建议。 但是,请记住以下几点:

  • 将对象保留在Java堆上总是最简单的选择,而RAM相对便宜。
  • 盲目移动到内存映射的数据很可能会带来可怕的性能,尤其是当您在文件中移动和/或进行大量更改时。 基于散列的收集类型最糟糕,因为它们通过分发数据来工作。 基于树的集合类型通常是更好的选择,而线性集合可以同时使用。
  • 一旦脱离堆,您需要一种将对象与Java相互转换的方法。 对象序列化是最简单的,但是会增加很多开销。 通常,通过字节缓冲区访问二进制对象是更好的选择,但是您需要注意线程。
  • 您还必须管理自己的堆外对象的垃圾收集。 如果您正在做的只是创建/更新,这不是问题,但是如果要删除,很快就会很麻烦。
  • 如果您有大量数据,并且需要以多种方式访问​​该数据,那么数据库可能是您的最佳选择。

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回购中

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

听起来您在内存泄漏方面遇到了麻烦,或者试图将太大的对象放入内存中。

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

假设您没有内存泄漏或其他问题,并且确实需要太多无法容纳在堆中的存储(我不太可能发现),那么您基本上只有一个选择:

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

注意:您可以在64位VM上使用非常大的堆,并在必要时扩大OS的交换空间。 残酷地增加最大堆大小(即使这意味着大量交换)可能是最简单的解决方案。 我当然会在您概述的情况下先尝试一下。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM