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.3
sob 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_file
apenas 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)
90k
, a descrição tem20K
padrõesgrep
.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-F
vez de-E
, é instantâneo.n7ce49B_.+
é equivalente an7ce49B_.
Respostas:
Você encontrou um problema de desempenho nas versões mais antigas do GNU grep ( bug # 22357 ) que foram corrigidas por esse commit , lançado na 2.28, embora essa mudança tenha introduzido algumas regressões , portanto, você deseja obter o GNU
grep
3.0 ou mais recente.fonte