blog

マルチコアCPUでLinuxコマンドを高速化する方法

LinuxコマンドにすべてのCPUコアを使わせるには、GNU Parallelコマンドが必要です。このコマンドは、めったに使われない-pipesパラメータの助けを借りて、すべてのCPUコアに1つのマシ...

Jun 1, 2016 · 3 min. read
シェア

非常に大きなデータを計算しなければならないことはありませんか?あるいは、その中で検索したり、並列処理できないような処理をしたことがありますか?データの専門家の皆さん。あなたは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 

...その後、パイプラインを使って出力を指定したファイルに保存できます。

Read next

Google パスワード変更 保存方法 Chrome 隠しパスワード

現在、グーグルはブラウザのパスワード管理方法を変更しようとしています。Mac版Chromiumの最新バージョンでは、パスワードマネージャーを導入し、Firefoxのマスターパスワードと同様のローカルパスワード保護機能を追加しました。

May 31, 2016 · 1 min read