一尘不染

我应该如何处理Java中的大型数组?

java

我有一种算法,当前会分配很大的双精度数组,它会经常更新和搜索。数组的大小为N ^
2/2,其中N是算法在其上进行操作的行数。为了与算法周围的应用程序相关联,我还必须保留整个内容的副本。

当然,这对我的算法可以处理的行数施加了限制,因为我要应对堆的限制。到现在为止,我还没有要求使用该算法的人员更新-
Xmx设置以分配更多的空间,并且效果很好。但是,我现在遇到了一个真正的问题,我需要此数组的大小超出内存的大小。

我已经计划更改算法以减轻这种大型阵列的必要性,并在该领域中取得了一些可喜的结果。但是,这是对过程的根本更改,在达到我当前代码的高度完善的条件之前,还需要进行大量工作,该代码在生产中已经非常成功地运行了好几年了。

因此,当我完善我的新算法时,我想延长现有算法的寿命,这意味着要解决与分配庞大的double数组相关的堆限制。

我的问题是最好的处理方式是什么?我应该使用nio
FileChannel和MappedByteBuffer,还是有更好的方法。如果我确实使用nio方法,那么与相同大小的内存阵列相比,我希望获得什么样的性能提升?

谢谢


阅读 228

收藏
2020-12-03

共1个答案

一尘不染

如果您在PC上运行,则映射文件的页面大小可能为4 KB。

因此,问题真正出在我是否开始将数据交换到磁盘上,“我对现在是文件的RAM的随机访问有多随机”?

并且(…是否可以,如果可以…)如何排序双精度数以最大化在一起访问4K页中的双精度数的情况,而不是在下一个4K磁盘获取之前在每个页面中一次访问几个双精度数的情况?

如果使用标准IO,则可能仍想以块的形式进行读写,但其他块可能会更小。扇区将至少为512字节,磁盘群集更大,但是鉴于每个IO都有内核往返开销,那么什么大小的读取是最好的?

很抱歉,但恐怕您的最佳下一步在很大程度上取决于所使用的算法和数据。

2020-12-03