用GNU Parallel替换嵌套的while循环会产生缓慢的结果

问题描述

简单的嵌套循环:

while read f1; do
    while read f2; do
    ipv4comb+=($f1,f2)
    done < $src2
done < $src1
$src1 has 88 lines
$src2 has 175 lines
produced output has 15400 lines

$src1是通过ssh检索的,因此查找略有不同,但是,此循环通常产生:

./run.sh 0.34s user 0.18s system 15% cpu 3.327 total

如果我将循环替换为:

parallel -j+0 echo {1} {2} :::: $temp_ipv4 $MM_BLACKLIST_IPV4 | wc -l

它产生:

./run.sh 49.31s user 31.27s system 242% cpu 33.239 total

我在做什么错了?

解决方法

GNU Parallel每个作业的开销约为2-10毫秒,因此49s中的15400个作业在预期范围内。

有一些技巧可以应对短期工作。但是,它们不适用于您的情况: https://www.gnu.org/software/parallel/man.html#EXAMPLE:-Speeding-up-fast-jobs