vendredi 25 mai 2012

Paralléliser une commande shell

  Je conseille fortement l'utilisation ou au moins de jeter un coup d'oeil sur un outil très intéressant "made by GNU“ qui se nomme Parallel.
En effet, il permet après avoir rapidement parcouru la documentation en ligne de paralléliser l'exécution d'une commande Shell même si elle est un peu complexe.
Une petite démonstration vous permettra de rapidement vous en rendre compte :)

Voici donc la commande shell que je désirais paralléliser :

for id in $(seq 1 4) do   for cf in t1 x34 j25 r32 r77   do     cat /data/d${id}/res/${cf}.csv | encb64 > /data/d${id}/res/${cf}-bs64.csv   done done

A priori ça semble un peu compliqué mais en fait Parallel supporte l'initialisation de listes pour justement mimer les boucles for. Ainsi la commande devient la suivante :

parallel cat /data/pns{1}/results/{2}.csv '|' encb64 '>' /data/pns{1}/results/{2}-bs64.csv ::: 1 2 3 4 ::: t1 x34 j25 r32 r77

Vous noterez qu'il est nécessaire de mettre entre quotes les caractères pouvant être interprétés par le shell comme dans mon exemple le caractère pipe.
Par défaut Parallel lancera autant de processus que de coeurs disponibles sur la machine. il est aussi possible de paralléliser des tâches sur plusieurs machines.
Concernant l'installation de l'outil, vous pouvez la faire très simplement avec le Homebrew de Mac ou en téléchargeant le paquet disponible pour votre distribution. Par exemple, pour ubuntu 10.04 vous pouvez le récupérer ici.

Aucun commentaire: