xargs の -P オプションを使うと複数のプロセスを並行して処理することができる。
xargs の主な使い方は以下のとおり。
- $ xargs (各種オプション) (実行したい処理の本体) という順番
- -t オプションで xargs の実行内容を表示
- -L オプションで (実行したい処理の本体) に与える引数の数を指定できる。
- -n オプションで引数にファイルを指定した場合に何要素ずつ(「何行ずつ」と言い換えても良いかと)読み込むかを指定
- -P オプションで並行処理させるプロセスの最大数を指定する
例えば、(実行したい処理の本体)として Sample.pl というのがあるとして、Sample.pl が -l オプションで指定したファイルから順繰り1行ずつ読み込んだ行を引数に取って処理を行う場合。
データが入ってるファイルを data.txt とする。
並行処理のプロセス数は3に設定。
$ cat data.txt | xargs -t -n 1 -L 1 -P 3 Sample.pl -l Sample.pl -l (data.txt の中身) Sample.pl -l (data.txt の中身) Sample.pl -l (data.txt の中身) ...
もう一例。
カレントディレクトリに data_1.txt, data_2.txt, data_3.txt ・・・のように複数のファイル(ここでは暫定的に5個のファイルがあるとする)があって、Sample.pl は -f オプションでファイルを丸ごと受け取って処理を行う場合。
# Sample.pl がファイルごと読み込むので -n は要らない $ ls data_*.txt | xargs -t -L 1 -P 5 Sample.pl -f Sample.pl -f data_1.txt Sample.pl -f data_2.txt Sample.pl -f data_3.txt Sample.pl -f data_4.txt Sample.pl -f data_5.txt
xargs の難点は -P に上限のプロセス数を指定してあげないといけないところなんだけど、全体が分かっている作業で「プロセス数をキャップする」と前向きに捉えて使ってる。
Mac OS X にプリインストールされてるから気軽に使える点もGood。
$ which xargs /usr/bin/xargs
参考: