如何使用gnu-parallel处理带有两个输入的脚本?

时间:2016-02-05 12:15:16

标签: parallel-processing gnu-parallel

我正在尝试使用两个输入运行Python脚本,如下所示。我得到了这两个输入中的~300个,所以我想知道是否有人可以建议如何并行运行它们。

单次运行如下:

python stable.py KOG_1.fan KOG_1.fasta > KOG_1.stable

我的并行测试无效:

ls *.fan; ls *.fasta | parallel python stable.py {} {} > {.}.stable

但如何指定必须与_1.fan_1.fasta一起运行;然后是_2.fan_1.fasta等等......直到_300.fan_300.fasta

3 个答案:

答案 0 :(得分:2)

这不是一个Python问题,它是关于GNU并行的问题。如果所有文件都以" KOG _":

作为前缀,则可以尝试此操作
seq 1 300 | parallel python stable.py KOG_{}.fan KOG_{}.fasta ">" KOG_{.}.stable

重定向(">")周围的引号非常重要,除非您希望将所有输​​出都放在一个文件中。

处理通用前缀:

ls *fan *fasta | parallel ---max-lines=2 python stable.py {1} {2} ">" {1.}.stable

这使用-max-lines选项为每个命令占用2行。当然,这仅适用于*.fan*.fasta文件匹配,即每个文件必须相同的数量,并且数字需要匹配,否则您将最终配对文件那不应该是配对的。如果这是一个问题,您可以找出一个更强大地将对提供给parallel的命令。

答案 1 :(得分:1)

尝试:

function fillRouteNames($routes,$export)
{
 for($i=0;$i < count($routes);$i++) 
 {
  $disps = $routes[$i]['d'];
  $nd = array();
  foreach($disps as $disp) $nd[] = fxnName($disp,$export);
  $routes[$i]['nd'] = $nd;
 }  
 return $routes;
}

答案 2 :(得分:0)

我建议您分两步拆分此任务:

  1. 创建一个包含您要运行的所有命令的作业文件 平行。 您需要创建一个文本文件jobs.txt,该文件应与下面的文本文件类似:

    python stable.py KOG_1.fan KOG_1.fasta > KOG_1.stable
    python stable.py KOG_2.fan KOG_2.fasta > KOG_2.stable
    python stable.py KOG_3.fan KOG_3.fasta > KOG_3.stable
    python stable.py KOG_4.fan KOG_4.fasta > KOG_4.stable
    ...
    python stable.py KOG_300.fan KOG_300.fasta > KOG_300.stable
    

    如果您的所有文件都以KOG为前缀,则可以通过以下方式构建此文件:

    for I in `seq 300`; do echo "python stable.py KOG_$I.fan KOG_$I.fasta > KOG_$I.stable" >> jobs.txt; done;
    
  2. 使用作业文件

    运行并行

    获得作业文件后,只需运行以下命令:

    parallel -j4 < jobs.txt    
    

    请注意,-j4表示您的作业文件中最多有4个命令将并行运行。您可以根据计算机上可用的核心数进行调整。