合理的なスケーラビリティの制限は何ですかsort -u
? (「行長」、「行数」、「総ファイルサイズ」単位)
「行数」がこのサイズを超えるファイルに対するUnixの代替案は何ですか?
もちろん簡単に実装できますが、非常に少数の標準Linuxコマンドで実行できることがあるかどうか疑問に思います。
答え1
これsort
はから来ていますコアツールカプセル化と実装外部R-Wayマージ。データをメモリで処理できる単位に分割し、ディスクに保存してマージします。マシンに対応するプロセッサがある場合、これらのブロックは並列に完了します。
したがって、制限がある場合は、sort
結果とマージする必要がある一時ファイルを格納するために使用できるディスク容量です。
答え2
ベンダー固有の実装については言えませんが、実装はUNIX sort
大きなファイルを小さなファイルに分割し、そのファイルをソートしてから、ソートされた小さなファイルを集計されたソート出力に結合します。
唯一の制限は、途中で作成される小さなファイルのディスク容量ですが、sort
環境変数を設定してファイルを任意のディレクトリにリダイレクトできますTMPDIR
。
答え3
に基づいて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
述べたスニペットが完了したことがわかります。外部R-Wayマージ。したがって、すべての実行後は次のようになります。
sort --parallel="$(nproc --all)" -u input > output
それだけで十分です。
コードをチェックせずに制限の現在の前提は次のとおりです。
- 最大行長は実際のメモリ量によって制限されます。ソートするには、メモリに少なくとも2つを配置する必要があります。
- 行数 - 分からない
- ファイルサイズ - もちろん、ファイルシステムによって決まります。
- 並列に開くファイルの数 - オペレーティングシステムによって異なります(ありがとう。ディオメデス・スピネリスこれを指摘してください! )
(この回答はタグ付けされています。コミュニティウィキ- 改善できるように励ましてください! :) )