2010-10-01 90 views
1

我有一個非常大的字符串,當我用Java讀取它時,出現內存不足錯誤。實際上,我需要將所有這些字符串讀入內存,然後分割成單獨的字符串並根據值進行排序。這樣做的最佳方式是什麼?將長字符串讀入內存

感謝

+4

你提供最大的內存限制爲VM參數如:-Xmx500m.Which會允許你的內存爲500 MB,爲您的程序。 – Emil 2010-10-01 04:39:49

+0

我的意思是數據難以適應我的記憶。 – Boolean 2010-10-01 04:43:52

+0

嘗試內存映射files.Though我不知道如何做你的情況,因爲它不清楚你的實現是如何。 – Emil 2010-10-01 05:00:38

回答

4

哪裏你的大字符串來自堆的大小?正如你所說的那樣,我認爲它來自一個文件。你是否需要知道整個字符串以知道在哪裏分割它?如果沒有,你可以直接讀取char字符,直到你點擊一個分割標記,把所有字符都讀到字符串中,然後開始讀取下一個字符串。你會粗略地知道在哪裏對剛讀過的單個字符串進行排序嗎?如果是這樣,您可以在第一次運行時編寫部分字符串來分隔文件(例如,當您按字母順序對字符串進行排序時,所有以字母A開頭的字符串轉到A.tmp)。之後,您可以對(創建文件的內容)(希望現在足夠小以適應您的內存)進行排序,並最終將內容附加到新的輸出文件。

2

如果你是受內存限制,那麼你可以嘗試申請其他歸併排序增加使用虛擬機參數-Xmx和-Xms

1

如果您希望Hadoop能夠「逐行」處理100 GiB apache日誌文件,您的操作基本上與您想要的一樣:將大量文本拆分爲多個部分。

這樣做,在Hadoop的(如您標記這個問題)的正常方式是使用它使用LineRecordReader它使用LineReader到文本文件分割的「結束行」分離的TextInputFormat。你想要的東西基本上與一個區別相同:拆分不同的東西。

對結果值(在Hadoop中)進行排序基本上是通過使用所謂的「Secondary Sort」(See the Hadoop examplethe explanation in Tom's book)來完成的。

所以,我建議做是

  1. TextInputFormat/LineRecordReader/LineReader讀取並提取基於您的字符串的各個部分分離器自己的變化。
  2. 創建一個映射,重寫信息以進行二級排序。
  3. 創建正確的分區,組和鍵比較器類/方法進行排序。
  4. 創建一個reduce,您可以在其中收到您可以進一步處理的排序信息。

HTH

0

你可以看一下 External sorting algoritmhs

+0

是的,但在這個細節層次上進入這種算法是我寧願留給像Hadoop這樣的框架的實現者。 – 2010-10-01 12:57:11