GNU parallel --block 和 -L 说明
GNU parallel --block and -L clarification
假设我有一个 N 大小的文件。以 30GB 文件为例。
关于文件内容的事实是它有成比例的行数。
这是交错的 FastQ 文件。 (对问题不重要但对某人有用)
文件内容为paired
或interleaved
个DNA序列字符串。每 pair
是 8
行。
我想用 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
个块,其中 record
个 8
行。
我的假设是否正确 --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\.~]'
假设我有一个 N 大小的文件。以 30GB 文件为例。
关于文件内容的事实是它有成比例的行数。 这是交错的 FastQ 文件。 (对问题不重要但对某人有用)
文件内容为paired
或interleaved
个DNA序列字符串。每 pair
是 8
行。
我想用 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
个块,其中 record
个 8
行。
我的假设是否正确 --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\.~]'