Por que o 'grep -i' é tão lento? Como fazer isso mais rápido para ASCII?

2

Considere:

$ time lzop -d < tvtropes-index.lzo | egrep -B 5 '[Dd][eE][sS][cC][eE][nN][dD] ?[Ff][rR][oO][mM]'
real    0m0.438s

$ time lzop -d < tvtropes-index.lzo | egrep -B 5 'descend ?from' -i
real    0m11.294s

Os dois casos de pesquisa são insensíveis. Por que a versão -i é tão lenta? Como eu faço grep -i rápido sem inserir coisas como [iI] [nN] [tT] [hH] [i] [sS] [wW] [aa] [aa]?

Por exemplo,

perl -ne 'print if /descend ?from/i'

funciona rápido, mas '-B 5' não é tão simples de implementar como no grep (assim como outras opções).

    
por Vi. 06.09.2011 / 12:55

3 respostas

7

Dobragem de casos é difícil

Simply mapping [a-z] to [A-Z] works for most simple ASCII-only text documents. However, it begins to break down as we explore other languages that use additional characters. It also doesn't take into account the fact that case mappings in some languages are not always algorithmic or static.

For example, if you case folded [a-z] -> [A-Z], a string like "Dürst" or "résumé" might end up looking a bit odd: "DüRST" or "RéSUMé".

Você pode aumentar a velocidade persuadindo o grep de que o mundo é ASCII mais uma vez, usando um grep antigo ou tocando com locales (LC_ALL = C?).

Esta conversa menciona "grandes lentidões em locais UTF8", mas não ajuda.

    
por 06.09.2011 / 13:36
2

Hipótese

Este resultado contra-intuitivo é explicado por isso. Seu regex não é o mesmo que grep -i porque grep -i é mais geral, levando em consideração o processamento complicado de cadeias de bytes múltiplos, pelo menos quando compilado com o símbolo de pré-processador MBS_SUPPORT .

Dê uma olhada aqui:

link

Procure match_icase e MBS_SUPPORT .

    
por 27.03.2012 / 23:02
0

Se o caso real da descoberta não for crítico, você pode usar tr para dobrar [A-Z] para [a-z] antes da grep .

    
por 06.09.2011 / 14:16

Tags