GNU parallel:id的并行文件

时间:2015-11-30 10:39:54

标签: parallel-processing gnu-parallel

我想并行化脚本。我知道咬一口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和数据量制作一些组来有效地分割我的输入数据?

由于

2 个答案:

答案 0 :(得分:1)

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

我假设您的程序从stdin读取并且您希望将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 \ n,拆分为10MB块,删除标记,传递给yourprog:

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

答案 1 :(得分:0)

自20190222起,您可以使用--shard

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

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