并行化 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 的原始行号。你应该注意到第二列(以及文件的其余部分)中的顺序是保持不变的。