GNU parallel --block 和 -L 说明

GNU parallel --block and -L clarification

假设我有一个 N 大小的文件。以 30GB 文件为例。

关于文件内容的事实是它有成比例的行数。 这是交错的 FastQ 文件。 (对问题不重要但对某人有用)

文件内容为pairedinterleaved个DNA序列字符串。每 pair8 行。

我想用 GNU parallel 处理交错的 FastQ 以加快处理速度。 使用 parallel 而不是本机 bwa 工具线程功能的原因是 parallel 有助于减少所需的 RAM 量,因为 bwa 内存分配的性质。

假设交错文件大小为 30GB,我想处理 chunks of --block 500M,命令行参数看起来像 --pipe --block 500M -L 8 -j 10 然后作为 stdin 发送到bwa 并将 运行 10 bwa 个任务,每个任务获得 500M 个块,其中 record8 行。

我的假设是否正确 --block 500M-L 8 将由 parallel 管理,我可以确定我的 bwa 工具将始终得到 8 行时间 N MB 数据?

我不清楚的是,如果 8 行不存在,parallel 是否会“重复”最后一个“块”? 它会适当地控制 N processes 的其他块输入吗?我从 parallel 开始?

或者这个--block 500M“盲目地”向单个进程发送 500M 块,而不管 500M 块的最后一部分是否不包含 8 lines 可以这么说?

更新:

在阅读了一整天关于 biostars 和 seqanswers 的问题和答案后,我意识到我的测试/“基准测试”是错误的。

但这有助于我意识到我需要更新问题并将提出单独的问题。

我在 Docker 容器中进行测试,默认情况下 /dev/shm 的容器非常低,因此我误导了自己走完全不同的道路。


是的,你可以确定。

--block参数说明如下: https://www.gnu.org/software/parallel/parallel_tutorial.html#chunk-size

这里的-L参数: https://www.gnu.org/software/parallel/parallel_tutorial.html#records

快速总结: 并行将始终向每个进程发送完整行,直到 block/buffer 容量被填满。 如果您指定一个记录需要多行(在您的情况下为 8 行),它将以每 8 行的块的形式填充缓冲区容量。

如果剩余的更少,最后一个块可以小于8行。

旁注: 在格式正确且交错 fastq 文件的情况下,将始终有 8 行。 fastq 格式指定每条记录为4行,双端fastq文件必须包含相同数量的记录。

@Jonas 是对的。

但请注意 -L 相当慢:GNU Parallel 必须检查输入的每个字节。

如果你可以使用 --pipepart GNU Parallel way 更快。

不幸的是,您必须不使用 -L 而是使用 --recstart/--recend(可能使用 --regexp)来确定记录的开始位置。

有了 FASTA,这很容易:https://www.gnu.org/software/parallel/man.html#example-call-program-with-fasta-sequence

对于 FASTQ,尤其是交错 FASTQ (i-FASTQ),这更难。我还没有看到足够多的 i-FASTQ 文件来找到一个通用的解决方案,但我的想法是:

  • 制作一个始终匹配 i-FASTQ 记录结尾的正则表达式。将其用于 --recend.
  • 制作一个始终匹配 i-FASTQ 记录开头的正则表达式。将其用于 --recstart.
  • 确保 recend+recstart 匹配记录的边界。

然后使用:

parallel --pipepart -a big.file --regexp --recstart 'starting regexp' --recend 'ending regexp' ...

如果有人构建这样的正则表达式对,我认为它会进入 GNU Parallel 的示例部分,因为它通常对 i-FASTQ 处理有用。

可以在此处找到正常 FASTQ 的正则表达式对: 但这并不能保证 R1 和 R2 会保持在一起。我们需要找到 seqname 的一些特征来区分所有 i-FASTQ 文件的 R1 和 R2。

https://en.wikipedia.org/wiki/FASTQ_format 提到了这三个变体:

@HWUSI-EAS100R:6:73:941:1973#0/1
@EAS139:136:FC706VJ:2:2104:15343:197393 1:Y:18:ATCACG
@EAS139:136:FC706VJ:2:2104:15343:197393 1:N:18:1

其中“/1”和“1:”表示这是 R1。

这应该匹配那些:

--regexp --recend '\n' --recstart '@.*(/1| 1:.*)\n[A-Za-z\n\.~]'