【问题标题】:GNU parallel: parallel files by idGNU 并行:按 id 并行文件
【发布时间】:2016-03-03 23:20:41
【问题描述】:

我想并行化一个脚本。我知道一口 gnu-parallel,但也许它并不适合我的问题。 我有几个 GFF 输入文件(列由表格分隔),我想为我的脚本并行化它们。所有文件都包含相同的 id。

文件 1:
id1 ...
id2 ...
id2 ...
id3 ...

文件 2:
id2 ...
id3 ...
id3 ...

这两个文件是不同的:行数不一样,id 是相同的,但没有必要到处都存在(我找到了这个答案How to make gnu-parallel split multiple input files,但所有输入文件中的行数都是相同的)。我不想连接它们,因为我想保留它们来自哪个数据集的信息。而且我不想更改 GFF 格式。 目前,我正在按 id 拆分文件并运行我的脚本。我需要将所有 id1 放在一起(id2 放在一起等),但我的脚本可以同时使用多个 id。而且我不需要运行 File1 id1 - File2 id2 组合,只需 File1 id1、File1 id2 - File2 id2 等。有时一个 id 没有很多数据,它可以与其他 id 一起运行(run1:File1 id1,File1 id2 - File2 id2 ; run2 : File1 id3 - File2 id3 等)。那么是否可以通过根据每个组的 id 和数据量创建一些组来有效地拆分我的输入数据?

谢谢

【问题讨论】:

    标签: parallel-processing gnu-parallel


    【解决方案1】:

    从你的问题很难理解你想要做什么。如果我弄错了,请向我们展示您希望运行的示例。

    我假设您的程序从标准输入读取,并且您希望将 ID 分组,因此您可以在一次运行中获得所有 id1,而不是将一个组分成多个调用。

    我的建议是合并 File1 和 File2,在每个 ID 组之前插入一个标记,让 GNU Parallel 使用标记作为记录分隔符读取一个块,删除记录分隔符并将其传递给yourprog

    如果 File1+File2 已排序:

    sort -m File1.gff File2.gff |
    

    如果没有:

    sort File1.gff File2.gff |
    

    插入标记:

    perl -pe '/^([^\t]+)/; if($1 ne $l) { print "Ma\rke\r"; } $l=$1;' |
    

    寻找 Ma\rke\r,分成 10MB 块,移除标记,传递给 yourprog:

    parallel --pipe --recstart 'Ma\rke\r' --rrs --block 10M yourprog
    

    【讨论】:

    • 我认为不可能并行多个文件(独立地为 file1 和 file2 创建块?),不是吗?所以最简单的方法可能是首先拆分我的文件(file1.a,file1.b file2.a file2.b...)并将我的程序与并行“myProg --input1 {1} --input2 {2} " ::: file1.*.gff ::: file2.*.gff
    • 听起来不错。并行 --xapply myProg --input1 {1} --input2 {2} ::: file1.*.gff ::: file2.*.gff 我们假设 file1.1.gff 具有与 file2.1 相关的 id。 gff
    【解决方案2】:

    20190222 起您可以使用--shard:

    cat *gff | parallel --shard 1 -j8 yourprog
    

    这将查看第 1 列,计算哈希,然后根据哈希值模 8 将其发送到 yourprog 的实例。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-11-25
      • 2018-02-19
      • 1970-01-01
      • 2014-04-20
      • 1970-01-01
      • 2012-08-31
      • 2018-06-09
      • 2019-09-23
      相关资源
      最近更新 更多