GNU/Linux >> Tutoriels Linux >  >> Linux

Faites-en plus en ligne de commande Linux avec GNU Parallel

Avez-vous déjà eu la drôle de sensation que votre ordinateur n'est pas aussi rapide qu'il le devrait ? J'avais l'habitude de ressentir cela, puis j'ai découvert GNU Parallel.

GNU Parallel est un utilitaire shell permettant d'exécuter des tâches en parallèle. Il peut analyser plusieurs entrées, exécutant ainsi votre script ou votre commande sur des ensembles de données en même temps. Vous pouvez utiliser tous enfin votre CPU !

Si vous avez déjà utilisé xargs , vous savez déjà utiliser Parallel. Si ce n'est pas le cas, cet article vous apprendra, ainsi que de nombreux autres cas d'utilisation.

Installation de GNU parallèle

GNU Parallel peut ne pas être préinstallé sur votre ordinateur Linux ou BSD. Installez-le à partir de votre référentiel ou de votre collection de ports. Par exemple, sur Fedora :

$ sudo dnf install parallèle

Ou sur NetBSD :

# pkg_add parallèle

Si tout le reste échoue, reportez-vous à la page d'accueil du projet.

Du série au parallèle

Comme son nom l'indique, la force de Parallel est qu'il exécute les tâches en parallèle plutôt que, comme beaucoup d'entre nous le font encore, de manière séquentielle.

Lorsque vous exécutez une commande sur de nombreux objets, vous créez intrinsèquement une file d'attente. Un certain nombre d'objets peuvent être traités par la commande, et tous les autres objets restent là et attendent leur tour. C'est inefficace. Avec suffisamment de données, il y aura toujours une file d'attente, mais au lieu d'avoir une seule file d'attente, pourquoi ne pas avoir beaucoup de petites files d'attente ?

Imaginez que vous ayez un dossier plein d'images que vous souhaitez convertir de JPEG en PNG. Il existe de nombreuses façons de procéder. Il existe un moyen manuel d'ouvrir chaque image dans GIMP et de l'exporter vers le nouveau format. C'est généralement la pire façon possible. Cela ne prend pas seulement beaucoup de temps, mais aussi de main-d'œuvre.

Une variante assez intéressante de ce thème est la solution basée sur le shell :

$ convertir 001.jpeg 001.png
$ convertir 002.jpeg 002.png
$ convertir 003.jpeg 003.png
... et ainsi de suite...

C'est une excellente astuce lorsque vous l'apprenez pour la première fois, et au début, c'est une grande amélioration. Pas besoin d'une interface graphique et de clics constants. Mais cela demande encore beaucoup de main-d'œuvre.

Encore mieux :

$ pour i dans *jpeg ; convertissez $i $i.png; terminé

Ceci, au moins, met le(s) travail(s) en mouvement et vous libère pour faire des choses plus productives. Le problème est que c'est toujours un processus en série. Une image est convertie, puis la suivante dans la file d'attente passe à la conversion, et ainsi de suite jusqu'à ce que la file d'attente soit vidée.

Avec Parallèle :

$ trouver . -nom "*jpeg" | parallel -I% --max-args 1 convertir % %.png

C'est une combinaison de deux commandes :la commande find commande, qui regroupe les objets sur lesquels vous souhaitez opérer, et la commande parallel commande, qui trie les objets et s'assure que tout est traité comme il se doit.

  • find . -name "*jpeg" trouve tous les fichiers du répertoire courant qui se terminent par jpeg .
  • parallel invoque GNU Parallel.
  • -I% crée un espace réservé, appelé % , pour remplacer tout ce que find passe la main à Parallel. Vous l'utilisez, car sinon vous devriez écrire manuellement une nouvelle commande pour chaque résultat de find , et c'est exactement ce que vous essayez d'éviter.
  • --max-args 1 limite la fréquence à laquelle Parallel demande un nouvel objet à partir de la file d'attente. Étant donné que la commande Parallel is running ne nécessite qu'un seul fichier, vous limitez le taux à 1. Étiez-vous en train de faire une commande plus complexe qui nécessitait deux fichiers (comme cat 001.txt 002.txt > new.txt ), vous limiteriez le taux à 2.
  • convert % %.png est la commande que vous souhaitez exécuter en parallèle.

Le résultat de cette commande est que find rassemble tous les fichiers pertinents et les transmet à parallel , qui lance une tâche et demande immédiatement la suivante. Parallel continue de le faire tant qu'il est sûr de lancer de nouvelles tâches sans paralyser votre ordinateur. Au fur et à mesure que les anciens travaux sont terminés, il les remplace par de nouveaux, jusqu'à ce que toutes les données qui lui sont fournies aient été traitées. Ce qui prenait 10 minutes auparavant pouvait n'en prendre que 5 ou 3 avec Parallel.

Plusieurs entrées

Le find La commande est une excellente passerelle vers Parallel tant que vous êtes familiarisé avec find et xargs (collectivement appelés GNU Find Utilities, ou findutils ). Il fournit une interface flexible avec laquelle de nombreux utilisateurs de Linux sont déjà à l'aise et est assez facile à apprendre si vous êtes un nouveau venu.

Le find la commande est assez simple :vous fournissez find avec un chemin vers un répertoire que vous souhaitez rechercher et une partie du nom de fichier que vous souhaitez rechercher. Utilisez des caractères génériques pour élargir votre réseau ; dans cet exemple, l'astérisque indique n'importe quoi , donc find localise tous les fichiers qui se terminent par la chaîne searchterm :

$ find /path/to/directory -name "*searchterm"

Par défaut, find renvoie les résultats de sa recherche un élément à la fois, avec un élément par ligne :

$ find ~/graphics -name "*jpg"
/home/seth/graphics/001.jpg
/home/seth/graphics/cat.jpg
/home/seth /graphics/pingouin.jpg
/home/seth/graphics/IMG_0135.jpg

Lorsque vous dirigez les résultats de find à parallel , chaque élément de chaque ligne est traité comme un argument de la commande qui parallel est en train d'arbitrer. Si, d'autre part, vous devez traiter plus d'un argument dans une commande, vous pouvez diviser la façon dont les données de la file d'attente sont transmises à parallel .

Voici un exemple simple et irréaliste, que je transformerai plus tard en quelque chose de plus utile. Vous pouvez suivre cet exemple, tant que vous avez installé GNU Parallel.

Supposons que vous ayez quatre fichiers. Listez-les, une par ligne, pour voir exactement ce que vous avez :

$ echo ada> ada; echo lovelace> lovelace
$ echo richard> richard; echo stallman> stallman
$ ls -1
ada
lovelace
richard
stallman

Vous souhaitez combiner deux fichiers en un troisième contenant le contenu des deux fichiers. Cela nécessite que Parallel ait accès à deux fichiers, donc le -I% variable ne fonctionnera pas dans ce cas.

Le comportement par défaut de Parallel est quasiment invisible :

$ ls -1 | écho parallèle
ada
lovelace
richard
stallman

Dites maintenant à Parallel que vous souhaitez obtenir deux objets par tâche :

$ ls -1 | parallel --max-args=2 echo
ada lovelace
richard stallman

Maintenant, les lignes ont été combinées. Plus précisément, deux résultats de ls -1 sont passés à Parallel en une seule fois. C'est le bon nombre d'arguments pour cette tâche, mais il s'agit en fait d'un seul argument pour le moment :"ada lovelace" et "richard stallman". Ce que vous voulez réellement, ce sont deux arguments distincts par tâche.

Heureusement, cette technicité est analysée par Parallel lui-même. Si vous définissez --max-args à 2 , vous obtenez deux variables, {1} et {2} , représentant les première et deuxième parties de l'argument :

$ ls -1 | parallel --max-args=2 chat {1} {2} ">" {1}_{2}.personne

Dans cette commande, la variable {1} est ada ou richard (selon le travail que vous regardez) et {2} est soit lovelace ou stallman . Le contenu des fichiers est redirigé avec un symbole de redirection entre guillemets (les guillemets saisissent le symbole de redirection de Bash pour que Parallel puisse l'utiliser) et placés dans de nouveaux fichiers appelés ada_lovelace.person et richard_stallman.person .

$ ls -1
ada
ada_lovelace.person
lovelace
richard
richard_stallman.person
stallman

$ chat ada_*personne
ada lovelace
$ chat ri*personne
richard stallman

Si vous passez toute la journée à analyser des fichiers journaux d'une taille de plusieurs centaines de mégaoctets, vous constaterez peut-être à quel point l'analyse de texte parallélisé peut vous être utile ; sinon, il s'agit principalement d'un exercice de démonstration.

Cependant, ce type de traitement est inestimable pour plus que la simple analyse de texte. Voici un exemple concret tiré du monde du cinéma. Envisagez un répertoire de fichiers vidéo et de fichiers audio qui doivent être réunis.

$ ls -1
12_LS_establishing-manor.avi
12_wildsound.flac
14_butler-dialogue-mixed.flac
14_MS_butler.avi
... et ainsi de suite le...

En utilisant les mêmes principes, une simple commande peut être créée pour que les fichiers soient combinés en parallèle :

$ ls -1 | parallèle --max-args=2 ffmpeg -i {1} -i {2} -vcodec copie -acodec copie {1}.mkv

Brut. Forcer.

Toute cette analyse sophistiquée des entrées et des sorties n'est pas du goût de tout le monde. Si vous préférez une approche plus directe, vous pouvez lancer des commandes sur Parallel et vous en aller.

Commencez par créer un fichier texte avec une commande sur chaque ligne :

$ cat jobs2run
bzip2 oldstuff.tar
oggenc music.flac
opusenc ambiance.wav
convert bigfile.tiff small.jpeg
ffmepg -i foo. avi -v:b 12000k foo.mp4
xsltproc --output build/tmp.fo style/dm.xsl src/tmp.xml
bzip2 archive.tar

Remettez ensuite le fichier à Parallel :

$ parallel --jobs 6  

Et maintenant, tous les travaux de votre fichier sont exécutés en parallèle. S'il existe plus de tâches que de tâches autorisées, une file d'attente est formée et maintenue par Parallel jusqu'à ce que toutes les tâches soient exécutées.

Beaucoup, beaucoup plus

GNU Parallel est un outil puissant et flexible, avec bien plus de cas d'utilisation que ne peut en contenir cet article. Sa page de manuel fournit des exemples de choses vraiment intéressantes que vous pouvez faire avec, de l'exécution à distance via SSH à l'incorporation de fonctions Bash dans vos commandes parallèles. Il y a même une vaste série de démonstrations sur YouTube, vous pouvez donc apprendre directement de l'équipe GNU Parallel. Le mainteneur principal de GNU Parallel vient également de publier le guide officiel de la commande, disponible sur Lulu.com.

GNU Parallel a le pouvoir de changer votre façon de calculer, et si vous ne le faites pas, cela changera au moins le temps que votre ordinateur passe à calculer. Essayez-le dès aujourd'hui !


Linux
  1. Rechercher des fichiers et des répertoires sous Linux avec la commande find

  2. 8 conseils pour la ligne de commande Linux

  3. Soyez trié avec sort en ligne de commande

  4. Comment puis-je obtenir le nombre d'images dans une vidéo sur la ligne de commande Linux ?

  5. Surveillance du niveau du microphone avec un outil de ligne de commande sous Linux

'Getting to Done' sur la ligne de commande Linux

Comment vérifier l'orthographe sur la ligne de commande Linux avec Aspell

Comment rechercher des fichiers sous Linux avec la commande Find

Maîtrisez la ligne de commande Linux

Comment rechercher des fichiers à partir de la ligne de commande Linux

Comment rechercher des fichiers avec la commande fd sous Linux