Por que a correspondência de 1250 strings e 90k de padrões é tão lenta?

12

Minhas strings são caminhos de arquivo como s/14/11/13/15/n7ce49B_235_25ed2d70.jpg; meus padrões são bem simples, todos gostam n7ce49B_.+.

Estou correndo GNU grep 2.6.3sob Debian 6.0.10 na Dell DL360G7 servidor (Menciono isso apenas para dar uma sensação de esta máquina perfomance) com 15k HDDs, e este comando: time LC_ALL=C grep -E -f path_to_patterns_file path_to_strings_fileapenas não é possível concluir - swaps servidor muito mal. Com padrões de 20k, leva mais de 3 horas.

Isso me parece irracional.

Por solicitação de comentário, existem os arquivos: caminhos do arquivo 20k padrões

Pode-se também testar e ajustar o número de linhas e padrões de entrada com:

xxd -p /dev/urandom | fold -sw 100 | head -n 1250 |
  grep -Ef <(xxd -p /dev/urandom | fold -sw 10 | head -n 20000)
skaurus
fonte
3
o seu título tem 90k, a descrição tem 20Kpadrões
RomanPerekhrest
2
Bem, 90k é o meu tamanho de entrada original e isso faz com que minha máquina troque com tanta força que eu tenho que matar esse grep. Então eu tentei dividir isso em 20k arquivos e ainda funciona horrivelmente ... Mas você está certo que minha descrição é inconsistente.
skaurus
2
Por favor, esclareça se o servidor pode ou não ter sido sobrecarregado (executando outras tarefas com muita fome de recursos) durante o grep.
agc 27/06
2
Pode-se reproduzir com xxd -p /dev/urandom | fold -sw 100 | head -n 1250 | grep -Ef <(xxd -p /dev/urandom | fold -sw 10 | head -n 20000). Parece que o tempo é gasto compilando os regexps e alocando muita memória. Com em -Fvez de -E, é instantâneo.
Stéphane Chazelas
2
Para que importa, não que n7ce49B_.+é equivalente an7ce49B_.
Stéphane Chazelas

Respostas: