回答
哪裏你的大字符串來自堆的大小?正如你所說的那樣,我認爲它來自一個文件。你是否需要知道整個字符串以知道在哪裏分割它?如果沒有,你可以直接讀取char字符,直到你點擊一個分割標記,把所有字符都讀到字符串中,然後開始讀取下一個字符串。你會粗略地知道在哪裏對剛讀過的單個字符串進行排序嗎?如果是這樣,您可以在第一次運行時編寫部分字符串來分隔文件(例如,當您按字母順序對字符串進行排序時,所有以字母A開頭的字符串轉到A.tmp)。之後,您可以對(創建文件的內容)(希望現在足夠小以適應您的內存)進行排序,並最終將內容附加到新的輸出文件。
如果你是受內存限制,那麼你可以嘗試申請其他歸併排序增加使用虛擬機參數-Xmx和-Xms
如果您希望Hadoop能夠「逐行」處理100 GiB apache日誌文件,您的操作基本上與您想要的一樣:將大量文本拆分爲多個部分。
這樣做,在Hadoop的(如您標記這個問題)的正常方式是使用它使用LineRecordReader它使用LineReader到文本文件分割的「結束行」分離的TextInputFormat。你想要的東西基本上與一個區別相同:拆分不同的東西。
對結果值(在Hadoop中)進行排序基本上是通過使用所謂的「Secondary Sort」(See the Hadoop example和the explanation in Tom's book)來完成的。
所以,我建議做是
- 就TextInputFormat/LineRecordReader/LineReader讀取並提取基於您的字符串的各個部分分離器自己的變化。
- 創建一個映射,重寫信息以進行二級排序。
- 創建正確的分區,組和鍵比較器類/方法進行排序。
- 創建一個reduce,您可以在其中收到您可以進一步處理的排序信息。
HTH
你可以看一下 External sorting algoritmhs
是的,但在這個細節層次上進入這種算法是我寧願留給像Hadoop這樣的框架的實現者。 – 2010-10-01 12:57:11
- 1. 將網站內容讀入字符串
- 2. 可能將字符串讀入C中的共享內存?
- 3. 通過分隔符將長字符串潛入小字符串
- 4. 將字符串寫入字符指針時的內存行爲
- 5. 內找到長字符串
- 6. 寫入/讀取字符串陣列到內部存儲器android
- 7. 將非常量C字符串讀入字符串類
- 8. 將內存流讀入字節數組
- 9. 將只讀字符串插入到jTextArea
- 10. vb listview - 將值讀入字符串
- 11. 將文件讀入字符串 - Java
- 12. Javascript將html從url讀入字符串
- 13. 將os.popen(命令)讀入字符串
- 14. 在字符串內存儲字符串?
- 15. 讀寫字符串 - 內部
- 16. 字符串寫入到內存流
- 17. 如何將鏈接腳本的內容讀入字符串?
- 18. 讀取字符串的字符時出錯。分配內存
- 19. 讀取一個字符串並將其存入(int)中C
- 20. 將文件讀入內存?
- 21. 將CSV讀入內存
- 22. 麻煩讀取字符串長度
- 23. 將字符串讀入字符數組,然後獲取字符串的大小
- 24. 長字符串
- 25. 龜etc():讀取和存儲未知長度的字符串
- 26. 將字符從一個字符串讀入一個數組
- 27. C:將字符串文件讀入字符數組*
- 28. 如何將多字輸入讀入一個字符串?
- 29. 能在不長的CIN輸入讀取到一個字符串
- 30. 無法插入字符串或只讀緩衝區,不長
你提供最大的內存限制爲VM參數如:-Xmx500m.Which會允許你的內存爲500 MB,爲您的程序。 – Emil 2010-10-01 04:39:49
我的意思是數據難以適應我的記憶。 – Boolean 2010-10-01 04:43:52
嘗試內存映射files.Though我不知道如何做你的情況,因爲它不清楚你的實現是如何。 – Emil 2010-10-01 05:00:38