2010-08-16 162 views
2

我使用這個說法內存不足錯誤Java堆空間

//some code 
int a[][]=new int[5000000][5000000]; 
//some code 

,並命令運行它

java -mx512m Test 

這是給的OutOfMemoryError:Java堆空間顯示在上述陳述的行號stacktrace

我該如何解決這個問題

編輯: 我試圖解決一個practice problem on codechef

+1

你真的想用25萬億的矩陣實現什麼? – sinuhepop 2010-08-16 20:56:17

+3

善良,你真的認爲你可以分配,並迭代,3秒內允許你的算法100TB的數據? – meriton 2010-08-16 21:11:36

+0

_首先讓它工作,_然後_優化! – 2010-08-16 21:56:22

回答

4

我認爲你正在尋找的數據結構是一個稀疏矩陣。將元素和它們的座標一起存儲在地圖數據結構中(例如,對於2d稀疏數組,可以使用Map<Integer,Map<Integer,Integer>>),並假設任何不在地圖中的值爲零。

+0

是的,我想我會這樣做..它會節省內存以及迭代時間 – Shwetanka 2010-08-16 21:28:57

+1

+1爲稀疏矩陣的想法,但我建議使用一個不需要太多複雜。就像'Map '或者其他一些專門製作的關鍵類,它們只是兩個整數的容器。 – 2010-08-16 21:32:01

0

您正在使用太多的內存。少用或多用。每個int元素都是32位。而你的內存限制爲512MB比你想象的要小得多。

0

for int [5000000] [5000000]您需要100000000000000B或100000GB。所以你只能等待大約100年,當這樣的事情成爲可能時。

+0

你真的認爲100000 GB需要100年纔會經濟?友好的賭注怎麼樣? – 2010-08-16 21:35:33

+0

獲勝者獲得10000 Gb USB密鑰。 – 2010-08-16 21:57:59

8

您可能需要考慮一種解決問題的方法,它需要較少的內存。

從谷歌計算器(假定64位整數大小):

(5 000 000^2) * 64 bits = 186 264.515 gigabytes 
+0

哇,這是一個巨大的陣列! – 2010-08-16 20:54:17

+1

雖然java int被設置爲32位。 – 2010-08-16 21:10:40

+1

我對Java的細節並不是很熟悉,所以我假設了64位計算機的默認整數大小。所以我可能會減少93,000 GB左右。 – pmalmsten 2010-08-16 21:15:24

3

好,這是25個萬億整數,其每一個需要4個字節,因此100個萬億字節的整體。最簡單的解決方案是購買大約90TB的RAM和64位的操作系統。

儘管如此,正確的解決方案可能是分配一個更合理的數據結構,可以更有效地存儲數據,假設您實際上不需要一次將90 TB的數據加載到RAM中。也許如果你發佈更多關於這個問題,我們可以給出更好的答案?

+0

其實我試圖解決Codechef上的練習題http://www.codechef.com/problems/PRIMPATT/。我想我需要一個這樣大小的矩陣。任何幫助都可以使用 – Shwetanka 2010-08-16 20:59:36

+3

如果通過在內存中建模整個字段來解決問題,則需要90太字節的數組,這是一個很好的信號,有更好的方法來解決問題。我認爲你必須找出一種方法來確定一個給定的方塊是否是黑色的,而不是實際模擬機器人經歷的整個過程。 – 2010-08-16 21:04:05

+0

是的,我認爲我應該改變方法。但有一點如果我將類型從int轉換爲byte會有幫助嗎? – Shwetanka 2010-08-16 21:18:11

0

您需要更開明的數據結構。除非你真的需要25萬億個整數,這是值得懷疑的。

0

這是一個有500萬列和500萬行的矩陣。那真的是你想要的嗎?

1

在其他答案中,您的命令中有拼寫錯誤。

它應該是:java -Xmx512M Test

10

我面臨着關注文摘Java堆 和解決同樣的問題是修改mx512m到mx4096m或mx2048m(擴展內存所允許的最大值) 所以你的情況下,嘗試命令 的java -mx4096m測試這將允許Java使用4 GB的內存條。

+0

這應該是被接受的答案。 – EyadMhanna 2015-08-16 13:11:13

+0

工作謝謝 – ghiath 2015-08-16 13:11:36

+0

是的這是正確的 – Firas 2015-08-16 13:12:41