我有一个算法,当前分配一个非常大的双精度数组,它经常更新和搜索。数组的大小为 N^2/2,其中 N 是算法运行的行数。我还必须保留整个内容的副本,以用于与算法周围的应用程序相关的目的。
当然,这对我的算法可以处理的行数施加了限制,因为我需要应对堆限制。到目前为止,我已经要求使用该算法的人更新 -Xmx 设置以分配更多空间,并且效果很好。然而,我现在遇到一个真正的问题,我需要这个数组大于内存所能容纳的大小。
我已经计划更改我的算法以减轻这个大型数组的必要性,并在该领域取得一些有希望的结果。然而,这是对流程的根本性改变,并且需要做更多的工作才能达到我当前代码的高度完善状态,该代码在生产中非常成功地运行并且已经运行了好几年。
因此,当我完善我的新算法时,我想延长现有算法的寿命,这意味着解决与分配我的巨大双精度数组相关的堆限制。
我的问题是处理它的最佳方法是什么?我应该使用 nio FileChannel 和 MappedByteBuffer,还是有更好的方法。如果我确实使用 nio 方法,与相同大小的内存数组相比,我应该期望获得什么样的性能影响?
Thanks
如果您开始耗尽可用内存,那么您可能很快也会开始耗尽可用的数组索引,数组的大小限制为Integer.MAX_VALUE
,并且当使用双精度数作为数组元素时,大小“仅”32GB。
获得一台 32GB 内存的机器很昂贵,但可能不如修改算法和所有相关测试的时间那么昂贵。
但是,如果客户端运行到内存边缘,并且它们的数据集仍在增长,那么您现在就应该硬着头皮进行更改,以便能够在任何给定时间使用更少的内存,因为它们无论如何,很可能很快就会超过数组。
假设数组填充有些稀疏,您拥有的另一个选择是使用各种稀疏数组数据结构之一,尽管这些往往仅在数组填充不足 20% 时才有用。
Edit:既然您似乎已经研究了替代方案,那么 MappedByteBuffer 很可能是最佳选择。显然这会对性能产生影响,但是如果您主要对数组进行顺序读取和写入,那么这应该不会太糟糕。如果您正在进行随机读取和写入,那么这将变得非常慢非常快。或者非常慢非常慢......取决于你如何看待这些事情;-)
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)