2013-01-13 84 views
1

我存儲從SQL查詢結果的Arraylist<Hashtable<String, String>>,每個結果都存儲在一個Hashtable中,然後將每個結果存儲在列表上最佳SQL查詢結果存儲

它工作得很好,如果有少比100.000的結果,buf如果有更多的結果我得到和OutOfMemory異常。

對於如何改善這種情況,您有任何建議嗎?

+2

你是否真的需要一次完成所有的結果?賠率是你可以存儲一個有限的數字,當你真正需要時用另一個查詢拉出更多。否則通常只是浪費記憶。 –

+0

是的,我這樣做,因爲我正在從JDBC數據庫表中獲取信息並將其存儲在MongoDB中,所以我需要存儲所有信息 – RedEagle

+3

我很困惑 - 爲什麼你不能將它作爲一個多層應用程序來執行?步驟過程?如果你真的在使用另一個數據庫上的INSERT查詢執行SELECT查詢,那麼這是將它分開的最佳人選。無論如何,你不可避免地要做這樣的事情,除非JDBC數據庫表永遠不會增長。即使您可以使存儲稍微更高效,字符串也很大。你最終會耗盡內存。 –

回答

1

您可以通過使用自定義類來表示每行來節省一些空間。 (A HashMap是一個相當「內存飢餓」的數據結構。)但是,這只是推遲了必然的OOME。

更好的辦法是改變你的應用程序,這樣你就不必將整個結果集存儲在內存中。

+0

自定義類不是一個選項,因爲我不知道每個表的結果列。有加載和加載的表格。 – RedEagle

+0

但大概這些表格代表了業務對象。每桌可以有一個班級。無可否認,可能會有很多類,但代碼會更易於維護。 – NickJ

+0

如果自定義類不是一個選項,那麼'HashMap'是你的最佳選擇。 –

0

改善這種最簡單的,可能至少內存密集型的方式是保持一個二維數組爲您的數據:

String[][] data; 

// Alternatively, if you prefer lists: 
List<String[]> data; 

你會那麼只需要一個額外的數據結構,如

Map<String, Integer> fieldNameToIndexMapping; 

...在這裏你會第一建立一個查找表,通過列索引訪問您的字段。例如。

String value = data[row][fieldNameToIndexMapping.get("MY_COLUMN")]; 

在適當的情況下,可以使用更簡潔的數據類型進行更多調整。我懷疑你存儲在你的數據結構中的一些String值實際上是BooleanInteger以及其他更容易以非字符串形式存儲的項目。