web-dev-qa-db-ja.com

入力ディレクトリツリーを分割して実行可能ファイルを並行して実行する

findgrepのようなコマンドは、並行して実行すると非常に役立ちます。コマンドを引数として受け取り、それぞれがディレクトリツリーのサブセットでコマンドの複数のスレッドを実行することにより、コマンドを並行して実行するユーティリティまたはプログラムはありますか?

1
Abdul

GNU xargsには-Pそのためのコマンド。

find . ... -print0 | xargs -r0P4 -n10 some-command

4まで実行されますsome-commands一度に最大10個のファイルを引数として使用します。

2

実際、findgrepのようなコマンドは、ほとんどの場合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

0
Ole Tange