2009-08-12 76 views
1

現在,我需要從數據庫加載大量數據到一個向量中,但是當我加載38000行數據時,程序拋出OutOfMemoryError異常。 我能做些什麼來處理這個問題?如何處理java中的大量數據

我覺得有可能是我的一些程序內存泄漏,好的方法來檢測呢?感謝

+0

感謝您的回答,但我不想增加我的堆大小,我想我可能需要找到一個好的算法。 – MemoryLeak 2009-08-12 13:16:02

+2

@Hooligan:告訴我們爲什麼要將數據加載到矢量中,也許我們可以爲您提供一個好的算法。 – Brian 2009-08-12 13:31:19

+0

我們的舊程序遇到了這樣一個超出內存的錯誤,所以我需要優化它,程序將所有數據加載到字段中,然後在此基礎上進行處理。 – MemoryLeak 2009-08-12 13:47:29

回答

7

你的JVM提供更多的內存(通常使用-Xmx/-Xms)或不全部數據加載到記憶。

對於海量數據的許多操作,有一些算法不需要同時訪問所有數據。一類這樣的算法是divide and conquer algorithms

0

讓你的程序中使用更多的內存或更好的重新思考戰略。你真的需要這麼多的數據在內存中嗎?

+0

@JoshJordan tx編輯 – 2009-08-12 13:10:29

1

您可以嘗試增加堆大小:

java -Xms<initial heap size> -Xmx<maximum heap size> 

默認爲

java -Xms32m -Xmx128m 
+0

最大值將是1024米,這取決於您的平臺(似乎最大可分配內存塊)。 – 2009-08-12 13:07:52

+1

他說這個程序在38000行數據後拋出了OutOfMemoryError,我認爲還有更多,他不能繼續增加堆大小來跟上。 – 2009-08-12 13:10:53

+0

據我所知,沒有最大值。我用4GB堆運行。 – Tommy 2009-08-12 13:13:21

1

你真的需要在內存中存儲這樣一個大對象嗎?

根據您對該數據所做的操作,您可能需要將其拆分爲較小的塊。

1

按部分加載數據部分。這不會讓您同時處理所有數據,但您不必更改提供給JVM的內存。

1

也許優化你的數據類?我已經看到有人使用Strings來代替本地數據類型,例如在存儲內存中的相對少量的數據對象時給出OutOfMemoryError的每個類成員的int或double。看看你沒有複製你的對象。而且,當然,增加堆大小:

的java -Xmx512M(或任何你認爲必要的)

3

如果你必須在內存中的所有數據,儘量緩存共同出現的對象。例如,如果您正在查看員工記錄並且他們都有工作職位,請在加載數據時使用HashMap並重新使用已找到的職位。這可以大大降低您使用的內存量。

另外,在你做任何事情之前,使用一個探查器來查看內存在哪裏被浪費,並檢查是否可以垃圾收集的東西沒有引用浮動。同樣,String是一個常見的例子,因爲如果你使用的是2000 char字符串的前10個字符,並且你使用了substring而不是分配一個新的String,你實際上有一個對char [2000 ]數組,其中兩個索引指向0和10.同樣,一個巨大的內存浪費。

1

您可以使用探查器運行您的代碼,以瞭解如何以及爲何內存被吃掉。在循環中調試您的方式並觀察正在實例化的內容。他們中有許多人; JProfiler,Java Memory Profiler,見list of profilers here等等。

0

我知道你正試圖將數據讀入矢量 - 否則,如果你試圖顯示它們,我會建議你使用NatTable。它專爲將大量數據讀入表格而設計。

我相信這可能會派上用場。

0

使用內存映射文件。內存映射文件基本上可以隨意增大,而不會碰到堆。它確實要求您以解碼友好的方式對數據進行編碼。 (比如,爲數據中的每一行保留一個固定大小,以便快速跳過多行)是有意義的。)

Preon允許您輕鬆處理。這是一個框架,旨在完成二進制編碼數據,Hibernate爲關係數據庫完成的工作,以及JAXB/XStream/XmlBeans到XML。