Contenu
Pourquoi utiliser parallel?
Parallel nous permet de faire tourner un programme simultanément sur plusieurs coeurs. Comme aujourd’hui tous les ordinateur on t des chips multicoeur, il ne faudrait pas s’en priver si nous avons des tâches intensives en calcul à faire.
Pour installer parallel :
sudo apt install parallel
Parallel exploite le multicoeur de votre système, pour connaitre le nombre de coeurs physique de votre machine :
$ lscpu

Autre méthode comme tout est fichier dans linux, dans le répertoire proc
vim /proc/cpuinfo
La commande nproc affiche des informations plusconcises
$ nproc 4
Rappel : les process, jobs, avant plan (foreground) et arrière plan (background)
Le signe & pour mettre en arrière plan
ping google.com > ping.txt & [1] 2606 # exemple avec un script shell ./script.sh &
La commande jobs
Elle permet de lister les process en arrière plan
jobs [2]+ Running ping google.fr > ping.txt & # pour tuer un process : kill -9 2606 << le numéro de process
Attendre que des process en background se terminent avant de lancer un autre process
command 1 & command 2 & wait command3 ex dans un script shell : #!/bin/bash sleep 5 & sleep 10 & wait echo "Bonjour"
Comparaison de la conversion de fichier image avec la commande convert (d’ImageMagick)
Nous allons convertir des images jpg en image png avec la commande convert, d’abord sans parallel puis avec parallel.
Pour télécharger les images, les urls sont dans le fichier à télécharger, ce sont des images du site unsplash.com.
Avec une commande en une ligne on va télécharger toutes ces images, je vous conseille de créer un répertoire image
cat images.txt | xargs wget
grâce au piping et avec xargs, et wget.
Mais les images téléchargée doivent être renommées pour que ce soit plus pratique, voici le script à lancer (il n'est pas parfait mais fait le job)
#!/bin/bash
IMAGES=$(ls)
I=0
for IMAGE in $IMAGES
do
MIME=$(file -b --mime-type $IMAGE)
EXT=$(echo "$MIME" | cut -d'/' -f2)
if
mv $IMAGE "image"_${I}.$EXT
I=$((I+1))
done
Ce script va nommer les images avec l’extension trouvée à partir du MIME-type, et numéroter les images. A présent on est prêt pour la conversion. On va utiliser la commande time pour avoir la durée d’exécution
#script bash avec parallel
#!/bin/bash
parallel convert {} {.}.png ::: *.jpeg
# avec parallel
real 1m44,358s
user 6m13,489s
sys 0m21,999s
#script sans parallel
#!/bin/bash
IMAGES=$(ls *.jpeg)
for IMAGE in $IMAGES
do
FILENAME="${IMAGE%.*}"
convert $IMAGE ${FILENAME}.png
done
real 2m26,348s
user 2m39,110s
sys 0m2,865s