2017-06-17 8 views
1

ローカルに保存したくないリモートファイルを処理するのにGNU Parallelを使用しようとしています。--round-robinを使ってGNUパラレル出力をstdoutに出力する

私のコマンドは多少のようになります。いくつかの入力ライン用

python list_files.py | \ 
    parallel -j5 'aws s3 cp s3://s3-bucket/{} -' | \ 
    parallel -j5 --round --pipe -l 5000 "python process_and_print.py" 

process_and_print.pyプリント出力が、その出力は私が期待すぐのようにstdoutに取得していない、プロセスされた後の代わりに私が唯一の出力を参照してください終了しました。 --roundパラメータを削除すると、すべて正常に動作します。

すべてのデータは保存されますか?バッファリングせずに、行単位で標準出力に出力する方法がありますか?

答えて

1

すべてのデータは保存されますか?

GNUパラレルからすべてのバッファされた出力は$ TMPDIR//tmpから--tmpdirデフォルトで一時ファイルにバッファリングされます。ファイルを見ることはできません。ファイルがすぐに削除されます(ただし、開いたままにしておく)ので、GNU Parallelが終了した場合には、クリーンアップする必要はありません。

--line-buffer

バッファリングせずに、私は、それが標準出力に行ずつ印刷する方法はありますか?

-uは、すべて一緒にバッファリングを無効にしますが、行単位では保証できません。

--line-bufferはフルデータを/tmpにバッファしますが、フルラインがある場合はデータを出力します。

現在のところ、GNUパラレルはしか使用できません。はバッファを1行だけバッファリングします。そのため、--line-bufferは行単位で出力されますが、ディスク上にはフルファイルがバッファされます。

--roundの空きディスク容量を超えるデータを処理する場合には、この問題が発生します。 1つの回避策は、/tmpに書き込む前にデータを圧縮する--compressを使用することです。

別の回避策は、(。parcatは平行であるが、ラインバッファリングでcatを行うことがGNUパラレルの一部である)parcatを使用している:

mkfifo fifo-{1..5} 
python list_files.py | 
    parallel -j5 'aws s3 cp s3://s3-bucket/{} -' | 
    parallel -j5 --round --pipe -l 5000 "python process_and_print.py >fifo-{%}" & 
parcat fifo-{1..5} 

これは一時ファイルにデータを保存避けることができます。

--line-bufferを使用すると、GNU Parallelを拡張してRAM内の1行だけをバッファすることができます。これの共同資金調達に興味がある場合は、教えてください。

関連する問題