Pourquoi est-il si lent de faire correspondre 1250 cordes avec des motifs à 90k?

12

Mes chaînes sont des chemins de fichiers comme s/14/11/13/15/n7ce49B_235_25ed2d70.jpg; mes modèles sont assez simples, tout comme n7ce49B_.+.

Je fonctionne GNU grep 2.6.3sous Debian 6.0.10 sur le serveur Dell DL360G7 (je le mentionne juste pour donner une idée de la performance de cette machine) avec des disques durs 15k, et cette commande: time LC_ALL=C grep -E -f path_to_patterns_file path_to_strings_filene peut tout simplement pas terminer - le serveur échange trop mal. Avec 20 000 motifs, cela prend plus de 3 heures.

Cela me semble déraisonnable.

Par demande de commentaire, il y a les fichiers: chemins de fichiers 20k motifs

On peut également tester et ajuster le nombre de lignes et de motifs d'entrée avec:

xxd -p /dev/urandom | fold -sw 100 | head -n 1250 |
  grep -Ef <(xxd -p /dev/urandom | fold -sw 10 | head -n 20000)
skaurus
la source
3
votre titre a 90k, la description a des 20Kmotifs
RomanPerekhrest
2
Eh bien, 90k est ma taille d'entrée d'origine et cela rend mon échange de machine si difficile que je dois tuer ce grep. Ensuite, j'ai essayé de diviser cela en fichiers de 20k et cela fonctionne toujours horriblement ... Mais vous avez raison, ma description est incohérente.
skaurus
2
Veuillez préciser si le serveur peut avoir été surchargé (en effectuant d'autres tâches gourmandes en ressources) au cours de la grep.
agc
2
On peut reproduire avec xxd -p /dev/urandom | fold -sw 100 | head -n 1250 | grep -Ef <(xxd -p /dev/urandom | fold -sw 10 | head -n 20000). Il semble que le temps soit passé à compiler les expressions rationnelles et à allouer beaucoup de mémoire. Avec -Fau lieu de -E, c'est instantané.
Stéphane Chazelas
2
Pour ce qui compte, ce n7ce49B_.+n'est pas équivalent àn7ce49B_.
Stéphane Chazelas

Réponses: