2011-11-24 146 views
4

我正在讀取一個具有10,000個int值的文件,然後嘗試將它們存儲在數組中。拋出一個異常,表示數組值太大。如何在Java中處理大型數組

我想知道,而不是把這個數組寫入一個變量,我可能只是把它保存在內存中,並從那裏讀取它。這是解決這個問題的合適方法嗎?

編輯:

更多的檢查之後,似乎拋出的錯誤是「代碼爲大try語句」的錯誤。我讀每個數組元素並將其附加到一個字符串,也許這是什麼導致錯誤?

+3

10000是不是大量一個數組,但你最好用一個列表。 – Manoj

+6

你能提供你的代碼和例外嗎? –

+0

變量不過是對內存中數據的引用! – adarshr

回答

3

你可以使用一個ArrayList來代替 - 但是一個數組應該可以使用10,000個值。你能發表更多細節嗎?代碼,完整的堆棧跟蹤等等。理論上,它應該可以用Integer.MAX_VALUE元素(很多LOT超過10K),但是當然你可能會先耗盡內存!根據「只保存在內存中並從那裏讀取」,井變量只是保存在內存中,所以無論使用數組還是列表(或任何其他數據結構),您都將閱讀這些數組結構它從記憶!

編輯:根據你的額外解釋,它不是一個數組大小的問題,它是一個問題,你生成10,000行代碼放在一個塊,這是太多,因此它抱怨。改變你的代碼來生成使用循環的代碼,所有的都應該是好的,但是你有很多元素(當然是Integer.MAX_VALUE)。

3

10,000 int值的數組大約爲40KB。

您可以嘗試減少進一步使用的內存,但我懷疑這不是你的問題。

你能給我們實際的錯誤信息嗎?如果數組值例如long(例如,假設你使用File.length()/4來確定數組的大小,在這種情況下,你需要將它轉換爲一個int

1

奇怪的是,你不能創建10000個元素的長數組。我相信你的問題不是數組長度而是特定數組元素的值。無論如何,如果你需要更大的數組,使用列表。具體爲java.util.LinkedList

+0

使用'LinkedList'而不是一個數組會增加所需的內存至少3倍我會打賭:你必須包裝'java.lang.Integer'中的'int',則每個條目的開銷由LinkedList中的一個對象表示,因此每個值和Java對象頭至少有兩個額外的對象,其大小至少爲'int's(在64位平臺上更大)。不要介意垃圾收集器爲處理這麼多對象而必須做的額外工作。這只是沒有意義,抱歉downvoting。 – Ramon

0

10,000個整數的數組並不是很大。我想不出你爲什麼會把數據保存在內存中(即分配給一個變量)。

0

我覺得很奇怪,10,000個整數佔用太多的內存。這可能是其他的東西,如果吃掉你的記憶。你有沒有嘗試增加可用內存到Java? (即-Xmx512m)。如果這是不可能的,如果數字足夠小,你總是可以嘗試使用短褲或字節。

該數組將佔用與內存塊大小一樣多的空間(如c)。

-1

這是JVM中的一個已知錯誤。它禁止你創建一個大小爲10,000的整數數組(在Mac OS X上也是16,384)。它與Java將字節碼轉換爲機器碼的方式有關。將數組的大小更改爲10,001將解決該問題。

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 

從評論的討論之後,你說的是生產這種編譯器錯誤代碼沒有線的數量巨大。有些東西沒有意義 - 您報告的錯誤與您所說的代碼不一致。在這個後期階段,我強烈建議您發佈一些代碼,並且錯誤以便其他人可以嘗試瞭解可能導致此問題的原因。

(另外,你的問題是不太可能得到太多的關注,因爲你已經接受一個答案,你可能要重新考慮,如果你的問題其實也不回答。)

+0

是的,這正是我錯了,我不會像你所寫的那樣寫行,我是在一個循環中進行,正如我所理解的,它會產生同樣的問題。只需要現在做一點改變。 – Biscuit128

+0

我想你是說你的代碼是在一個循環中生成的 - 你使用腳本或類似的循環來生成java源文件。 – sudocode

+0

例如;對於(int i = 0; i <10,000; i ++){stringbuilder.append(get [i] +「,」);} – Biscuit128