制作一个非常大的Java数组

10 java arrays

我试图找到Pólya猜想的一个反例,它将在9亿的某个地方.我正在使用一种非常有效的算法,甚至不需要任何因子分解(类似于Eratosthenes的Sieve,但有更多的信息.因此,需要大量的整数.

该程序是高效和正确的,但需要一个阵列,直到想要检查的xi(它检查来自(2,x)的所有数字).所以,如果反例是9亿,我需要一个同样大的数组.Java不会允许我超过2000万.有什么我可以做的让一个大的数组?

jjn*_*guy 12

您可能希望扩展JVM堆的最大大小.您可以使用命令行选项执行此操作.

我相信它是-Xmx3600m(3600兆字节)


Bom*_*mbe 10

Java将允许多达20亿个数组条目.这是你的机器(和有限的内存)无法处理如此大的数量.

  • 上次我检查`Integer.MAX_VALUE`仍然是最大的`int`可用,而最后一个元素的索引是`n - 1`我在这里看不到问题. (2认同)
  • 当我使用256GB内存时,这20亿的限制让我很难过.(严重).必须重写一大块代码才能超越基本的"数组被内联索引"问题. (2认同)

mfx*_*mfx 10

Java数组由int索引,因此数组不能大于2 ^ 31(没有无符号整数).因此,数组的最大大小为2147483648,消耗(对于普通的int [])8589934592字节(= 8GB).

因此,int-index通常不是限制,因为无论如何你都会耗尽内存.

在您的算法中,您应该使用List(或Map)作为您的数据结构,并选择List(或Map)的实现,其可以超过2 ^ 31.这可能会变得棘手,因为"通常"实现ArrayList(和HashMap)在内部使用数组.您必须实现自定义数据结构; 例如,通过使用2级数组(列表/数组).当你在它时,你也可以尝试更紧密地包装.


Kri*_*ris 7

9亿32位整数没有进一步的开销 - 并且总是会有更多的开销 - 需要略高于3.35 GiB.获得大量内存的唯一方法是使用64位JVM(在具有至少8 GB RAM的计算机上)或使用某些磁盘备份缓存.


sfo*_*sen 6

如果您不需要将所有内容一次性加载到内存中,则可以将其分段为文件并存储在磁盘上.


Tom*_*ine 2

你所说的“不允许”是什么意思?您可能会得到一个OutOfMemoryError,因此请使用命令行选项添加更多内存-Xmx