給定的大型數據集不適合內存,是否有任何庫或API在Java中執行排序? 該實現可能類似於Linux實用程序排序。基於文件的合併在Java中的大型數據集上排序
10
A
回答
14
Java提供了一個通用的排序程序,可以用作問題的更大解決方案的一部分。到過大,無法全部裝入內存中的數據進行排序的常用方法是這樣的:
1)閱讀儘可能多的數據將適用於主內存,讓我們說這是1千兆
2)快速排序是1 GB(這裏就是你會使用從集合框架Java的內置排序)
3)編寫整理的1 Gb到磁盤「塊-1」
4)重複步驟1-3,直到你瀏覽了所有數據,將每個數據塊保存在一個單獨的文件中。因此,如果您的原始數據是9 Gb,現在您將有9個標記爲「塊-1」的數據塊通過「塊-9」
5)您現在只需要最終合併排序來合併9個排序的塊整合到一個完全排序的數據集中。合併排序將對這些預先排序的塊非常有效地工作。它基本上會打開9個文件讀取器(每個塊一個),另外還有一個文件寫入器(用於輸出)。然後比較每個讀取文件中的第一個數據元素並選擇寫入輸出文件的最小值。從中選擇的值的讀者進入其下一個數據元素,重複9路比較過程以找到最小值,再次將答案寫入輸出文件。重複此過程,直到從所有塊文件中讀取所有數據。
6)一旦第5步已經讀完了所有你做的數據 - 你的輸出文件現在包含一個完全排序的數據集
通過這種方法,你可以很容易地編寫自己的通用「megasort」實用它採用文件名和maxMemory參數,並通過使用臨時文件有效地對文件進行排序。我敢打賭,你可以在這裏找到至少幾個實現,但是如果沒有,你可以像上面描述的那樣推出自己的實現。
0
處理大型數據集的最常見方式是在內存中(您現在可以購買1 TB的服務器)或數據庫中。
如果你不打算使用數據庫(或購買更多的內存),你可以很容易地寫出它自己。
有些庫可能會幫助執行Map-Reduce功能,但它們可能會增加比它們節省的更多的複雜性。
相關問題
- 1. 重新排列和合並基於天的序列數據集
- 2. 用於排序大型文本文件的多相合並排序
- 3. 插入和合並排序不適用於大數據集C++
- 4. 在兩個數據集中合併基於多於1列的數據集
- 5. 在一個數據集中混合並排序3個模型
- 6. 在大型數據集上使用多線程合併排序會遺漏某些元素的排序嗎?
- 7. 在數據庫中保存大型數據集的訂單並將其排序
- 8. 基於從redis排序的集合排序Django查詢集
- 9. 在Java中排序集合
- 10. 合併排序中的基本條件
- 11. Java中基於文件的數據庫
- 12. 基於模型屬性的排序骨幹集合
- 13. 在Java中合併排序
- 14. java ...基於集合
- 15. jcl排序除大型機數據集
- 16. C:僅適用於大文件的合併排序上的段錯誤
- 17. 排序集合的Java對象排序
- 18. java排序集合類型集合存在嗎?
- 19. TSQL大數據集合並
- 20. 在Java中的合併排序功能
- 21. 在java中合併排序的問題
- 22. Gui用於調試比較並行文件中的Java對象的大集合。
- 23. 排序基於Java中
- 24. Laravel排序合併集合
- 25. 基於uniqueidentifier數據類型列的排序數據
- 26. 用於大型數據集的嵌入式Java數據庫
- 27. 哪個集合用於排序的唯一數據集?
- 28. 排序Java集合對象基於一個領域它
- 29. 合併過程中的文件排序
- 30. 基於集合的數據結構
我用這種方法找到了一篇包含Java代碼的文章:http://www.codeodor.com/index.cfm/2007/5/10/Sorting-really-BIG-files/1194 – Franck 2011-06-11 16:37:38