xargsで並列処理
はじめに
「コマンドライン引数を色々試したいけど,各処理がシングルスレッドで回って遅い…」という状況が生じたのでメモ.
対処法を簡単に言うと,xargsにより各処理をパラレルに処理することにより高速化する.
言ってしまえば,ターミナルを複数立ち上げて実行するのを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:リソースを最大限使うように並列数を自動的に設定する