gpt4 book ai didi

bash - 如何向 GNU Parallel 提供大量命令?

转载 作者:行者123 更新时间:2023-11-29 08:55:14 25 4
gpt4 key购买 nike

我正在评估是否 GNU Parallel可用于并行搜索存储在系统上的文件。系统上一年中的每一天 (doy) 只能有一个文件(因此每年最多 366 个文件)。假设系统上有 3660 个文件(大约 10 年的数据值(value))。该系统可以是多 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 |并行

最佳答案

https://www.gnu.org/software/parallel/man.html#EXAMPLE:-Using-shell-variables说:

parallel echo ::: "${V[@]}"

你不想要 echo ,所以:

parallel ::: "${cmds[@]}"

如果您不需要 $cmds 做任何其他事情,那么使用“sem”(它是并行 --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

您没有描述 可能是什么。如果您只是简单地做一个类似于 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 )。

关于bash - 如何向 GNU Parallel 提供大量命令?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16426845/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com