web-dev-qa-db-fra.com

Grepping un énorme fichier (80 Go) tout moyen de l'accélérer?

 grep -i -A 5 -B 5 'db_pd.Clients'  eightygigsfile.sql

Cela fonctionne depuis une heure sur un serveur linux assez puissant qui n’est par ailleurs pas surchargé. Une alternative à grep? Tout ce qui peut être amélioré dans ma syntaxe, (egrep, fgrep better?)

Le fichier se trouve en fait dans un répertoire partagé avec un montage sur un autre serveur, mais l'espace disque réel est local. Cela ne devrait donc pas faire la différence?

le grep récupère jusqu'à 93% de la CPU

96
zzapper

Voici quelques options:

1) Préfixez votre commande grep avec LC_ALL=C pour utiliser les paramètres régionaux C au lieu de UTF-8.

2) Utilisez fgrep parce que vous recherchez une chaîne fixe, pas une expression régulière.

3) Retirez le -i option, si vous n'en avez pas besoin.

Donc, votre commande devient:

LC_ALL=C fgrep -A 5 -B 5 'db_pd.Clients' eightygigsfile.sql

Cela sera également plus rapide si vous copiez votre fichier sur le disque RAM.

132
dogbane

Si vous avez un processeur multicœur, je vous recommanderais vraiment GNU parallel . Pour grep un gros fichier en utilisation parallèle:

< eightygigsfile.sql parallel --pipe grep -i -C 5 'db_pd.Clients'

Selon vos disques et vos processeurs, il peut être plus rapide de lire des blocs plus volumineux:

< eightygigsfile.sql parallel --pipe --block 10M grep -i -C 5 'db_pd.Clients'

Ce n'est pas tout à fait clair d'après votre question, mais les autres options pour grep incluent:

  • Lâcher le -i drapeau.
  • En utilisant le -F drapeau pour une chaîne fixe
  • Désactiver NLS avec LANG=C
  • Définir un nombre maximal de correspondances avec le -m drapeau.
28
Steve

Quelques améliorations triviales:

  • Supprimez l'option -i, si vous le pouvez, la casse est assez lente.

  • Remplace le . par \.

    Un seul point est le symbole regex pour faire correspondre n'importe quel caractère, ce qui est également lent

10
BeniBela

Deux lignes d'attaque:

  • es-tu sûr, tu as besoin du -i ou avez-vous la possibilité de vous en débarrasser?
  • Avez-vous plus de cœurs à jouer? grep est mono-threadé, vous voudrez peut-être en commencer un plus grand nombre à différents décalages.
3
Eugen Rieck
< eightygigsfile.sql parallel -k -j120% -n10 -m grep -F -i -C 5 'db_pd.Clients'  

Si vous avez besoin de rechercher plusieurs chaînes, grep -f strings.txt vous fait gagner beaucoup de temps. Ce qui précède est une traduction de quelque chose que je teste actuellement. les options -j et -n semblaient fonctionner mieux pour mon cas d'utilisation. Le -F grep a également fait une grande différence.

1
user584583