繁体   English   中英

如何在Java数组中存储1亿个整数?

[英]How to store 100 million integers in a Java array?

我正在做一个小任务,我需要在一个数组中存储大约10亿个整数。 但是,我遇到了堆空间问题。 你能帮帮我吗?

机器详细信息:Core 2 Duo处理器,4 GB RAM。 我甚至尝试过-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)

使用关联数组。 键是一个整数,值是count(整数添加到列表中的次数)。

如果分布相对随机,这应该可以为您节省一些空间,如果不是这样的话,那就更好了。

如果你需要存储10亿个完全随机的整数,那么我担心你确实需要相应的空间,即32位int的内存大约为4GB。 您可以尝试增加JVM堆空间,但是您需要拥有64位操作系统并且至少需要尽可能多的物理内存 - 而且只有到目前为止您才能使用。

另一方面,如果您可以在应用程序中使用特定约束,则可以更有效地存储这些数字。

例如,如果您只需要知道某个集合中是否包含特定的int ,那么您可以使用一个位设置 - 即int范围中每个值的一个位。 这大约是40亿比特,即512 MB - 更合理的空间要求。 例如,少数BitSet对象可以覆盖整个32位整数范围,而无需编写任何位处理代码......

可能使用内存映射文件会有帮助吗? 它们不是从堆中分配的。 这是一篇如何创建矩阵的文章。 数组应该更容易。

使用内存映射文件获取巨大的矩阵 - Peter Lawrey

您可以在32位系统上增加到4GB。 如果您使用的是64位系统,则可以更高。

输入cmd这个

java -Xmx4g programname

由于阵列太大可能无法放入RAM中,因此需要配置足够的HDD交换空间。 交换4 - 16 Gb在这些时候看起来不像是不切实际的东西。

Java只允许使用int作为数组的索引,而不是long 因此,最大可能的数组可以具有2147483648个值,足够。

使用-Xmx来提高默认情况下可能不足的内存上限。 30.7亿是不够的,因为10亿英镑需要大约4 Gb。 由于操作系统等也需要空间,具有4 Gb RAM的机器不能将所有4 Gb数据结构保存在存储器中。

JRE或OS也可能拒绝一次性授予一块如此大的内存,需要分配一些较小的块(可能是数组或数组)。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM