我在 Bash 中有一个 while 循环,处理如下:
while IFS=$'\t' read -r -a line;
do
myprogram ${line[0]} ${line[1]} ${line[0]}_vs_${line[1]}.result;
done < fileinput
它从具有以下结构的文件中读取,以供参考:
foo bar
baz foobar
等等(制表符分隔)。
我想使用 GNU 并行并行化这个循环(因为条目很多并且处理可能很慢),但是这些示例不清楚如何将每一行分配给数组,就像我在这里所做的那样。
可能的解决方案是什么(GNU 并行工作的替代方案)?
我想要@chepner hack。
通过限制并行执行的数量来完成类似的行为似乎并不那么棘手:
while IFS=$'\t' read -r f1 f2;
do
myprogram "$f1" "$f2" "${f1}_vs_${f2}.result" &
# At most as number of CPU cores
[ $( jobs | wc -l ) -ge $( nproc ) ] && wait
done < fileinput
wait
它限制系统上存在的最大 CPU 核心数的执行。您可以通过替换轻松地改变它$( nproc )
按所需数量。
同时你应该明白什么是不诚实的分配。因此,它不会在一个线程完成后立即启动新线程。相反,它只是在启动最大数量后等待完成所有操作。因此,汇总吞吐量可能略低于并行吞吐量。特别是如果程序的运行时间可能变化很大。如果每次调用所花费的时间几乎相同,则汇总时间也应该大致相等。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)