入力されたコマンド群を並列に実行するコマンド
TLDR
cat tasks.txt | parallel --jobs 40% --bar --joblog joblog.tsv --result parallel_logtasks.txtのそれぞれの行に実行したいシェルスクリプトを記入--etaimplies--progressand requiresparallelto 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/{/}
-jis 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.txtinto chunks of 10000 lines and pipe each of them intohoge.pythrough pipe
Pattern 3: Many parameters to test
TODO