144 votes

Le greffage d'un énorme fichier (80 Go) peut-il être accéléré ?

 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 pas surchargé par ailleurs. Une alternative à grep ? Y a-t-il quelque chose dans ma syntaxe qui peut être amélioré (egrep, fgrep, etc.) ?

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 prend jusqu'à 93% de CPU

186voto

dogbane Points 85749

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, et non une expression régulière.

3) Retirer 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

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

42voto

Steve Points 18420

Si vous avez un processeur multicore, je vous recommande vraiment GNU parallel . Pour grep un gros fichier en parallèle, utilisez :

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

En fonction de vos disques et de vos processeurs, il peut être plus rapide de lire des blocs plus importants :

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

Ce n'est pas tout à fait clair dans votre question, mais d'autres possibilités de grep inclure :

  • L'abandon de la -i drapeau.
  • Utilisation de la -F drapeau pour une chaîne fixe
  • Désactiver NLS avec LANG=C
  • Définir un nombre maximal de correspondances avec l'option -m drapeau.

10voto

BeniBela Points 6863

Quelques améliorations triviales :

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

  • Remplacer le . par \.

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

3voto

Eugen Rieck Points 33670

Deux lignes d'attaque :

  • Vous êtes sûr, vous avez besoin du -i ou avez-vous la possibilité de vous en débarrasser ?
  • Vous avez plus de cœurs pour jouer avec ? grep est monofilaire, donc vous pourriez vouloir en démarrer plusieurs à des décalages différents.

1voto

user584583 Points 659
< eightygigsfile.sql parallel -k -j120% -n10 -m grep -F -i -C 5 'db_pd.Clients'  

Si vous devez rechercher plusieurs chaînes de caractères, grep -f strings.txt vous fait gagner un temps fou. Ce qui précède est une traduction de quelque chose que je teste actuellement. Les valeurs des options -j et -n semblent fonctionner au mieux pour mon cas d'utilisation. L'option -F grep a également fait une grande différence.

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