grep -i -A 5 -B 5 'db_pd.Clients' eightygigsfile.sql
Ele está rodando há uma hora em um servidor Linux bastante poderoso, que de outra forma não está sobrecarregado. Alguma alternativa ao grep? Algo sobre minha sintaxe que possa ser melhorado (egrep, fgrep melhor?)
O arquivo está realmente em um diretório que é compartilhado com uma montagem em outro servidor, mas o espaço em disco real é local, então isso não deve fazer nenhuma diferença?
o grep está ocupando até 93% da CPU
-i
opção pode desacelerar o processo, tente sem-i
ou comLC_ALL=C grep ...
. Além disso, se você estiver apenas procurando por uma string fixa, usegrep -F
.cindex .
para indexar sua pasta atual, entãocsearch db_pd.Clients
.Respostas:
Aqui estão algumas opções:
1) Prefixe seu comando grep com
LC_ALL=C
para usar a localidade C em vez de UTF-8.2) Use
fgrep
porque você está procurando uma string fixa, não uma expressão regular.3) Remova a
-i
opção, se você não precisar dela.Portanto, seu comando se torna:
Também será mais rápido se você copiar o arquivo para o disco RAM.
fonte
grep -F
mais defgrep
LANG=C
(em vez deLC_ALL=C
) é o suficiente e é mais fácil de digitar.fgrep
é outra forma de escrevergrep -F
, comoman fgrep
lhe direi. Algumas versões doman
também dizem que o primeiro está obsoleto para o último, mas a forma mais curta é muito conveniente para morrer.Se você tem uma CPU multicore, eu realmente recomendo o GNU parallel . Para usar grep em um arquivo grande em paralelo:
Dependendo de seus discos e CPUs, pode ser mais rápido ler blocos maiores:
Sua pergunta não ficou totalmente clara, mas outras opções
grep
incluem:-i
bandeira.-F
bandeira para uma string fixaLANG=C
-m
bandeira.fonte
--pipepart
vez de--pipe
. É muito mais rápido.<
caractere que precede o comando paralelo?cat file.sql | parallel ...
mas evita um UUOC . Paralelo GNU também tem uma maneira de ler a entrada de um arquivo usandoparallel ... :::: file.sql
. HTH.Algumas melhorias triviais:
Remova a opção -i, se possível, a distinção entre maiúsculas e minúsculas é bastante lenta.
Substitua o
.
por\.
Um único ponto é o símbolo regex para corresponder a qualquer caractere, que também é lento
fonte
Duas linhas de ataque:
-i
ou você tem a possibilidade de se livrar dele?grep
é de thread único, então você pode querer começar mais deles em deslocamentos diferentes.fonte
Se você precisar pesquisar várias strings, grep -f strings.txt economiza muito tempo. O texto acima é uma tradução de algo que estou testando no momento. os valores das opções -j e -n parecem funcionar melhor para o meu caso de uso. O grep -F também fez uma grande diferença.
fonte