Performance
‘sort -u’ 對巨大文件的可擴展性
什麼是合理的可擴展性限制
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}" > sorted-"{$inpf}" done sort -m sorted-input-* > sorted-input
更新:
從上面的答案我們看到
sort
已經做了提到的片段 - 即External R-Way merge。所以畢竟執行只是:sort --parallel="$(nproc --all)" -u input > output
應該足夠了。
我目前關於限制的假設(不檢查程式碼)是:
- 最大行長度受物理記憶體量的限制。排序需要將至少兩個放入記憶體
- 行數 - 我不知道
- 文件大小 - 當然由文件系統
- 並行打開文件的數量 - 取決於作業系統(感謝Diomidis Spinellis指出這一點!)
(這個答案被標記為社區 wiki - 鼓勵改進它!:))