0

我已经编写了一个脚本,我想要做的是通过使用子处理或后台处理或我需要使用什么来加速计算,让它尽可能快地运行。

所以我正在考虑在我的脚本中使用 & 符号来尽可能地加快处理速度,但是当我把它放在这里时,我没有得到结果。

这是我编写并正在尝试改进 apon 的功能。

InTri(){
    while read line
    do
        V1X=$(echo "$line" | awk '{print $1}') &
        V1Z=$(echo "$line" | awk '{print $2}') &
        V2X=$(echo "$line" | awk '{print $3}') &
        V2Z=$(echo "$line" | awk '{print $4}') &
        V3X=$(echo "$line" | awk '{print $5}') &
        V3Z=$(echo "$line" | awk '{print $6}') &
        run=$(echo "$line" | awk '{print $7}') &
        wait
        echo "$V1X $V1Z $V2X $V2Z $V3X $V3Z $run"
    done < <(mysql -u root -ppassword LightCycle -N -e "SELECT V1X, V1Z, V2X, V2Z, V3X, V3Z, ID FROM Temp3 WHERE (V1X <= $x OR V2X <= $x OR V3X <= $x) AND (V1X >= $x OR V2X >= $x OR V3X >= $x) AND (V1Z <= $z OR V2Z <= $z OR V3Z <= $z) AND (V1Z >= $z OR V2Z >= $z OR V3Z >= $z);")
}

我已经阅读了“man bash”(或者我能理解的内容),但我不明白为什么这不起作用。

帮助!:)

感谢任何可以的人,非常感谢您的意见。

4

4 回答 4

2

无论&在线上发生什么都发生在子进程中,它不能修改父进程的环境。您可能需要打开管道并在父进程中读取它们。对于与您的示例具有可比执行成本的任务,不值得付出努力。

在这个例子中,你可以做

cat <(echo "$line" | awk '{print $1}') <(echo "$line" | awk '{print $1}') ...

而不是整个循环体。

于 2012-11-20T10:27:15.550 回答
2

如果您觉得由于这 7 个 awk 命令而使您的程序变慢,您可以在没有任何 awk 的情况下执行以下操作:

$ line="1 2 3 4 5 6 7"
$ a=($line)
$ echo ${a[0]}
1
$ echo ${a[1]}
2
$ echo ${a[@]}
1 2 3 4 5 6 7

其中“a”是一个数组,其中包含行变量的所有元素。

于 2012-11-20T10:33:30.937 回答
2

您可能认为创建更多进程会使其更快,但实际上可能会因为创建新进程和所有管道的开销而使其变慢。

为什么不简单地执行以下操作?

mysql -u root -ppassword LightCycle -N -e "SELECT V1X, V1Z, V2X, V2Z, V3X, V3Z, ID FROM Temp3 WHERE (V1X <= $x OR V2X <= $x OR V3X <= $x) AND (V1X >= $x OR V2X >= $x OR V3X >= $x) AND (V1Z <= $z OR V2Z <= $z OR V3Z <= $z) AND (V1Z >= $z OR V2Z >= $z OR V3Z >= $z);" | awk '{print $1" "$2" "$3" "$4" "$5" "$6" "$7}'

或者,如果您想将它们读入变量:

while read V1X V1Z V2X V2Z V3X V3Z run
do
  echo "$V1X $V1Z $V2X $V2Z $V3X $V3Z $run"
done < <(mysql -u root -ppassword LightCycle -N -e "SELECT V1X, V1Z, V2X, V2Z, V3X, V3Z, ID FROM Temp3 WHERE (V1X <= $x OR V2X <= $x OR V3X <= $x) AND (V1X >= $x OR V2X >= $x OR V3X >= $x) AND (V1Z <= $z OR V2Z <= $z OR V3Z <= $z) AND (V1Z >= $z OR V2Z >= $z OR V3Z >= $z);")
于 2012-11-20T10:52:28.530 回答
0

In order to get the script above working as it should, I just needed to remove the & before the "wait"

InTri(){
    while read line
    do
        V1X=$(echo "$line" | awk '{print $1}') &
        V1Z=$(echo "$line" | awk '{print $2}') &
        V2X=$(echo "$line" | awk '{print $3}') &
        V2Z=$(echo "$line" | awk '{print $4}') &
        V3X=$(echo "$line" | awk '{print $5}') &
        V3Z=$(echo "$line" | awk '{print $6}') &
        run=$(echo "$line" | awk '{print $7}') 
        wait
        echo "$V1X $V1Z $V2X $V2Z $V3X $V3Z $run"
    done < <(mysql -u root -ppassword LightCycle -N -e "SELECT V1X, V1Z, V2X, V2Z, V3X, V3Z, ID FROM Temp3 WHERE (V1X <= $x OR V2X <= $x OR V3X <= $x) AND (V1X >= $x OR V2X >= $x OR V3X >= $x) AND (V1Z <= $z OR V2Z <= $z OR V3Z <= $z) AND (V1Z >= $z OR V2Z >= $z OR V3Z >= $z);")
}
于 2012-11-20T11:15:02.200 回答