java中有1000000000个数组输入

时间:2015-05-15 02:54:52

标签: java arrays heap

我正在尝试测试需要1,000,000,000个数组输入的算法。

Scanner scanner = new Scanner(new File("999999998.txt"));
int[] tall = new int[1000000000];
int i = 0;
while (scanner.hasNextInt()) {
    tall[i++] = scanner.nextInt();
}

抛出此异常:

Exception in thread "main" java.lang.OutOfMemoryError: Java heap space

3 个答案:

答案 0 :(得分:3)

你正在尝试创建一个(大致)4G阵列,它太大而不适合堆(十亿个4字节整数)。

最有可能的是,如果你想这样做,你将需要在64位操作系统上运行64位Java(并且可能需要大量的物理内存来提高性能),并增加堆大小比默认值大得多(例如使用java -Xmx6g或类似的东西)。

或者,如果您的算法能够对部分数据进行操作,那么这可能是更好的选择。

因此,如果您要对文件中的项进行求和,则可以一次将它们加到一千个中,以将它们添加到运行总计中。现在,如果对各种不同的整数进行大量随机访问并不容易,但在这种情况下,您可以在磁盘上创建阵列并使用缓存/ LRU接口来确保只加载所需的内容任何给定点。

答案 1 :(得分:3)

首先,我同意所有的评论和答案,建议您尽量保留尽可能少的数据。

假设您确实确实需要所有这些数据,您需要使用-Xmx标志启动具有更多内存的Java容器:

java -Xmx6g <your launch args here>

如果无法使用上述args启动Java,那么这意味着你要么运行32位Java ,要么你没有6GB可用内存(这意味着在这两种情况下都无法分配此大小的数组)。

答案 2 :(得分:0)

出于多种原因,我会推荐几乎4GB的阵列,首先你会吃掉大部分,如果不是你所有的ram资源,第二个可能更容易,总体上更好地分解它。

尝试将数据分解为不同的文件,或者只是将文件中的数据逐个读取到数组中,然后像这样处理。

如果您想要处理这样的数据,请执行以下操作:

1)。确保你是64位操作系统和64位java版本,否则这是不可能的。

2)。将java内存堆大小增加到4GB以上,可能是5或6.使用命令java -Xmx6g programName,其中xmx是命令,6g是堆大小,programName是程序的名称。从Windows命令提示符运行程序时。或者只是在IDE中设置。

希望这有帮助。