Performance

‘sort -u’ 對巨大文件的可擴展性

  • February 3, 2022

什麼是合理的可擴展性限制sort -u?(在“行長”、“行數”、“總文件大小”的維度中)

對於超過“行數”維度的文件,Unix 替代方案是什麼?

當然我可以很容易地實現一個,但我想知道是否有一些標準的 Linux 命令可以完成。

您在 Linux 上找到的sort來自coreutils包並實現了External R-Way merge。它將數據分成可以在記憶體中處理的塊,將它們儲存在磁碟上,然後合併它們。如果機器有處理器,這些塊是並行完成的。

因此,如果有一個限制,它是sort可用於儲存它必須合併的臨時文件的可用磁碟空間,並結合結果。

基於https://blog.mafr.de/2010/05/23/sorting-large-files/>和<https://unix.stackexchange.com/a/88704/9689

split -n l/20 input input-
for inpf in input-* ; do
   sort --parallel="$(nproc --all)" "${inpf}" &gt; sorted-"{$inpf}"
done
sort -m sorted-input-* &gt; sorted-input

更新:

從上面的答案我們看到sort已經做了提到的片段 - 即External R-Way merge。所以畢竟執行只是:

sort --parallel="$(nproc --all)" -u input &gt; output

應該足夠了。

我目前關於限制的假設(不檢查程式碼)是:

  • 最大行長度受物理記憶體量的限制。排序需要將至少兩個放入記憶體
  • 行數 - 我不知道
  • 文件大小 - 當然由文件系統
  • 並行打開文件的數量 - 取決於作業系統(感謝Diomidis Spinellis指出這一點!)

(這個答案被標記為社區 wiki - 鼓勵改進它!:))

引用自:https://unix.stackexchange.com/questions/279096