我正在读取一个包含10,000个int值的文件,然后尝试将它们存储在一个数组中。抛出异常表示数组值太大。
我想知道,不是将这个数组写入变量,我可能只是把它保存在内存中并从那里读取它。这是解决这个问题的合适方式吗?
修改
经过更多检查后,似乎抛出的错误是“try for large for try statement”错误。我正在读取每个数组元素并将其附加到字符串,也许这是导致错误的原因?
答案 0 :(得分:3)
10,000个int
值的数组大约为40KB。
您可以尝试进一步减少使用的内存,但我怀疑这不是您的问题。
你能告诉我们实际的错误信息吗?如果a long
为File.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将解决问题。