Parallel processing GNU并行:按id的并行文件

Parallel processing GNU并行:按id的并行文件,parallel-processing,gnu-parallel,Parallel Processing,Gnu Parallel,我想并行化一个脚本。我知道一个bite gnu并行,但可能它并不适合我的问题。 我有几个GFF输入文件(列由表格分隔),我想为我的脚本并行化它们。所有文件都包含相同的ID 文件1: id1… id2… id2… id3 文件2: id2… id3… id3 这两个文件是不同的:行的数量不一样,ID是相同的,但不是到处都必须存在(我发现这个答案,但在所有输入文件中行的数量是相同的)。我不想连接它们,因为我想保留它们来自哪个数据集的信息。我不想改变GFF格式。 目前,我正在按id分割文件并运行脚本。

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

文件1:
id1…
id2…
id2…
id3

文件2:
id2…
id3…
id3

这两个文件是不同的:行的数量不一样,ID是相同的,但不是到处都必须存在(我发现这个答案,但在所有输入文件中行的数量是相同的)。我不想连接它们,因为我想保留它们来自哪个数据集的信息。我不想改变GFF格式。 目前,我正在按id分割文件并运行脚本。我需要将所有id1放在一起(id2放在一起,等等),但是我的脚本可以同时使用多个id。我不需要运行组合file1id1-file2id2,只需要file1id1、file1id2-file2id2等。因为有时候一个id没有很多数据,它可以与其他id一起运行(run1:file1id1、file1id2-file2id2;run2:file1id3-file2id3等)。那么,通过根据id和每个id的数据量创建一些组,是否可以有效地分割我的输入数据


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

我假设您的程序从stdin读取数据,并且您希望对ID进行分组,这样您就可以在一次运行中获得所有ID1,而不会将一个组分割为多个调用

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

如果文件1+文件2已排序:

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块,删除标记,传递给您的程序:

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

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

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

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

我认为不可能并行多个文件(独立地为文件1和文件2创建块),不是吗?因此,最简单的方法可能是首先拆分我的文件(file1.a,file1.b file2.a file2.b…),然后用并行的“myProg--input1{1}--input2{2}”:::file1.*.gff:::file2.*.gffSounds对。parallel--xapply myProg--input1{1}--input2{2}:::file1.*.gff:::file2.*.gff我们假设file1.1.gff具有与file2.1.gff相关的ID