2017-06-17 70 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中的一行。如果你有兴趣共同资助这一发展,请告诉我。