GNUパラレルタイムスタンプ出力

GNUパラレルタイムスタンプ出力

Perlプログラマとして私は--tagstringを使うのがかなり簡単だと思いましたが、基本的にParallelで個々に各タスクの各出力行にタイムスタンプを付けたいと思います。同様に、正しい「STUFF」置換を使用すると、ミリ秒の解像度を想定すると、出力は次のようになります(ナノ秒の解像度も問題ありません)。

$ seq 8 | parallel --tags 'sequence {} {=STUFF=}' -j2 'sleep=$((1 + RANDOM % 2)); echo sleeping $sleep; sleep $sleep; echo done; echo $sleep {#} {%} {}'
sequence 1 0.001   sleeping 1
sequence 1 1.001   done
sequence 1 1.002   1 1 1 1
sequence 2 0.001   sleeping 2
sequence 2 2.001   done
sequence 2 2.002   2 2 2 2
sequence 3 0.001   sleeping 2
sequence 3 2.001   done
sequence 3 2.002   2 3 1 3
sequence 5 0.001   sleeping 1
sequence 5 1.001   done
sequence 5 1.002   1 5 1 5
sequence 4 0.001   sleeping 2
sequence 4 2.001   done
sequence 4 2.002   2 4 2 4
sequence 6 0.001   sleeping 1
sequence 6 1.001   done
sequence 6 1.002   1 6 1 6
sequence 7 0.001   sleeping 2
sequence 7 2.001   done
sequence 7 2.002   2 7 2 7
sequence 8 0.001   sleeping 2
sequence 8 2.001   done
sequence 8 2.002   2 8 1 8

ベストアンサー1

あなたはそれが簡単だと思うものに騙されても、私はそれについてあなたを責めることはできません。

ただし、通常の出力はできません。

これは、トークン文字列が2回だけ評価され、追加のみされるためです。後ろに作業が完了しました。

GNU並列実行:

job1 > tmpout1 2> tmperr1
job2 > tmpout2 2> tmperr2
job3 > tmpout3 2> tmperr3

(もちろん100%正確ではありませんが、十分近いです。)

ジョブが完了すると、GNU Parallel はtmp*ファイルをチャンク単位で読み込み、ジョブの--tagstring前に追加して出力します。

ここで重要な部分は次のとおりです。タグはいいえ走りながら完成しました。そして、--tagstringジョブが開始される前とジョブが完了した後(追加される最終結果)は2回だけ計算されます。

この設計は、タグ文字列の計算がCPU集約的で出力が3600000行の場合、行当たり1msの遅延でも1時間(!)の待ち時間が発生するために選択されました。

しかし、1つの例外があります--line-buffer

--line-buffer する各出力ラインのラベル文字列を計算します。この設計はすでにCPU時間を費やしているため、選択されています--line-buffer(実行中のすべてのジョブで新しいデータをポーリングする必要があり、大量のデータを処理できません)。

だからこれはうまくいきます:

$ seq 8 | parallel --lb --tagstring 'sequence {} {= $start{$job}||=::now(); $_=sprintf"%06.3f",::now()-$start{$job} =}' -j2 'sleep 1; echo Begin {}; sleep 0.{}; echo End {}'|sort
sequence 1 01.027       Begin 1
sequence 1 01.116       End 1
sequence 2 01.024       Begin 2
sequence 2 01.216       End 2
sequence 3 01.098       Begin 3
sequence 3 01.312       End 3
sequence 4 01.049       Begin 4
sequence 4 01.411       End 4
sequence 5 01.031       Begin 5
sequence 5 01.509       End 5
sequence 6 01.039       Begin 6
sequence 6 01.613       End 6
sequence 7 01.048       Begin 7
sequence 7 01.711       End 7
sequence 8 01.071       Begin 8
sequence 8 01.811       End 8

おすすめ記事