'|' sort | sort -n 'コマンドと同じ基本マルチコアがあるかどうかを尋ねたい。
私は使用できることを知っています次のようなプログラム
split -l5000000 data.tsv '_tmp';
ls -1 _tmp* | while read FILE; do sort $FILE -o $FILE & done;
sort -m _tmp* -o data.tsv.sorted
ところで味がちょっと過度ですね。
答え1
GNUには次のフラグsort
があります--parallel
。
sort --parallel=8 data.tsv | uniq -c | sort --parallel=8 -n
これは、8つの同時プロセス/スレッドを使用して2つのソートステップをそれぞれ完了します。部品uniq -c
はまだ単一のプロセスを使用しています。
Stéphane Chazelasがコメントで指摘したように、GNU実装はすでにsort
並列化されているので(POSIXスレッドを使用する)、コア数より多いまたは少ないスレッドを使用したい場合にのみ、同時スレッドを変更するだけです。
sort
これにより、2番目のステップでは、最初のステップよりもはるかに少量のデータが得られるため、はるかにuniq
高速になります。
--buffer-size=SIZE
sumを使用してソートを高速化することもできます--batch-size=NMERGE
。sort
マニュアルを参照してください。
ソート速度をさらに向上させるには、一時ファイルを高速ファイルシステムに書き込む必要がありますsort
(複数の種類のリポジトリが接続されている場合)。TMPDIR
そのマウントポイントで書き込み可能なディレクトリパスに環境変数を設定するか、を使用してこれをsort -T directory
実行できます。
答え2
私にとってはこれが速いです。 YMMV(重複項目数によって異なります):
parallel --lb --pipepart --block 15m -a /tmp/big.file 'sort | uniq -c' |
awk '{ count[$2] += $1 } END { for(elem in count) print count[elem], elem }' |
sort -n