我正在评估GNU Parallel是否可用于并行搜索存储在系统上的文件。系统中每年的每一天(doy)只能有一个文件(因此每年最多366个文件)。假设系统上有3660个文件(大约10年的数据)。该系统可以是多CPU多核Linux或多CPU Solaris。
我正在存储搜索命令以在数组中的文件上运行(每个文件一个命令)。这就是我现在正在做的事情(使用bash)但是我无法控制并行启动的搜索次数(绝对不想一次启动所有3660次搜索):
#!/usr/bin/env bash
declare -a cmds
declare -i cmd_ctr=0
while [[ <condition> ]]; do
if [[ -s $cur_archive_path/log.${doy_ctr} ]]; then
cmds[$cmd_ctr]="<cmd_to_run>"
let cmd_ctr++
fi
done
declare -i arr_len=${#cmds[@]}
for (( i=0; i<${arr_len}; i++ ));
do
# Get the command and run it in background
eval ${cmds[$i]} &
done
wait
如果我使用parallel
(它将自动计算最大CPU /核心并且仅并行启动这么多搜索),我如何重复使用并行和重写的数组cmds
上面的代码?另一种方法是将所有命令写入文件,然后执行cat cmd_file | parallel
答案 0 :(得分:6)
https://www.gnu.org/software/parallel/man.html#EXAMPLE:-Using-shell-variables说:
parallel echo ::: "${V[@]}"
你不需要回声,所以:
parallel ::: "${cmds[@]}"
如果您不需要$ cmds,那么请使用&#39; sem&#39; (这是并行的别名--semaphore)https://www.gnu.org/software/parallel/man.html#EXAMPLE:-Working-as-mutex-and-counting-semaphore
while [[ <condition> ]]; do
if [[ -s $cur_archive_path/log.${doy_ctr} ]]; then
sem -j+0 <cmd_to_run>
fi
done
sem --wait
您还没有描述&lt; condition&gt;可能。如果您只是执行类似for循环的操作,则可以使用以下命令替换整个脚本:
parallel 'if [ -s {} ] ; then cmd_to_run {}; fi' ::: $cur_archive_path/log.{1..3660}
(基于https://www.gnu.org/software/parallel/man.html#EXAMPLE:-Composed-commands)。