Unix
部分有序數據集的 Unix 排序
所以我有一個非常大的文件(大約 10GB)並且需要對它進行排序,就像使用“排序”實用程序一樣,但更有效。
問題是,我沒有記憶體、CPU 能力、時間,也沒有可用的交換空間來支持整個排序。
好消息是文件已經部分排序(我可以說每一行與其最終位置的距離小於某個值 N)。這讓我想起了經典的電腦類範例,即為此目的使用堆大小為 N 的堆排序。
問題:是否有一些 unix 工具已經可以有效地做到這一點,或者我需要自己編寫一個程式碼?
謝謝-mk
將文件分成更小的部分並對其進行排序會更容易。分開:-
split --lines=100000 large_file file_part.
然後使用普通排序對每一個進行排序
for suffix in `ls file_part.* | cut -f2 -d.` do sort file_part.${suffix} > file_sorted.${suffix} done
然後您可以通過合併排序組合
sort -m file_sorted.*
這在您的機器上應該容易得多。
排序,是使用和 R-way 歸併排序算法。完成工作的最快方法是:
sort myfile
這意味著 O(n logn) 時間複雜度和 O(n) 時間。
如果您對數據進行分區,您可能會按時間付費。
上面的程式碼有問題。with sort -m 不保證文件是相互排序的。
來自unix手冊:
-m, --merge merge already sorted files; do not sort
例如
文件 1:abcklq 文件 2:dem
sort -m file1 file2
abcklqdem
這不是排序。
此外,元素位於小於 N 的位置這一事實並不能保證上述程式碼的排序輸出:
文件: aebcdhfg
在文件 N=3 中,所有元素都比它們的正確位置少 3 個位置
文件 1:hfg,文件 2:bcd,文件 3:ae
sort file1
產生:
文件 1:fgh,文件 2:bcd,文件 3:ae
和
sorm -m file3 file2 file1
輸出:
aebcdfgh
這是錯誤的。