非常に大きなデータを計算しなければならないことはありませんか?あるいは、その中で検索したり、並列処理できないような処理をしたことがありますか?データの専門家の皆さん。あなたは4コア以上のCPUを持っているかもしれませんが、 grep、bzip2、wc、awk、sedなどの 適切なツールはシングルスレッドで、1つのCPUコアしか使えません。
カートマンの言葉を借りれば、"このカーネルはどうやって使えばいいんだ?"。
LinuxコマンドですべてのCPUコアを使うようにするには、コマンドが必要です。spreadstdin)。こうすることで、CPUに均等に負荷が分散されます。
ビジップツー
bzip2はgzipよりも良い圧縮ツールですが、遅いです!投げないでください、これを解決する方法があります。
以前の練習
cat bigfile.bin | bzip2 --best > compressedfile.bz2
今はこれです:
cat bigfile.bin | parallel --pipe --recend '' -k bzip2 --best > compressedfile.bz2
特に bzip2 の場合、GNU parallel はマルチコア CPU 上で超高速です。気づかないうちに実行が終わっています。
グレップ
非常に大きなテキストファイルがある場合、おそらく以前はそうだったでしょう:
grep pattern bigfile.txt
今ならこれができます:
cat bigfile.txt | parallel --pipe grep 'pattern'
そうかもしれませんね:
cat bigfile.txt | parallel --block 10M --pipe grep 'pattern'
この2番目の使用法では、-block 10Mパラメータを使用しています。これは、カーネルごとに1,000万行が処理されることを意味します。このパラメータを使用して、CUPカーネルごとに処理されるデータ行数を調整できます。
オートホワイトバランス
awk コマンドを使って非常に大きなデータファイルを計算する例を示します。
通常使用:
cat rands20M.txt | awk '{s+=$1} END {print s}'
今はこれです:
cat rands20M.txt | parallel --pipe awk \'{s+=\$1} END {print s}\' | awk '{s+=$1} END {print s}'
並列コマンドの-pipeパラメータは、cat の出力を複数のチャンクに分割して awk 呼び出しに送ります。これらのサブ計算は 2 番目のパイプを通って同じ awk コマンドに送られ、最終結果を出力します。最初の awk にはバックスラッシュが 3 つありますが、これは awk の GNU 並列呼び出しに必要なものです。
世界座標系
ファイルの行数を数える最速の方法をお探しですか?
伝統的な慣習:
wc -l bigfile.txt
今はそうすべきです:
cat bigfile.txt | parallel --pipe wc -l | awk '{s+=$1} END {print s}'
非常に巧妙で、まず並列コマンドを使って大量の wc -l 呼び出しを「マッピング」してサブ計算を行い、それを最後に awk にパイプでつないで集計します。
セド
sedコマンドを使って巨大なファイルを大量に置換したいですか?
日常的な練習:
sed s^old^new^g bigfile.txt
今ならできます:
cat bigfile.txt | parallel --pipe sed s^old^new^g
...その後、パイプラインを使って出力を指定したファイルに保存できます。





