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 autrement pas surchargé. Une alternative à grep? Quelque chose à propos de ma syntaxe qui peut être amélioré, (egrep, fgrep mieux?)
Le fichier est en fait dans un répertoire qui est partagé avec un montage sur un autre serveur mais l'espace disque réel est local, donc cela ne devrait pas faire de différence?
le grep saisit jusqu'à 93% du CPU
-i
commutateur peut ralentir le processus, essayez sans-i
ou avecLC_ALL=C grep ...
. De plus, si vous recherchez uniquement une chaîne fixe, utilisezgrep -F
.cindex .
pour indexer votre dossier actuel, puiscsearch db_pd.Clients
.Réponses:
Voici quelques options:
1) Préfixez votre commande grep avec
LC_ALL=C
pour utiliser la locale C au lieu de UTF-8.2) À utiliser
fgrep
parce que vous recherchez une chaîne fixe, pas une expression régulière.3) Supprimez l'
-i
option si vous n'en avez pas besoin.Votre commande devient donc:
Ce sera également plus rapide si vous copiez votre fichier sur le disque RAM.
la source
grep -F
plus quefgrep
LANG=C
(au lieu deLC_ALL=C
) est suffisant et qu'il est plus facile à taper.fgrep
est une autre façon d'écriregrep -F
, commeman fgrep
vous le direz. Certaines versions duman
dit également que le premier est déconseillé pour le second, mais que la forme plus courte est trop pratique pour mourir.Si vous avez un processeur multicœur, je recommanderais vraiment GNU parallèle . Pour grep un gros fichier en utilisation parallèle:
En fonction de vos disques et de vos processeurs, il peut être plus rapide de lire des blocs plus volumineux:
Ce n'est pas tout à fait clair d'après votre question, mais d'autres options
grep
incluent:-i
drapeau.-F
indicateur pour une chaîne fixeLANG=C
-m
drapeau.la source
--pipepart
place de--pipe
. C'est beaucoup plus rapide.<
caractère précédant la commande parallèle?cat file.sql | parallel ...
mais évite un UUOC . GNU parallel a également un moyen de lire l'entrée d'un fichier en utilisantparallel ... :::: file.sql
. HTH.Quelques améliorations insignifiantes:
Supprimez l'option -i, si vous le pouvez, insensible à la casse est assez lent.
Remplacez le
.
par\.
Un seul point est le symbole regex pour correspondre à n'importe quel caractère, qui est également lent
la source
Deux lignes d'attaque:
-i
, ou avez-vous la possibilité de vous en débarrasser?grep
est monothread, vous voudrez peut-être en commencer plus avec des décalages différents.la source
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. la valeur des options -j et -n semblait fonctionner le mieux pour mon cas d'utilisation. Le grep -F a également fait une grande différence.
la source