40 votes

Comment utiliser grep efficacement?

J'ai un grand nombre de petits fichiers à rechercher. Je recherchais une bonne version multithread de facto de grep mais je n’ai rien trouvé. Comment puis-je améliorer mon utilisation de grep? A partir de maintenant je fais ceci:

 grep -R "string" >> Strings
 

81voto

Legend Points 29504

Si vous avez xargs installé sur un processeur multi-core, vous pouvez bénéficier des avantages suivants juste au cas où quelqu'un est intéressé.

Environnement:

Processor: Dual Quad-core 2.4GHz
Memory: 32 GB
Number of files: 584450
Total Size: ~ 35 GB

Tests:

1. Trouver les fichiers nécessaires, pipe à xargs et dites lui d'exécuter 8 cas.

time find ./ -name "*.ext" -print0 | xargs -0 -n1 -P8 grep -H "string" >> Strings_find8

real    3m24.358s
user    1m27.654s
sys     9m40.316s

2. Trouver les fichiers nécessaires, pipe à xargs et dites lui d'exécuter des 4 instances.

time find ./ -name "*.ext" -print0 | xargs -0 -n1 -P4 grep -H "string" >> Strings

real    16m3.051s
user    0m56.012s
sys     8m42.540s

3. Suggéré par @Stephen: Trouver les fichiers nécessaires et les utiliser + au lieu de xargs

time find ./ -name "*.ext" -exec grep -H "string" {} \+ >> Strings

real    53m45.438s
user    0m5.829s
sys     0m40.778s

4. Régulière récursive grep.

grep -R "string" >> Strings

real    235m12.823s
user    38m57.763s
sys     38m8.301s

Pour ma part, la première commande a très bien fonctionné.

4voto

Vous vous demandez pourquoi -n1 est utilisé ci-dessous n'est-ce pas plus rapide d'utiliser une valeur plus élevée (disons -n8? ou laissez donc xargs va faire la bonne chose)?

xargs -0 -n1 -P8 grep -H "string"

Il semble qu'il sera plus efficace de donner à chaque grep c'est fourchue de processus sur plus d'un fichier (je suppose -n1 permettra de donner un seul nom de fichier dans argv pour le grep) -- comme je le vois, nous devrions être en mesure de donner le plus n possible sur le système (basé sur argc/argv max de limitation de longueur). De sorte que la configuration coût de la mise en place d'un nouveau processus grep n'est pas engagé plus souvent.

1voto

Ira Baxter Points 48153

GREP œuvres de rapidement rechercher des fichiers individuels. Mais quand vous avez un grand nombre de fichiers, cela prend toujours beaucoup de calcul d'énergie et de temps. L'OP dit qu'il a 35Gb de données à traiter dans les 500K+ fichiers; avec toutes les 8 cœurs d'aller et de 32 go de RAM il prend 3 minutes de chaque requête.

Une meilleure façon que grep, à cette échelle, est de pré-index de la base de code source, et une recherche dans l'index à l'aide d'un langage de requête. Les fichiers ne contenant pas de choses intéressantes ne sont tout simplement pas été examiné. Notre Code Source du Moteur de Recherche fait par la déchirure de chaque fichier dans lexèmes selon ses types de langue et de l'indexation des lexèmes. Le langage de requête est en termes de langue des atomes et des contraintes (par exemple, I=foo* détecte tous les identificateurs commençant par "foo"). Parce que, les requêtes sont en termes de langue éléments que vous pouvez facilement ignorer les espaces et les commentaires et donc de mise en forme n'affecte pas votre recherche. Cela rend également plus facile pour le code des requêtes complexes (en minimisant le nombre de fois où vous devez lancer une recherche), et de minimiser le nombre de faux positifs, ce qui est fondamentalement important si vous avez une grande base de code source. Les résultats sont affichés dans un graphique frappé de la fenêtre, et le réel contenu du fichier peut être vu directement en cliquant sur un succès.

Le Moteur de Recherche a été utilisé sur des systèmes de 2 000 000 de fichiers en quelques minutes le temps de réponse à l'aide de seulement 1 CPU avec seulement 8 go de RAM; grep directement appliqué dans ce cas est de prendre 45 minutes environ. Le Moteur de Recherche va grep, aussi, si vous insistez, mais vous obtenez plus lent réponses.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X