我正在开展一项小任务,我需要在数组中存储大约10亿个整数。但是,我遇到了堆空间问题。你能帮帮我吗?
机器详细信息:具有4 GB RAM的Core 2 Duo处理器。我甚至尝试过-Xmx 3072m。这有什么工作吗? 同样适用于C ++,因此绝对应该有一种方法可以将这么多数字存储在内存中。
以下是我得到的代码和例外:
public class test {
private static int C[] = new int[10000*10000];
public static void main(String[] args) {
System.out.println(java.lang.Runtime.getRuntime().maxMemory());
}
}
例外: 线程“main”中的异常java.lang.OutOfMemoryError:Java堆空间 在测试。(test.java:3)
答案 0 :(得分:4)
使用关联数组。键是一个整数,值是count(整数已添加到列表中的次数)。
如果分布相对随机,这应该可以为你节省一些空间,如果不是这样的话会更多。
答案 1 :(得分:2)
如果您需要存储10亿个完全随机的整数,那么我担心您确实需要相应的空间,即32位int
数字的内存大约为4GB。您可以尝试增加JVM堆空间,但是您需要拥有64位操作系统并且至少需要尽可能多的物理内存 - 而且只有到目前为止您才能使用。
另一方面,如果您可以在应用程序中使用特定约束,则可以更有效地存储这些数字。
E.g。如果你只需要知道一个集合中是否包含一个特定的int
,你就可以得到一个比特集 - 即int
范围内每个值的一个比特。这大约是40亿比特,即512 MB - 更合理的空间要求。例如,少数BitSet个对象可以覆盖整个32位整数范围,而无需编写任何位处理代码......
答案 2 :(得分:1)
可能使用内存映射文件会有帮助吗?它们不是从堆中分配的。 这是一篇如何创建矩阵的文章。数组应该更容易。
答案 3 :(得分:0)
在32位系统上,您可以增加到4GB。 如果你使用64位系统,你可以更高。
输入cmd this
java -Xmx4g programname
答案 4 :(得分:0)
由于阵列太大可能无法放入RAM中,因此需要配置足够的HDD交换空间。交换4 - 16 Gb在这些时候看起来不像是不切实际的东西。
Java只允许使用int
作为数组的索引,而不是long
。因此,最大可能的数组可以具有2147483648个值,足够。
使用-Xmx
提高内存上限,默认情况下可能不足。 30.7亿是不够的,因为10亿英镑需要大约4 Gb。由于操作系统等也需要空间,具有4 Gb RAM的机器无法在内存中保存所有4 Gb数据结构。
JRE或OS也可能拒绝一次性授予一块如此大的内存,需要分配一些较小的块(可能是数组或数组)。