2017-06-17 71 views
1

我想使用GNU並行來幫助我處理一些遠程文件,我不想在本地保存。GNU並行輸出到標準輸出使用 - round-robin

我的命令看起來有點像:

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參數,所有參數都按預期工作。

所有數據都保存在哪裏?我有辦法將它打印到stdout,一行一行,沒有緩衝?

回答

1

所有數據都保存在哪裏?

從GNU並行所有緩衝的輸出被緩衝在臨時文件中$ TMPDIR/--tmpdir默認爲/tmp。你不能看到這些文件,因爲它們被立即刪除(但保持打開狀態),以避免你必須清理,如果GNU並行被終止。

我是否有一種方法來打印到stdout,一行行,

--line-buffer

無緩衝?

-u禁用所有緩衝,但不能保證一行一行。

--line-buffer/tmp中的全部數據進行緩衝,但在有滿行時輸出數據。

當前GNU並行不能只有緩衝行。所以雖然--line-buffer一行一行地輸出,但它仍然緩衝磁盤上的完整文件。

這是一個問題,如果您打算使用大於可用磁盤空間的--round來處理數據。一種解決方法是使用--compress,它將在/tmp上寫入數據之前壓縮數據。

另一個解決方法是使用parcatparcat確實cat平行但行緩衝它是GNU並行的部分。):

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並行擴展爲只緩存RAM中的一行。如果你有興趣共同資助這一發展,請告訴我。