GNU 与 for 循环函数并行
GNU parallel with for loop function
我想利用 AWS 中的所有核心 (48) 来 运行 我的工作。我有 600 万个列表 运行,每个作业 运行s 不到一秒 [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=
TMP_DIR=/home/ubuntu/test/$i
mkdir -p $TMP_DIR
cd $TMP_DIR/
m=`echo $i|awk -F '-' '{print }'`
n=`echo $i|awk -F '-' '{print }'`
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
你的问题是 GNU Parallel 的开销:启动一个作业需要 5-10 毫秒。因此,您可能会看到 GNU Parallel 运行ning 在一个内核上以 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
并同时将 100kb 的行分配给 48 sh
s 运行ning。
我想利用 AWS 中的所有核心 (48) 来 运行 我的工作。我有 600 万个列表 运行,每个作业 运行s 不到一秒 [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=
TMP_DIR=/home/ubuntu/test/$i
mkdir -p $TMP_DIR
cd $TMP_DIR/
m=`echo $i|awk -F '-' '{print }'`
n=`echo $i|awk -F '-' '{print }'`
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
你的问题是 GNU Parallel 的开销:启动一个作业需要 5-10 毫秒。因此,您可能会看到 GNU Parallel 运行ning 在一个内核上以 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
并同时将 100kb 的行分配给 48 sh
s 运行ning。