Java 找出我能在内存中创建的最大数组

Java 找出我能在内存中创建的最大数组,java,memory,runtime,Java,Memory,Runtime,我正在对一个文件中的许多整数进行排序,这些整数可能太大,无法一次性放入内存。我目前的想法是使用快速排序获得排序卡盘,然后将它们合并到一起进行排序。我想让这些块尽可能大,所以我想知道我一次能读多少 我知道Runtime.freemory,但我应该如何使用它。我是否应该仔细计算出我在程序中使用的其他变量,然后创建一个大小数组(freemory-variablesSizes),还是太可能出错 谢谢 对于第一个块,我将从一个相对较小的块大小开始。然后,我会为下一个块加倍该块,直到得到OutOfMemor

我正在对一个文件中的许多整数进行排序,这些整数可能太大,无法一次性放入内存。我目前的想法是使用快速排序获得排序卡盘,然后将它们合并到一起进行排序。我想让这些块尽可能大,所以我想知道我一次能读多少

我知道Runtime.freemory,但我应该如何使用它。我是否应该仔细计算出我在程序中使用的其他变量,然后创建一个大小数组(freemory-variablesSizes),还是太可能出错


谢谢

对于第一个块,我将从一个相对较小的块大小开始。然后,我会为下一个块加倍该块,直到得到OutOfMemoryException。尽管这可能会触发交换

我认为准确计算我们可以分配多少内存是一项棘手的任务,因为在java中默认情况下jvm将分配256M的堆空间,但这总是可以使用-Xmx来增加,因此,最好将块大小固定在150米左右,以性能换取可移植性。

进行实验,直到找到一个合适的块大小。可以在堆上分配的最大数组不一定是最快的方法。在许多情况下,整个堆不适合计算机RAM,可能会被部分替换掉。仅仅因为您可以分配一个巨大的阵列,并不意味着它将是优化速度的最佳大小

一些自适应的方法可能是最好的(根据数组大小测试每秒排序的项目数),并在不出现OutOfMemoryError的情况下进行调整

更简单:坚持使用一些大的值,这些值工作得很好,但不一定是您可以使用的最大值


或者:使用外部库/数据库来做你想做的事情-处理大量数据通常很难做到正确,如果你不重新发明轮子,你可能会获得更好的性能和更短的开发时间。

如果你使用java构建排序功能,你将不得不使用某种类型的集合,它不接受int基元类型,而是必须使用整数对象。(
列表

在我的经验中(不被视为福音),int(显然)在ram的4字节中有权重,而整数在32位机器上有12字节的权重,在64位机器上有24字节的权重

如果您需要最小化内存足迹,请使用int[],然后实现您自己的分类器。。。 但是,使用
列表
和内置的排序功能可能更容易,只需处理更多较小的列表


不过,要回答这个问题,您肯定应该看看这个问题的合并排序攻击角度,然后选择一个任意的列表大小作为开始。经过一些实验后,您可能会发现列表大小和块数之间有一个折衷。找到最佳点并告诉我们您的结果

有所谓的“外部排序算法”。它们被设计用于对不适合ram的数据进行排序。参见维基百科:关于大约有多少个整数,有什么提示吗?100万,10亿,…1万亿?我将以1000美元的“什么是过早优化?”为例,Alex。你有什么样的性能期望,你有多少整数?我编写的一个简单的测试应用程序可以在9分钟内对100000000个整数(1.1Gb的文本文件)进行排序,块大小为1000000,5分钟为10000000,2.5分钟为50000000,80秒为100000000(即不需要合并块,只需将整个内容加载到内存中并进行排序)。注:在最后一次测试中,我不得不使用-Xmx1024M。实际的内存排序只需要17秒,其余时间是IO。使用基元数组。它还使用了就地快速排序,所以基本上没有空间开销。太棒了,我一直忘记了数组类:)谢谢!