GNU parallel:id的并行文件

问题描述 投票:1回答:2

我想并行化脚本。我知道咬一口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
2个回答
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
投票

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

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

这将查看第1列,计算哈希值,并将其发送到yourprog的实例,具体取决于模数为8的哈希值。

© www.soinside.com 2019 - 2024. All rights reserved.