L’ find(1)
utilitaire unix m’est très utile pour effectuer une action sur de nombreux fichiers correspondant à certaines spécifications, par exemple:
find /dump -type f -name '*.xml' -exec java -jar ProcessFile.jar {} \;
Ce qui précède peut exécuter un script ou un outil sur chaque fichier XML d’un répertoire particulier.
Disons que mon script / programme prend beaucoup de temps de calcul et que j'ai 8 processeurs. Ce serait bien de pouvoir traiter jusqu'à 8 fichiers à la fois.
GNU make permet le traitement de travaux en parallèle avec l’ -j
indicateur, mais find
ne semble pas avoir une telle fonctionnalité. Existe-t-il une autre méthode générique d’ordonnancement des travaux pour aborder cette question?
-P
option!xargs -P
- il y a un bogue jamais corrigé de garbling la sortie (contrairement àparallel
) chaque fois que 2 threads produisent une sortie au même moment précis ...GNU parallel peut aussi aider.
Notez que sans l'
-j8
argument,parallel
le nombre de cœurs sur votre machine est défini par défaut :-)la source
Pas besoin de "réparer"
find
- utilisezmake
-vous pour gérer le parallélisme.Demandez à votre processus de créer un fichier journal ou un autre fichier de sortie, puis utilisez un fichier Makefile comme celui-ci:
et invoqué ainsi:
Mieux encore, si vous veillez à ce que le fichier de sortie ne soit créé qu’une fois le processus Java terminé, vous pouvez tirer parti de
make
la gestion des dépendances pour vous assurer que seuls les fichiers non traités seront exécutés la prochaine fois.la source
Find a une option parallèle que vous pouvez utiliser directement à l'aide du symbole "+"; aucun xargs requis. En le combinant avec grep, il peut déchirer rapidement votre arbre à la recherche de correspondances. par exemple, si je recherche tous les fichiers de mon répertoire sources contenant la chaîne 'foo', je peux invoquer
find sources -type f -exec grep -H foo {} +
la source
-exec command +
syntaxe ne l’exécute pas en parallèle, mais "regroupe" plusieurs fichiers et lance la commande avec plusieurs fichiers comme arguments à la fois. Il arrive que grep puisse parcourir ses cibles en parallèle.