【问题标题】:Split Fasta file with parallel并行拆分 Fasta 文件
【发布时间】:2017-09-28 07:46:01
【问题描述】:

我有一个很长的 Fasta 文件(来自已处理的 Fastq 文件),我需要将其拆分为较小的文件。我正在尝试使用并行来做到这一点,但我不知道该怎么做。我需要将 Fasta 文件拆分为较小的文件,每个文件的最大大小为 700Mb。我的目标是将每个文件保存为 {n}.faa,其中 n 的序号为 (01.faa, 02.faa, 03.faa, 04.faa ... 10.faa, 11.faa, 12.faa 。 .. n.faa),每个都具有大致相同的尺寸。据我了解并行,我认为这是我应该使用的:

parallel -a MyFile.fasta --block 700M --pipe-part --recend '\n' --recstart '>' {} > #.faa

不过,我有两个问题。首先,如何使每个文件的大小大致相同,这样对于 1500Mb 的初始文件,我不会以两个 700Mb 文件和一个 100Mb 文件结束,而是三个 500Mb 文件?我对此的一个想法是计算所需文件的数量(原始文件大小/ 700,四舍五入),然后将原始大小除以所需文件的数量,并且由于数字已四舍五入为整数,我会有块大小(小于 700Mb),所以我会做这样的事情:

original_size=$(wc -c MyFile.fasta | sed 's/ .*//')  #get size
number=`expr $original_size / 734003200 + 1`
size=`expr $(wc -c MyFile.fasta) / $number`

有了这个我可以得到每个文件应该有的大小(以字节为单位),以获得相同大小的文件,但都在 700Mb 以下。有没有更简单的方法可以只使用并行工具来做到这一点?

我应该怎么做才能将每​​个块保存在不同的文件中? “{} > #.faa”方法是否正确?或者使用 --cat 会更有效吗? 另外,如何让数字“#”成为两位数(01...10)?

另外,如果它必须将文件拆分为 12 个较小的文件,但我的计算机只有 8 个内核,它是否会使用 8 个内核来处理 8 个文件,并且在完成作业时运行剩余的 4 个作业,或者我应该以某种方式限制我的作业核心数?

【问题讨论】:

    标签: split parallel-processing fasta gnu-parallel fastq


    【解决方案1】:

    这将拆分为大约 700 MB 的文件(+- 单个记录的大小)。它们将被命名为 1..n:

    parallel -a MyFile.fasta --block 700M --pipe-part --recend '\n' --recstart '>' "cat >{#}"
    

    你不能轻易要求 GNU Parallel 将 1500 MB 变成 3x500 MB 而不是 2x700 MB + 1x100MB。

    但您可以让 GNU Parallel 将文件拆分为每个作业槽给定数量的文件。每个工作槽一个文件:

    parallel -a MyFile.fasta --block -1 --pipe-part --recend '\n' --recstart '>' "cat >{#}"
    

    每个工作槽两个文件:

    parallel -a MyFile.fasta --block -2 --pipe-part --recend '\n' --recstart '>' "cat >{#}"
    

    jobslots 的数量用-j 给出,默认为 CPU 内核的数量。

    要使名称为 01..n,您必须用零填充它们。 GNU Parallel 不提供开箱即用的功能,但在 --rpl 部分的手册页中,您会看到一个示例,说明如何定义替换字符串来做到这一点:

    --rpl '{0#} $f=1+int("".(log(total_jobs())/log(10)));  $_=sprintf("%0${f}d",seq())'
    

    所以:

    parallel -a MyFile.fasta --block 700M --pipe-part --recend '\n' --recstart '>' \
      --rpl '{0#} $f=1+int("".(log(total_jobs())/log(10)));  $_=sprintf("%0${f}d",seq())' \
      "cat >{0#}"
    

    如果您经常使用{0#},您可以简单地将--rpl 定义放在~/.parallel/config 中。

    【讨论】:

    • 我知道这个问题很老,而且它似乎确实在我之前的测试中工作过,但由于某种原因,现在我试图再次使用它,除了第一个之外,所有的小文件都产生了(所以 2.fa, 3.fa, 4.fa)只是在开始时丢失了“>”。它们都将从标题开始,但会丢失“大于”符号。 $ parallel -a File.fa --block $size --pipe-part --recstart '>' "cat >{#}.fa" 每当我使用 ">" 作为 recstart 和/或 recend 运行它时,我都会遇到这个问题,省略“>”。有没有办法在文件的开头进行并行打印 - 还是有其他问题?
    • 你似乎是对的。 savannah.gnu.org/bugs/index.php?52343。解决方法是改用cat file | parallel --pipe ...
    猜你喜欢
    • 1970-01-01
    • 2015-08-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-09-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多