J'ai un grand nombre de petits fichiers à rechercher. Je cherchais une bonne version multi-thread de facto de grep
mais je n'ai rien trouvé. Comment puis-je améliorer mon utilisation de grep? À partir de maintenant, je fais ceci:
grep -R "string" >> Strings
Si vous avez des xargs installés sur un processeur multicœur, vous pouvez bénéficier des avantages suivants au cas où quelqu'un serait intéressé.
Environnement:
Processor: Dual Quad-core 2.4GHz
Memory: 32 GB
Number of files: 584450
Total Size: ~ 35 GB
Tests:
1. Trouvez les fichiers nécessaires, dirigez-les vers xargs et dites-lui d'exécuter 8 instances.
time find ./ -name "*.ext" -print0 | xargs -0 -n1 -P8 grep -H "string" >> Strings_find8
real 3m24.358s
user 1m27.654s
sys 9m40.316s
2. Trouvez les fichiers nécessaires, dirigez-les vers xargs et dites-lui d'exécuter 4 instances.
time find ./ -name "*.ext" -print0 | xargs -0 -n1 -P4 grep -H "string" >> Strings
real 16m3.051s
user 0m56.012s
sys 8m42.540s
. Suggéré par @Stephen: Trouvez les fichiers nécessaires et utilisez + au lieu de xargs
time find ./ -name "*.ext" -exec grep -H "string" {} \+ >> Strings
real 53m45.438s
user 0m5.829s
sys 0m40.778s
4. Grep récursif régulier.
grep -R "string" >> Strings
real 235m12.823s
user 38m57.763s
sys 38m8.301s
Pour mes besoins, la première commande a très bien fonctionné.
Vous vous demandez pourquoi -n1
est utilisé ci-dessous, ne sera-t-il pas plus rapide d'utiliser une valeur plus élevée (dites -n8? ou laissez-la de côté pour que xargs fasse la bonne chose)?
xargs -0 -n1 -P8 grep -H "string"
Semble qu'il sera plus efficace de donner à chaque grep qui est bifurqué de traiter sur plus d'un fichier (je suppose que -n1 ne donnera qu'un seul nom de fichier en argv pour le grep) - comme je le vois, nous devrions être en mesure de donner le n le plus élevé possible sur le système (basé sur argc/argv
limitation de longueur max.). Ainsi, le coût d'installation de la mise en place d'un nouveau processus grep n'est pas encouru plus souvent.