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
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.
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:
-i
drapeau.-F
drapeau pour une chaîne fixeLANG=C
-m
drapeau.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
Deux lignes d'attaque:
-i
ou avez-vous la possibilité de vous en débarrasser?grep
est mono-threadé, vous voudrez peut-être en commencer un plus grand nombre à 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 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.