2017-05-08 122 views
-3

我想處理從配置元表(數百萬行)導入的大量行。作爲輸出它會更多。 如果某些條件有效,我需要生成新行。但這不是問題。問題是如何存儲這些配置單元行。 在這一刻,我使用對象的ArrayList,因爲順序對於我的插入新行的算法非常重要,但是我得到了「GC超出的開銷限制」。處理大量的java對象

回答

0

您應該一次檢索一頁結果到新的ArrayList中,處理該結果頁中的行,根據需要編寫新行,然後將下一個結果頁加載到新的ArrayList中。垃圾收集(GC)將清理較舊的ArrayList。

結果的排序應在數據庫查詢中使用「ORDER BY」子句。

如果您插入到同一個表中並且想要避免重新處理正在添加的行,那麼您需要在表上添加一列來區分新行和現有行 - 例如自動遞增的「id」或「date_created」。

+0

謝謝你的回答@達倫肯尼迪。我不知道如何選擇行,並確保我的比較中不會丟失任何東西。例如,我有一個日期列,以字符串形式存儲,並且我必須查找下一個日期,以便與另外兩列的值相同。希望我已經清楚了...... – user0221

+0

@ user0221也許發佈了關於如何將查詢作爲新的SQL問題編寫的問題。 –

0

我想處理從配置單元表導入的大量行...但我得到了「GC超出的開銷限制」。

這裏有幾個選項。正如@DarrenKennedy所提到的,如果有一種方法一次只處理一個頁面,那麼這將是最優的,但是由於自定義排序,聽起來這不是一個選項。

所以,你有兩種可能性:

  • 增加內存的大小,以適合所有行。我懷疑這也不是一種選擇,但我想我會說出來。

  • 在內存中處理批處理,將其寫入磁盤,然後在最後處理批處理文件。見下文。

要你將需要閱讀了一堆你的輸入行,將輕鬆裝入內存,排序和篩選它們,然後寫每個束出自己的本地臨時文件批量處理。如果您正在使用雲系統,那麼臨時存儲對此很有幫助。

一旦處理完所有的配置單元輸入行,將它們排序並將它們寫入一堆臨時文件中,那麼您將需要返回並讀取並處理進行插入排序的排序行。這裏有一些僞代碼:

  1. 使用BufferedReader等打開所有臨時文件。
  2. 閱讀所有文件的第一行。
  3. 輸出所有臨時文件的最低行。閱讀該文件的下一行。
  4. 重複此過程,直到處理完所有臨時文件。
  5. 關閉並刪除臨時文件。

希望這會有所幫助。