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

use*_*996 7 java memory arrays integer

我正在做一个小任务,我需要在一个数组中存储大约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()); 

    }

}
Run Code Online (Sandbox Code Playgroud)

异常:线程"main"中的异常java.lang.OutOfMemoryError:测试时的Java堆空间.(test.java:3)

Dav*_*ave 5

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

如果分布相对随机,这应该可以节省一些相当大的空间,如果不是随机的,则节省更多。


thk*_*ala 4

如果你需要存储10亿个完全随机的整数,那么恐怕你确实需要相应的空间,即32位int数字需要大约4GB的内存。您可以尝试增加 JVM 堆空间,但您需要有 64 位操作系统和至少同样多的物理内存 - 而且您只能做到这一点。

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

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