假设文件是一个fastq文件,因此记录大小为4行。您可以使用“-L 4”参数告诉GNU Parallel。
在fastq文件中,顺序并不重要,因此您想将n * 4行的块传递给子进程。为了高效地执行此操作,您可以使用“--pipe-part”,但“--pipe-part”无法处理压缩文件,并且无法与“-L”一起使用,因此您只能使用“--pipe”。
zcat file1.fastq.gz |
parallel -j16 --pipe -L 4 --joblog split_log.txt --resume-failed "gzip > ${input_file}_child_{#}.gz"
这将传递一个块给16个子任务,每个块的默认大小为1 MB,并在记录边界处进行切割(即4行)。它将为每个块运行一个任务。但是你真正想要的是将输入只传递给总共16个作业,这可以通过循环轮换实现。不幸的是,在“--round-robin”中存在一定的随机性,因此“--resume-failed”无法工作:
zcat file1.fastq.gz |
parallel -j16 --pipe -L 4 --joblog split_log.txt --round-robin "gzip > ${input_file}_child_{#}.gz"
parallel
会努力跟上16个gzip的速度,但你应该能够以100-200 MB/s的速度压缩。
现在,如果您的fastq文件未经压缩,我们甚至可以更快地完成任务,但我们需要偷懒一点:通常在fastq文件中,您将拥有一个以相同字符串开头的序列名称:
@EAS54_6_R1_2_1_413_324
CCCTTCTTGTCTTCAGCGTTTCTCC
+
;;3;;;;;;;;;;;;7;;;;;;;88
@EAS54_6_R1_2_1_540_792
TTGGCAGGCCAAGGCCGATGGATCA
+
;;;;;;;;;;;7;;;;;-;;;3;83
@EAS54_6_R1_2_1_443_348
GTTGCTTCTGGCGTGGGTGGGGGGG
+EAS54_6_R1_2_1_443_348
;;;;;;;;;;;9;7;;.7;393333
这里是
@EAS54_6_R
。不幸的是,在质量行中,这也是一个有效的字符串(这是一个非常愚蠢的设计),但实际上,我们会非常惊讶地看到以
@EAS54_6_R
开头的质量行。这根本不可能发生。
我们可以利用这一点优势,因为现在您可以使用
\n
后跟
@EAS54_6_R
作为记录分隔符,然后我们可以使用
--pipe-part
。增加的好处是顺序将保持不变。在这里,您需要将块大小设为
file1-fastq
大小的1/16:
parallel -a file1.fastq --block <<1/16th of the size of file1.fastq>> -j16 --pipe-part --recend '\n' --recstart '@EAS54_6_R' --joblog split_log.txt "gzip > ${input_file}_child_{#}.gz"
如果您使用GNU Parallel 20161222,那么GNU Parallel可以为您执行该计算。
--block -1
的意思是:选择一个块大小,以便将一个块分配给16个作业槽中的每一个。
parallel -a file1.fastq --block -1 -j16 --pipe-part --recend '\n' --recstart '@EAS54_6_R' --joblog split_log.txt "gzip > ${input_file}_child_{#}.gz"
在这里,GNU Parallel不会是限制因素:它可以轻松传输20 GB/s。
需要打开文件才能查看recstart值真是令人恼火,所以在大多数情况下,以下方法适用:
parallel -a file1.fastq --pipe-part --block -1 -j16
--regexp --recend '\n' --recstart '@.*\n[A-Za-z\n\.~]'
my_command
在这里我们假设每行都是以这样的方式开始:
@<anything>
[A-Za-z\n\.~]<anything>
<anything>
<anything>
即使您有一些以“@”开头的优质行,它们也永远不会被以 [A-Za-z\n.~] 开头的行跟随,因为优质行总是紧随序列名称行后面,序列名称行以“@”开头。
您还可以设置块大小,使其与未压缩文件的1/16相对应,但这是一个糟糕的想法:
- 您必须能够在RAM中保留完整的未压缩文件。
- 只有在读取了最后一个字节之后(第一个gzip可能已经完成),才会启动最后一个
gzip
。
通过将记录数设置为104214420(使用-N),这基本上就是您所做的,在36 GB的RAM中保持150 GB未压缩数据,可能会使服务器出现问题。