xargsで並列処理

カテゴリ: プログラミング

1行に1つ、空白なしの引数を格納したテキストファイル argfile があるとして、
それぞれの引数に対してコマンド cmd を独立に実行したいとする。

$ cat argfile | xargs -n1 -P4 -I % cmd %

順番に処理すると時間がかかってしかたないが、xargs で並列処理が可能。

-n : コマンドに一度に渡す引数の個数の上限
-P : 同時に実行するプロセス数の上限 = 並列数
-I : 引数を表す記号を指定
     -I % cmd % で、stdin から読んだ引数が % に入る。
-d : stdin で読むテキストの分割に使う文字を指定

パスの通ったコマンドでなく、bashで定義した関数を使いたいときは、
export した上で bash を起動する。

$ cmd() { echo "Hello, $1!"; }
$ export -f cmd
$ cat argfile | xargs -n1 -P4 -I % bash -c "cmd %"

bashを呼んで実行させるので、用いる全ての関数を export -f する必要がある。
関数 cmd が内部で別の関数 cmd1 を呼んでいるような場合は、
export -f cmd cmd1 して、全てを export しなくてはならない。
また、シェルスクリプトを書いて並列処理させるような場合でも、
スクリプト中で定義した関数は xargs を使う前に
export しておかなければならない。

参考:

2013/1/23 (水)