Unix

部分有序數據集的 Unix 排序

  • March 24, 2011

所以我有一個非常大的文件(大約 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

這是錯誤的。

引用自:https://serverfault.com/questions/251228