マルチコアに対応する '| uniq-c | 'コマンド

マルチコアに対応する '| uniq-c | 'コマンド

'|' 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=SIZEsumを使用してソートを高速化することもできます--batch-size=NMERGEsortマニュアルを参照してください。

ソート速度をさらに向上させるには、一時ファイルを高速ファイルシステムに書き込む必要があります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

関連情報