如何在Java中处理大型数组

时间:2011-11-24 15:01:44

标签: java arrays memory

我正在读取一个包含10,000个int值的文件,然后尝试将它们存储在一个数组中。抛出异常表示数组值太大。

我想知道,不是将这个数组写入变量,我可能只是把它保存在内存中并从那里读取它。这是解决这个问题的合适方式吗?

修改

经过更多检查后,似乎抛出的错误是“try for large for try statement”错误。我正在读取每个数组元素并将其附加到字符串,也许这是导致错误的原因?

7 个答案:

答案 0 :(得分:3)

10,000个int值的数组大约为40KB。

您可以尝试进一步减少使用的内存,但我怀疑这不是您的问题。

你能告诉我们实际的错误信息吗?如果a longFile.length()/4,则数组值太大。假设您使用int来确定数组的大小,在这种情况下您需要将其强制转换为{{1}}

答案 1 :(得分:3)

您可以使用ArrayList - 但是数组应该没有10,000个值。你能发布更多细节吗?代码,完整堆栈跟踪等理论上它应该没有Integer.MAX_VALUE个元素(超过10k),但当然你可能会先耗尽内存!

就“只是将其保存在内存中并从那里读取”而言,井变量只保存在内存中,因此无论您使用数组还是列表(或任何其他数据结构),您都将始终阅读它来自记忆!

编辑:根据你的附加说明,这根本不是数组大小的问题,你生成10,000行代码放在一个块中是一个问题,这个问题太多了,因此它会抱怨。改变你的代码来生成使用循环的代码而且一切都应该很好,但是你有很多元素(当然最多是Integer.MAX_VALUE。)

答案 2 :(得分:1)

奇怪的是你不能创建10000个元素长数组。我相信你的问题不是数组长度,而是特定数组元素的值。无论如何,如果您需要更大的阵列,请使用列表。具体来说是java.util.LinkedList

答案 3 :(得分:1)

您的问题是您正在完整地编写每个数组或字符串赋值,如下所示:

        array[0] = 0;
        array[1] = 1;
        array[2] = 2;
        // all the way up to 9999!

或者这个:

        String s = "";
        s += array[0];
        s += array[1];
        s += array[2];
        // all the way up to 9999!

而不是循环。因此,您生成more code than Java will allow in a method

这会导致编译错误,如您所述:

$ javac Test.java
Test.java:7: code too large for try statement
        try {
            ^
Test.java:4: code too large
    public static void main(String[] args) {
                       ^
2 errors

在评论中讨论之后,您所说的产生此编译器错误的代码没有大量的行。有些东西没有意义 - 你报告的错误与你说的导致它的代码不符。在这个后期阶段,我强烈建议你发布一些代码,然后发现错误,以便其他人可以尝试了解可能导致此问题的原因。

(此外,由于您已接受答案,因此您的问题不太可能得到太多关注。如果您的问题实际上没有得到答案,您可能需要重新考虑。)

答案 4 :(得分:0)

10,000个整数的数组并不是很大。我无法想到为什么在将数据保存在内存中时会遇到问题(即分配给变量)。

答案 5 :(得分:0)

我觉得奇怪的是10,000个内存会占用太多内存。如果吃掉你的记忆,它可能是其他的东西。您是否尝试过将可用内存增加到Java? (即-Xmx512m)。如果无法做到这一点,如果数字足够小,你总是可以尝试使用短路或字节。

数组将占用与内存块一样多的空间(就像c一样)。

答案 6 :(得分:-1)

这是JVM中的已知错误。它禁止您创建大小为10,000的整数数组(在Mac OS X上也是16,384)。它与Java将字节代码转换为机器代码的方式有关。将数组大小更改为10,001将解决问题。