入力されたコマンド群を並列に実行するコマンド

TLDR

cat tasks.txt | parallel --jobs 40% --bar --joblog joblog.tsv --result parallel_log
  • tasks.txt のそれぞれの行に実行したいシェルスクリプトを記入
  • --eta implies --progress and requires parallel to read all tasks before execution.
    • --bar--eta の強化版のようなもので、プログレスバーで進捗を表示する
    • --lb はコマンドの出力を随時画面に書き出す。 --bar とは相性が悪いが、結果を常に確認したいときに使う
  • --jobs で CPU 使用率を指定する代わりに -j 4 のようにすると並列処理数を直接指定できる
  • --halt now,fail=1 とすると 1 つでもジョブが失敗したらその時点で止める
  • --joblog joblog.tsv は履歴を保存しておける。更に以下のようにすることで再実行に使うことができる
    • --retry-failed --joblog joblog.tsv で失敗したタスク(エラーコードが非ゼロのタスク)だけをもう一度実行できる
    • --resume-failed --joblog joblog.tsv で失敗したタスク とまだ実行していなかったタスク を再実行できる
  • --results parallel_log
    • コマンド・標準出力・標準エラー出力がこのディレクトリ内にそれぞれ保存される

より高度な使い方

cf. 「今日から使い切る」ための GNU Parallelによる並列処理入門 | PPT (slideshare.net)

Pattern 1: Many files to process

ls orig/* | parallel -j 10 "mecab < {} > processed/{/}

  • -j is the number of jobs
  • {} is replaced with the path name e.g. orig/1.txt
  • {/} is replaced with the file name e.g. 1.txt

Pattern 2: Many lines in the file

cat original.txt | parallel --pipe -L 10000 "hoge.py" > processed.txt

  • Split original.txt into chunks of 10000 lines and pipe each of them into hoge.py through pipe

Pattern 3: Many parameters to test

TODO