2009-11-04 105 views
2

我們有一個應用程序的一部分,比如說需要讀取超過內存限制的數據量的20%的時間。雖然我們可以增加內存限制,但是我們不願意這麼做,因爲在大多數情況下不需要時,它需要高分配。如何處理大型數據列表

我們正在考慮使用自定義的java.util.List實現在我們像這樣點擊峯值負載時後臺恢復到磁盤,但是在較輕的情況下會保留在內存中。

數據一次加載到集合中,隨後迭代並處理,然後丟棄。它不需要在集合中進行排序。

有沒有人有這樣的做法優點/缺點?

是否有一個開源產品提供某種類似List的List impl?

謝謝!

更新:

  • 並非是厚臉皮的,但通過「巨大」我的意思是超過內存量我們願意而不在同一硬件上的其他進程的干擾來分配。你還需要其他什麼細節?
  • 該應用程序本質上是一個批處理器,可從多個數據庫表中加載數據並在其上執行廣泛的業務邏輯。列表中的所有數據都是必需的,因爲彙總操作是邏輯完成的一部分。 STXXL equivalent in Java
+0

你能更好地定義一個'巨大'的數據量和內存限制嗎? – 2009-11-04 00:44:00

回答

6

你真的需要使用List嗎?編寫Iterator的實現(它可能有助於擴展AbstractIterator),而不是逐步完成數據。然後,您可以使用該迭代器的有用實用程序like these。這些都不會導致大量數據被急切地加載到內存中 - 相反,只有在迭代器高級化時才從源讀取記錄。

+0

這絕對是一種選擇,我們正在認真考慮。我期望的是一個可以從內存中讀取的迭代器(或列表)實現,或者當超出內部緩衝區時從磁盤讀取。 – 2009-11-04 03:50:13

+0

好吧,如果它只是從InputStream中讀取,那麼BufferedInputStream將爲您處理緩衝區。 – 2009-11-04 16:18:56

0

是否有分揀/處理,同時該數據被讀入的集合,是怎麼回事:

  • 我只是碰到這個職位它提供了一個非常好的選擇來的?它從哪裏讀取?

    如果它已經從磁盤讀取,是否可以直接從磁盤直接批量處理,而不是完全讀入列表,然後迭代?數據如何相互依賴?

  • +0

    列表中的每個元素都是一個域對象,每個元素都有相關對象的層次結構。它從幾個(15-25)數據庫表中讀入各種查詢,有些緩存,有些則不是。 – 2009-11-04 03:49:36

    2

    如果您使用大量數據,則可能需要考慮使用數據庫。

    +0

    +1。與僅返回特定結果集的查詢結合使用的數據庫可能是一個更好的主意。 – BalusC 2009-11-04 02:30:19

    +0

    數據存儲在數據庫中,跨越大約20個不同的表格,在應用程序執行的各個點上加載,每個數據點有不同的截止日期。該應用程序的一個特定部分基本上是一個瓶頸(糟糕的設計),並且大量的數據將在那裏結束。 – 2009-11-04 03:52:42

    +0

    我只是建議使用數據庫支持的集合(Kevin Bourrilion的建議和我的組合),但在閱讀完更新的問題之後,它看起來像您自己發現的其他解決方案之一就是這樣做的。 – rob 2009-11-05 01:43:11

    1

    將它備份到數據庫並對項目進行延遲加載。

    一個ORM框架可能是有序的。這取決於你的使用情況。這可能是相當直接的,或者是你的噩夢中最糟糕的事情,很難從你所描述的內容中分辨出來。

    我是樂觀主義者,我認爲使用ORM框架(如Hibernate)將解決您的問題在3 - - 5日

    +0

    順便說一句,您必須在迭代它們時移除項目,否則它們將仍然保留在內存中。 :) – OscarRyz 2009-11-04 01:33:30

    +0

    迄今爲止最好的主意。讓SQL的神奇處理任何搜索或掃描!還取決於您的更新如何引起爭議,這使得解決方案可以跨越多臺機器進行擴展。 – 2009-11-04 02:38:35

    0

    我還要問,爲什麼你需要加載所有內存中的數據的來處理它。通常,您應該能夠在加載時執行處理,然後使用結果。這將保持實際數據不滿內存。

    +0

    需要對數據進行合計操作。 – 2009-11-04 03:53:36

    +0

    您可以在加載數據時進行聚合。 Interator iter = ... int sum = 0; (iter.hasNext()){ sum + = iter.next(); } return sum; – 2009-11-04 04:39:17

    +0

    這比簡單的總和更復雜。背後有什麼和什麼時候對數據進行操作有着廣泛的邏輯。 (該領域是各種金融工具的金融貿易會計)。 – 2009-11-04 12:20:35