¿Por qué es tan lento hacer coincidir 1250 cadenas con patrones de 90k?

12

Mis cadenas son rutas de archivo como s/14/11/13/15/n7ce49B_235_25ed2d70.jpg; mis patrones son bastante simples, como todos n7ce49B_.+.

Estoy corriendo GNU grep 2.6.3bajo Debian 6.0.10 de Dell DL360G7 servidor (lo menciono sólo para dar una idea de esta máquina del perfomance) con 15k unidades de disco duro, y este comando: time LC_ALL=C grep -E -f path_to_patterns_file path_to_strings_filesimplemente no se puede completar - permutas de servidores demasiado mal. Con 20k patrones, lleva más de 3 horas.

Eso me parece irracional.

Por solicitud de comentario, están los archivos: rutas de archivo 20k patrones

También se puede probar y ajustar el número de líneas y patrones de entrada con:

xxd -p /dev/urandom | fold -sw 100 | head -n 1250 |
  grep -Ef <(xxd -p /dev/urandom | fold -sw 10 | head -n 20000)
skaurus
fuente
3
su título tiene 90k, la descripción tiene 20Kpatrones
RomanPerekhrest
2
Bueno, 90k es mi tamaño de entrada original y eso hace que mi máquina se intercambie tan fuerte que tenga que matar ese grep. Luego traté de dividir esto en archivos de 20k y todavía funciona horriblemente ... Pero tienes razón en que mi descripción es inconsistente.
skaurus
2
Por favor, aclare si el servidor puede haber sido sobrecargado (haciendo otras tareas que requieren recursos) durante el grep.
agc
2
Se puede reproducir con xxd -p /dev/urandom | fold -sw 100 | head -n 1250 | grep -Ef <(xxd -p /dev/urandom | fold -sw 10 | head -n 20000). Parece que se pasa el tiempo compilando las expresiones regulares y asignando mucha memoria. Con en -Flugar de -E, es instantáneo.
Stéphane Chazelas
2
Para eso importa, no n7ce49B_.+es equivalente an7ce49B_.
Stéphane Chazelas

Respuestas: