Grepping un énorme fichier (80 Go) de toute façon pour accélérer?

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

Cela a duré une heure sur un serveur Linux assez puissant qui n’est pas surchargé. Une alternative à grep? Quelque chose sur ma syntaxe peut être amélioré, (egrep, fgrep mieux?)

Le fichier se trouve en fait dans un répertoire partagé avec un assembly sur un autre serveur, mais l’espace disque réel est local, ce qui ne devrait pas faire de différence.

le grep saisit jusqu’à 93% du processeur

Voici quelques options:

1) Préfixez votre commande grep avec LC_ALL=C pour utiliser la locale C au lieu de UTF-8.

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

3) Supprimez l’option -i , si vous n’en avez pas besoin.

Donc, votre commande devient:

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

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

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

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

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

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

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

  • Supprimer le drapeau -i .
  • Utiliser l'indicateur -F pour une chaîne fixe
  • Désactiver NLS avec LANG=C
  • Définition d'un nombre maximal de correspondances avec l'indicateur -m .

Quelques améliorations sortingviales:

  • Supprimez l’option -i, si vous le pouvez, la sensibilité à la casse est assez lente.

  • Remplacez le . par \.

    Un seul point est le symbole de l’expression régulière correspondant à n’importe quel caractère, qui est également lent

Deux lignes d’attaque:

  • êtes-vous sûr d’avoir besoin de -i ou avez-vous la possibilité de vous en débarrasser?
  • Avez-vous plus de cœurs avec lesquels jouer? grep est à thread unique, vous pouvez donc en lancer plus à différents décalages.
 < 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 ssortingngs.txt vous fait gagner un temps précieux. Ce qui précède est une traduction de quelque chose que je teste actuellement. La valeur de l'option -j et -n semblait mieux fonctionner pour mon cas d'utilisation. Le -F grep a également fait une grande différence.