Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/bash/17.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Bash GNU与for循环函数并行_Bash_Parallel Processing_Gnu Parallel - Fatal编程技术网

Bash GNU与for循环函数并行

Bash GNU与for循环函数并行,bash,parallel-processing,gnu-parallel,Bash,Parallel Processing,Gnu Parallel,我想利用AWS中的所有内核(48)来运行我的作业。我有600万个列表要运行,每个作业运行不到一秒[real 0m0.004s user 0m0.005s sys 0m0.000s]。 我下面的执行使用了所有内核,但不是100% gnu_parallel -a list.lst --load 100% --joblog process.log sh job_run.sh {} >>score.out job_run.sh #!/bin/bash i=$1 TMP_DIR=/home/

我想利用AWS中的所有内核(48)来运行我的作业。我有600万个列表要运行,每个作业运行不到一秒[real 0m0.004s user 0m0.005s sys 0m0.000s]。 我下面的执行使用了所有内核,但不是100%

gnu_parallel -a list.lst --load 100% --joblog process.log sh job_run.sh {} >>score.out
job_run.sh

#!/bin/bash
i=$1
TMP_DIR=/home/ubuntu/test/$i
mkdir -p $TMP_DIR
cd $TMP_DIR/
m=`echo $i|awk -F '-' '{print $2}'`
n=`echo $i|awk -F '-' '{print $3}'`
cp /home/ubuntu/aligned/$m $TMP_DIR/
cp /home/ubuntu/aligned/$n $TMP_DIR/
printf '%s ' "$i"
/home/ubuntu/test/prog -s1 $m -s2 $n | grep 'GA'
cd $TMP_DIR/../
rm -rf $TMP_DIR
exit 0

您的问题是GNUparallel的开销:启动一个作业需要5-10毫秒。因此,您可能会看到GNU在一个内核上以100%的速度并行运行,但其余的都是空闲的

但您可以运行多个GNU并行:

因此,将列表拆分为更小的块并并行运行:

cat list.lst | parallel --block 100k -q -I,, --pipe parallel --joblog process.log{#} sh job_run.sh {} >>score.out
这应该运行48+1 GNU并行,所以它应该使用您的所有内核。您的大多数核心将用于开销,因为您的作业非常快

如果您没有使用
process.log
,则可以用较少的开销完成:

perl -pe 's/^/sh job_run.sh /' list.lst | parallel --pipe --block 100k sh >>score.out

这将在每一行前面加上
sh job\u run.sh
,并为并行运行的48个
sh
s提供100kb的行。

缓慢的部分几乎肯定是
/home/ubuntu/test/prog
。我们怎么知道如何加快速度呢?@Barmer prog相当快。它运行不到一秒,时间显示[真正的0m0.004s用户0m0.005s系统0m0.000s]。我想问的是,如何才能100%利用内核。试着删除
--load 100%
AFAIK,这意味着它是一个节流阀,可以潜在地降低速度,而不是一个目标来加速速度。默认情况下,它将完全使用所有内核。也不要使用2
awk
进程,而是使用
bash
参数替换。perl脚本生成错误:sh:0:无法打开sh job_run.sh abc-dec-fih-44hh-hhh-odjd。同时指定sh和list的路径会在-e行1的行末产生未知的regexp修饰符“/h”。抱歉
--管道
丢失。编辑。