どこでも見れるメモ帳

とあるSEの備忘録。何かあれば気軽にコメントください〜

xargsで並列処理


はじめに

コマンドライン引数を色々試したいけど,各処理がシングルスレッドで回って遅い…」という状況が生じたのでメモ.
対処法を簡単に言うと,xargsにより各処理をパラレルに処理することにより高速化する.
言ってしまえば,ターミナルを複数立ち上げて実行するのを1つのターミナルでやってしまうようなもの.

xargsによる並列処理

xargs -P

により,並列処理する.-Pは並列の意味.
並列数は-Pの後に記述する.-P8なら8並列化.
また,-P0とすれば並列数が自動的に決定される*1

具体的な方法

$ for ((param=0; param<10; param++)) ; do echo ./program $param >> commands.sh; done
$ cat commands.sh | xargs -P8 -I{} -t bash -c '{}'

1行目でスクリプトを作成し,
2行目で1行目のスクリプトを並列処理する.

これは,一行にまとめて

$ for ((param=0; param<10; param++)) ; do echo ./program $param >> commands.sh; done | xargs -P8 -I{} -t bash -c '{}'

としても勿論OKであるが,どんなパラメータで実行したのかログを残すという意味で
一旦shに書き出しておいたほうがいいのかも.

xargsの引数について補足すると,
-Iはパイプされた文字列を続く変数名に格納.ここでは変数名{}にコマンドを格納.
-tはxargsで実行したコマンドを標準出力.

*1:リソースを最大限使うように並列数を自動的に設定する