GNU parallel (グヌー・パラレル) は、Unix系OSのコマンドラインユーティリティである。Unixシェル上でコマンドの並列実行を可能にする。Ole Tange によってPerl言語で作られ、GNU GPL v3+の下で配布されている。

使用方法

最も一般的な使用方法は、sh スクリプトの for の置き換えであり、以下はその例である。

for x in $(cat list) ; do do_something "${x}" done | process_output

このコマンドは以下のように置き換えることができる。

cat list | parallel do_something | process_output

do_somethingの引数となるファイルの一覧 (list) は、パイプによって入力される。また、process_outputが空の場合がある。

GNU parallel を使用するスクリプトは、を使用するスクリプトよりも可読性が高いものになる。

GNU parallel では、以下のような処理が行われる。 並列実行しているジョブの出力が実行されること防ぐために、標準出力と標準エラー出力のグループ化。 出力先の順序を入力元の順序と同じ順序にする。 スペース・引用符・アンパサンド・UTF-8でエンコードされた文字などの特殊文字を適正に処理。

デフォルトでは、CPUのコア数と同数のジョブが並列実行される。

実行例 find . -name "*.foo" | parallel grep bar

上記のコマンドは以下のコマンドと同等である。

find . -name "*.foo" -exec grep bar {} +

これらのコマンドは、カレントディレクトリとそれ以下に存在する全てのファイルとディレクトリで名前が『.foo』で終わるものを検索し、その中で名前に『bar』を含むものを更に検索するものである。parallelは、ファイル名に改行が含まれていない限りは正常に動作する。ファイル名に改行が含まれている場合は以下のコマンドによって問題を回避する。

find . -name "*.foo" -print0 | parallel -0 grep bar

上記のコマンドは、ヌル文字によってファイル名を区切っている。

find . -name "*.foo" | parallel -X mv {} /tmp/trash

上記のコマンドは、引数の位置を{}によって変更している。

find . -maxdepth 1 -type f -name "*.ogg" | parallel -X -r cp -v -p {} /home/media

上記のコマンドは以下のコマンドと同等である。

cp -v -p *.ogg /home/media

上記のコマンドよりもfindとparallelとcpを使用している実行例の方がリソース効率がよく、『*.ogg』に一致するファイルが膨大な場合に発生するシェルへの過負荷によるエラーを防ぐことができる。

脚注

関連項目

xargs

外部リンク

コマンドを並列に実行するGNU parallelがとても便利 (はてなブログ 2014年8月10日) 「今日から使い切る」ための GNU Parallel による並列処理入門(2016年1月25日) 仕事や研究で使えるGNUParallelによる並列処理 (2020年07月23日)