我需要排序大量的二進制文件,將不適合內存。使用排序算法並不斷地從I/O設備讀取/寫入是不行的。有沒有可能使用類似內存映射文件的東西?C++排序巨大的二進制文件
回答
這是一個解決的問題,因爲這wiki頁面上解釋說:http://en.wikipedia.org/wiki/External_sorting
基本上,在某些設定金額看,排序,保存到一個文件中,並重復。 然後,從每個文件中讀取較小的數量,對這些數據進行排序,然後繼續執行。
UPDATE:
你可能想看看他使用的Java代碼,這聽起來像他解決了你所需要的。
http://www.codeodor.com/index.cfm/2007/5/10/Sorting-really-BIG-files/1194
如果他們不適合內存,他們將不適合到內存中,而這幾乎是。您無法將內存映射超出內存限制 - 排序算法一次需要所有數據。
但是,您可以編寫專門的排序算法。例如,如果按字節排序,則應該能夠以塊爲單位遍歷文件,計算每個字節的出現次數,然後按順序排列它們。這也可以適用於只要有大量重複數據被發現的情況下對每個較大類型進行排序的情況。
一種策略是用快速排序或其他一些快速的內存排序算法的大塊它排序,然後做一個合併排序這些塊。
其實你只需要合併這些塊,完整的合併將會是浪費。 –
@Thomas Jungblut:如果你有很多塊,你真的不想合併它們。相反,您希望以與mergesort相同的模式遞歸合併塊。 – btilly
使用內存映射文件應該可以工作。它需要適合您的地址空間(32位爲〜2Gb)或LOTS(如果是64位)。映射文件的
頁面將以/進行替換爲你訪問它們,就像虛擬交換文件,所以它應該工作。
這可能會起作用,但您仍然需要適當選擇排序算法,以確保您不會進行大量的磁盤I/O操作。具體而言,您需要避免在文件中跳轉,而是對整個頁面進行排序,然後合併它們,這是正常的外部排序算法無論如何都會執行的操作。 –
- 1. 巨大的二進制文件與objcopy
- 2. C++排序二進制文件
- 3. 排序二進制文件
- 4. 巨大的二進制文件的大小,而LD鏈接
- 5. 限制巨大二進制數據文件的gnuplot圖
- 6. 如何確定C++中一個巨大的二進制文件的大小
- 7. 加載巨大的二進制文件部分到Matlab
- 8. 如何只選擇一部分巨大的二進制文件?
- 9. ld連接器腳本產生巨大的二進制文件
- 10. C - 氣泡排序程序二進制文件
- 11. 二進制文件大小
- 12. 圖書館的iOS分裂巨大的二進制文件的特定大小?
- 13. 二進制到十進制(在巨大的數字上)
- 14. 二進制搜索升序排列C++
- 15. C++二進制文件
- 16. 在一個二進制文件中的C++多個大文件
- 17. 爲什麼C++ Hello World二進制文件大於等效的C二進制文件?
- 18. C二進制文件與ascii文件
- 19. haskell和大的二進制文件
- 20. 有條件的C#二進制序列
- 21. C++中的二進制文件I/O
- 22. 二進制C++中的文件讀取
- 23. C二進制文件的表示
- 24. C時的讀數二進制文件
- 25. 讀取C中的二進制文件
- 26. C++中的二進制文件
- 27. 的C++ socket二進制文件
- 28. c上的二進制文件
- 29. 對C/C++中的大文件二進制數據進行的邏輯運算
- 30. 編寫fortran從python排序的二進制文件
爲什麼讀/寫連續不是一個選項?你需要隨機訪問嗎? – Macke
正如一個粗略的想法,你可能想看看被稱爲「在線算法」。基本上,這個想法是你可以對數據進行排序,因爲你一個接一個地接收數據。例如,請參閱:http://en.wikipedia.org/wiki/Merge_sort#Utility_in_online_sorting –
回答這個問題,因爲它目前被問到:是的,有這樣的可能性。你應該問一個更好的問題。 – Dialecticus