2012-11-20 9 views
0

J'ai écrit un script et ce que je veux faire, c'est de l'exécuter aussi vite que possible en utilisant le sous-traitement ou le traitement en arrière-plan ou ce que j'ai besoin d'utiliser afin d'accélérer les calculs. Donc, je cherchais à utiliser le symbole & dans mon script pour accélérer le traitement partout où je le pouvais, mais quand je le mets ici, je ne reçois pas les résultats écho à moi.Multiprocessing dans Shell Script (BASH)

C'est la fonction que j'ai écrite et j'essaie d'améliorer 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);") 
} 

J'ai lu le « man bash » (ou ce que cela je pouvais comprendre) mais je ne comprends pas pourquoi cela ne fonctionne pas.

Aide! :)

Merci à tous ceux qui le peuvent, votre contribution est très appréciée.

+0

Que voulez-vous * FAIRE * avec ces variables une fois que vous les avez collectées? – ghoti

Répondre

2

Vous pourriez penser que créer plus de processus le rendra plus rapide, mais cela pourrait le rendre plus lent à cause de la surcharge engendrée par la création de nouveaux processus et de tout ce qui passe.

Pourquoi ne pas simplement faire ce qui suit?

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}' 

Ou si vous voulez les lire dans les variables:

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);") 
+2

Merci votre contribution accéléré par" réel 0m0.793 ":) Et j'ai appris quelque chose :) super – TolMera

2

Tout ce qui se passe dans la ligne & se produit dans un processus fils, qui ne peut pas modifier l'environnement parent. Vous aurez probablement besoin d'ouvrir des tuyaux et de les lire dans le processus parent. Pour des tâches avec des coûts d'exécution comparables à ceux de votre exemple, cela n'en vaut pas la peine.

Dans cet exemple, vous pouvez juste faire

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

Au lieu de cela tout le corps de la boucle.

+0

Ok, mais en utilisant un tube, chaque processus attend que son prédécesseur finisse avant de démarrer. Je suis en train de traiter 26000 triangles pour un total de 480 milliards de points, toute petite augmentation de vitesse serait une augmentation de vitesse importante par rapport au nombre de calculs qu'elle exécute. Et ce que vous voyez ici, c'est seulement une fraction du code qui fonctionne réellement, c'était juste le meilleur échantillon pour moi à utiliser pour cette question. – TolMera

+0

Que quelqu'un attende quelqu'un dépend de la façon dont vous le faites. Par exemple, je ne vois aucune raison d'attendre dans le code ci-dessus. On peut le tester, bien sûr. En ce qui concerne votre tâche particulière, je ne suis pas sûr que bash soit le bon outil. –

+1

@TolMera, essayez ceci pour tester: 'cat <(echo a > & 2; dormir 2; écho b> & 2) <(echo c > &2 ; sommeil 3; echo d> & 2) ' –

2

Si vous sentez que votre programme devient plus lent en raison de ces 7 commandes awk, vous pouvez faire quelque chose comme ça sans 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 

où « a » est un tableau qui contient tous les éléments du ligne variable en elle.

0

Afin d'obtenir le script ci-dessus fonctionne comme il faut, je juste besoin d'enlever le & avant la « attendre »

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);") 
}