find
やgrep
のようなコマンドは、並行して実行すると非常に役立ちます。コマンドを引数として受け取り、それぞれがディレクトリツリーのサブセットでコマンドの複数のスレッドを実行することにより、コマンドを並行して実行するユーティリティまたはプログラムはありますか?
GNU xargs
には-P
そのためのコマンド。
find . ... -print0 | xargs -r0P4 -n10 some-command
4まで実行されますsome-command
s一度に最大10個のファイルを引数として使用します。
実際、find
やgrep
のようなコマンドは、ほとんどの場合IOバウンドです。ディスクがボトルネックであり、CPUではありません。このような場合、複数のインスタンスを並行して実行すると、I/O帯域幅とキャッシュをめぐって競合するため、速度が低下します。
よりCPUを集中的に使用するコマンド、またはまれなケース(たとえば、低速のCPUと一緒にビジー状態ではない非常に高速のRAID-1)を使用すると、 GNU parallel などのツールを使用できます。または -P
option 最近のバージョンのGNU xargs。
ファイル名に改行が含まれていないと仮定すると、次のコマンドは、2つの並列スレッドを使用して各ファイルでcpu_intensive_command
を順番に呼び出します。
find -type f | xargs -I {} -P 2 cpu_intensive_command {}
find -type f | parallel -X --number-of-cpus=2 cpu_intensive_command {}
別の戦略は、作業を2つの部分に分割して、ほぼ等しいと見積もることです。これには特別なツールは必要ありませんが、プロセッサ間でジョブのバランスを取ることはありません。
cpu_intensive_command [a-m]* &
cpu_intensive_command [!a-m]*
wait
GNU Parallelのチュートリアル: http://www.gnu.org/software/parallel/parallel_tutorial.html をウォークスルーし、紹介ビデオをご覧ください: https ://www.youtube.com/playlist?list = PL284C9FF2488BC6D1