xargs と parallel の使い分けについて

xargs と parallel の使い分けについて

xargsを使わずにparallelを使う理由

parallel を使う理由の一つに、xargsのプログレス状態を確認したいから。なんて理由が多いと思う。 もちろん xargs の -tオプションをいれて、xargsが何を走らせてるのか確認するというのもあるが、-verboseオプションみたいなもので、プログレスが使えるparallelを..と考える。

parallel がxargsより遅い理由

xargs と parallelの大きな違いは、xargs は コマンドを直接実行してくれるのに対して、parallelはchshのデフォルトのシェルを起動してから、そのシェル上で動かす。 つまり、以下のxargsとparallelは同じ意味になる。

xargs -I% bash -c "ls %";
parallel -I% ls %

それで、parallelを使うとオーバーヘッドが大きいなんて言われてるが、関数書いて実行させる場合は同じになる。

#!/bin/bash -l

hello(){
  echo "hello $1";
}

export -f hello;

cat name.txt | xargs -I% bash -c "hello %";

cat name.txt | parallel -I% hello %;

また、parallel ではメモリやCPUのスレッド数に応じて自動的にプロセスを管理してくれる機能がある。

なんでこんな事書いたかって

2-3時間程度の処理なら、xargsの方が早いが、2-3日レベルの処理の場合、parallelの方が早いて事に気づいた。