GNU与for循环函数并行

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

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

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

job_润.是

#!/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
bash parallel-processing gnu-parallel
1个回答
2
投票

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

但是你可以运行多个GNU Parallels:https://www.gnu.org/software/parallel/man.html#EXAMPLE:-Speeding-up-fast-jobs

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

cat list.lst | parallel --block 100k -q -I,, --pipe parallel --joblog process.log{#} sh job_run.sh {} >>score.out

这应该运行48 + 1 GNU Parallels所以它应该使用你的所有核心。您的大多数核心都将用于开销,因为您的工作速度非常快。

如果你没有使用process.log,那么可以用更少的开销完成:

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

这将在每条线前面加上sh job_run.sh,并为48个shs并行运行提供100kb的线。

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