Bye Bye Moore

PoCソルジャーな零細事業主が作業メモを残すブログ

GNU parallelコマンドで並列実行する

shuzo-kino.hateblo.jp
と似たような話。
GNUのparalellコマンドは文字通り実行を並列にやるコマンドです。
本来の意図として、公式では以下のように説明されています。

GNU parallel is a shell tool for executing jobs in parallel using one or more computers.
The typical input is a list of files, a list of hosts, a list of users, a list of URLs, or a list of tables.

要するに複数のファイル、複数台のPCから結果を集約するだとか、いろんなサイトから値を集めるなんて用途でも使う様子。
今回は単純に標準出力をパイプで繋いだケースで考えます。

実際のところ

導入

WSLのデフォでは入っていないので

$ sudo apt install parallel

使い方

seqの結果をprintfと組み合わせる事を考えます。
そのまんまパイプでつないでも、以下のように一行目で終わります。

$ seq 1 10 | printf "%d--"
0--

なのでインライン展開で以下のように書く事が多いかなと。

$ printf "%d--" `seq 1 10 `

ここで、paralellコマンドを使ってみます。
xargsのように、自身の引数にお目当てのコマンドをつなぐかんじ。
標準入力は"{}"で受け取ることができます。

$ seq 1 10 | parallel printf "%d--" {}
1--2--3--4--5--6--7--8--9--10--

まぁこんなもんだと全く旨味がありませんが、parallelに任せるコマンドが重い場合や、そのそもコマンドが他の機体に依存する場合は効果を発揮します。

"-X"オプションでプロセスを複数起動しないようにする。

デフォではいくつか同じコマンドが動く羽目になるならしいので、プロセスを複数起動しないxargs的挙動にするなら”-X”オプションを。
こんな短いので有意に速度が変わって見えるので、重いコマンドなら余計にそうでしょう。

$ seq 1 10 | parallel -X printf "%d--" {}
1--2--3--4--5--6--7--8--9--10--

xargs -Pで並列化できる

一つの巨大なファイルを分割処理したい場合はxargs -Pでマルチプロセスのxargsの方が有効なこともある様子。
Parallel processing with unix tools