Diary

Diary

日々学んだことをアウトプットする場として初めてみました

xargs で並行処理を行う

xargs で並行処理を行う

xargs では、-P オプションを使うことで並列に処理を進められます。

# -P2 の 2 の数は何個並列で走らせるかを表す
$ ... | xargs -P2

最大で走らせられる数の確認

プロセッサーの数を確認します。

# 以下ディレクトリのファイルの中身を見てプロセッサの数を確認 (linux)
$ cat /proc/cpuinfo

# 以下の変数でも確認できます
$ echo $(nproc)
4

上で調べた数を使うと、最大効率が出せると思われます。

その際は以下のようにコマンド置換を使うと、ハードによらず最適な数を指定できます

# 全ての .png ファイルを、convert を使って .jpg に変換する例
$ ls *.png | sed 's/\.png//' | xargs -P$(nproc) -I@ convert @.png @.jpg

確認

並列処理されていることを確認する

# 並列処理なし
## 1 + 2 + 3 = 6 秒かかる
$ time seq 3 | xargs -I@ sleep @
real    0m6.036s
user    0m0.001s
sys     0m0.044s

# 並列処理あり
## max(1 + 2 + 3) = 3 秒かかる
$ time seq 3 | xargs -P3 -I@ sleep @
real    0m3.025s
user    0m0.009s
sys     0m0.030s

おわりに

linux で並行で処理を使う機会はそうそうないかと思いますが、積極的に探して使っていきたいと思いました。

また、linux には他にも並行処理を実現する手段として、parallelコマンドなども有名なようです。こちらも機会があればふれてみたいと思います。