O grep vai mais rápido com quebras de linha?

2

Eu tenho alguns arquivos grandes que eu mudei para "formulário padronizado", removendo as quebras de linha. Eu quero acelerar os greps nesses arquivos. Eu sei que você pode otimizar o grep fazendo grep 'partofpattern' | grep -E 'partofpattern [[:digit:]]+' - ou seja, procure grep por linhas que contenham uma parte mais simples de um padrão e depois execute grep uma segunda vez nas poucas linhas que contêm parte do padrão. Isso me faz pensar que o grep de alguma forma funciona linha por linha. Então, adicionar linhas quebradas a arquivos grandes sem quebras de linha acelere o grep?

    
por bernie2436 05.08.2014 / 02:20

2 respostas

3

Você provavelmente deve usar apenas fmt ou fold ou pr ou um desses. Aqui está fmt :

until [ $((i=i+1)) -gt 10000 ]
do  printf %s\  words and more words
done | fmt

OUTPUT

words and more words words and more words words and more words words
and more words words and more words words and more words words and more
words words and more words words and more words words and more words
words and more words words and more words words and more words words
and more words words and more words words and more words words and more
#...and so on for a long time
O buffer de

grep está fadado a ceder sob qualquer carga séria, a menos que possa despejá-lo em um limite de nova linha.

Por exemplo:

time (
    tr \0 \n < /dev/zero | 
    sed 'c words and words and words and words and words and' | 
    tr -d \n | 
    grep -o words
)
grep: memory exhausted
49.42s user 44.93s system 229% cpu 41.070 total

Demora um pouco - mas tem muita memória RAM vazia neste sistema e ainda conseguiu quebrar em menos de um minuto.

Então apenas:

fmt <file | grep search

Mais robustamente, porém, se houver algum delimitador de cadeia de caracteres único confiável no arquivo:

tr ${delim} \n <file | grep search
    
por 05.08.2014 / 03:34
2

o grep trabalha definitivamente baseado em linhas, assim como o sed. Não irá necessariamente acelerar a pesquisa, mas produzir a saída para uma linha de correspondência deve ser mais rápida.

    
por 05.08.2014 / 02:24