J’ai actuellement le script actuel.
#!/bin/bash # script.sh for i in {0..99}; do script-to-run.sh input/ output/ $i done
Je souhaite l’exécuter en parallèle en utilisant xargs. j’ai essayé
script.sh | xargs -P8
Mais faire ce qui précède ne s’exécute qu’une fois à la fois. Pas de chance avec -n8 aussi. Ajouter et à la fin de la ligne à exécuter dans le script pour la boucle essaierait d’exécuter le script 99 fois de suite. Comment puis-je exécuter la boucle seulement 8 à la fois, jusqu’à 100 au total.
De la page de manuel de xargs
:
Cette page de manuel documente la version GNU de xargs. xargs lit les éléments de l’entrée standard, délimités par des espaces (pouvant être protégés par des guillemets simples ou doubles ou une barre oblique inverse) ou des nouvelles lignes, et exécute la commande (par défaut / bin / echo) une ou plusieurs fois avec des arguments initiaux suivis par éléments lus à partir de l’entrée standard. Les lignes vides sur l’entrée standard sont ignorées.
Ce qui signifie que pour votre exemple, xargs
attend et collecte toutes les sorties de votre script, puis exécute echo
. Pas tout à fait utile ni ce que vous vouliez.
L’argument -n
indique combien d’éléments de l’entrée à utiliser avec chaque commande est exécutée (rien en soi sur le parallélisme ici).
Pour faire ce que vous voulez avec xargs
vous devez faire quelque chose de plus (non testé):
printf %s\\n {0..99} | xargs -n 1 -P 8 script-to-run.sh input/ output/
Ce qui tombe en panne comme ça.
printf %s\\n {0..99}
– Imprime un nombre par ligne de 0
à 99
. xargs
Avec GNU Parallel, vous feriez:
parallel script-to-run.sh input/ output/ {} ::: {0..99}
Ajoutez -P8
si vous ne souhaitez pas exécuter un travail par cœur de processeur.
En face de xargs
il fera The Right Thing, même si l’entrée contient de l’espace, “ou” (ce n’est pas le cas ici). Cela permet également de s’assurer que les sorties des différents travaux ne sont pas mélangées, donc si vous utilisez la sortie sont garantis que vous n’obtiendrez pas une demi-ligne de deux emplois différents.
GNU Parallel est un paralléliseur général et il est facile d’exécuter des tâches en parallèle sur la même machine ou sur plusieurs machines auxquelles vous avez access.
Si vous avez 32 tâches différentes à exécuter sur 4 processeurs, la méthode de parallélisation consiste à exécuter 8 tâches sur chaque CPU:
Au lieu de cela, GNU Parallel crée un nouveau processus à la fin – gardant les processeurs actifs et économisant ainsi du temps:
Installation
Si GNU Parallel n’est pas fourni pour votre dissortingbution, vous pouvez effectuer une installation personnelle, qui ne nécessite aucun access root. Cela peut être fait en 10 secondes en faisant ceci:
(wget -O - pi.dk/3 || curl pi.dk/3/ || fetch -o - http://pi.dk/3) | bash
Pour d’autres options d’installation, voir http://git.savannah.gnu.org/cgit/parallel.git/tree/README
Apprendre encore plus
Voir plus d’exemples: http://www.gnu.org/software/parallel/man.html
Regardez les vidéos d’introduction: https://www.youtube.com/playlist?list=PL284C9FF2488BC6D1
Parcourez le tutoriel: http://www.gnu.org/software/parallel/parallel_tutorial.html
Inscrivez-vous à la liste de diffusion pour obtenir de l’aide: https://lists.gnu.org/mailman/listinfo/parallel