并行化 STDIN
现在,让我们假设我们有一个需要逐行转换的大文件(例如 30 GB)。假设我们有一个脚本 convert.sh
,就是这个 <task>
。我们可以将这个文件的内容管道传输到 stdin 并行接收和工作在诸如的块中
<stdin> | parallel --pipe --block <block size> -k <task> > output.txt
<stdin>
可以来自 cat <file>
等任何东西。
作为一个可重复的例子,我们的任务将是 nl -n rz
。拿任何文件,我的将是 data.bz2
,然后传递给 <stdin>
bzcat data.bz2 | nl | parallel --pipe --block 10M -k nl -n rz | gzip > ouptput.gz
上面的例子从 bzcat data.bz2 | nl
获取 <stdin>
,其中我将 nl
作为概念证明,最终输出 output.gz
将按照收到的顺序保存。然后,parallel
将 <stdin>
划分为大小为 10 MB 的块,并且对于每个块,它将它传递给 nl -n rz
,在那里它只是附加一个正确对齐的数字(有关详细信息,请参阅 nl --help
)。选项 --pipe
告诉 parallel
将 <stdin>
分成多个作业,-- block
指定块的大小。选项 -k
指定必须保持排序。
你的最终输出应该是这样的
000001 1 <data>
000002 2 <data>
000003 3 <data>
000004 4 <data>
000005 5 <data>
...
000587 552409 <data>
000588 552410 <data>
000589 552411 <data>
000590 552412 <data>
000591 552413 <data>
我的原始文件有 552,413 行。第一列表示并行作业,第二列表示以块的形式传递给 parallel
的原始行号。你应该注意到第二列(以及文件的其余部分)中的顺序是保持不变的。