O gunzip funciona na memória ou escreve no disco?

6

Temos nossos arquivos de log gzipados para economizar espaço. Normalmente nós os mantemos comprimidos e apenas fazemos

gunzip -c file.gz | grep 'test'

para encontrar informações importantes, mas estamos nos perguntando se é mais rápido manter os arquivos descompactados e fazer o grep.

cat file | grep 'test'

Houve algumas discussões sobre como funciona o gzip se fizesse sentido que, se ele fosse lido na memória e fosse descompactado, o primeiro seria mais rápido, mas se não fosse, o segundo seria mais rápido. Alguém sabe como o gzip descompacta os dados?

    
por Ryan Detzel 14.06.2010 / 14:36

6 respostas

4

Sempre será mais rápido aplicar o arquivo descompactado, já que não há sobrecarga associada a ele. Mesmo que você não esteja escrevendo um arquivo temporário, você está passando pelos movimentos de descompressão, que consomem CPU. Se você está acessando esses arquivos com bastante frequência, provavelmente é melhor mantê-los descompactados se você tiver espaço.

Dito isto, descarregar os dados para a saída padrão (gunzip -c, zcat, etc ...) não acionará a gravação em um arquivo temporário. Os dados são canalizados diretamente para o comando grep , que trata o fluxo descompactado como seu próprio padrão.

O artigo da Wikipedia sobre a codificação LZ * está aqui: link .

    
por 14.06.2010 / 14:53
3

Como sempre, nada supera a medição real.

Sua milhagem pode variar, mas, no meu sistema, o uso de um arquivo já descompactado ocupa cerca de um terço do tempo em que o encanamento zcat ou gunzip em grep ocorreu. Isso não é surpreendente.

    
por 14.06.2010 / 15:36
1

Você também pode substituir o gzip por lzo para melhorar o desempenho.

O uso do LZO pode tornar as coisas mais rápidas (menor consumo de entrada de disco e menor sobrecarga de CPU de compactação)

    
por 14.06.2010 / 15:38
1

Usar a compactação pode realmente fornecer uma taxa de transferência mais rápida para os discos, mas isso depende de vários fatores, incluindo o algoritmo de compactação usado e o tipo de dados que você está movendo. ZFS , por exemplo, depende muito dessa suposição .

O gzip irá descompactar o arquivo inteiro para um arquivo temporário e renomeá-lo no final (padrão gzip -d myfile.gz ) ou não usar nenhum arquivo temporário ao ler alguns blocos de dados compactados por vez e cuspir dados não compactados no stdout ( gzip -d -c... ).

Em um sistema moderno, suspeito que um gunzip | grep poderia ser mais rápido do que um arquivo descompactado, por outro lado, gunzip | grep sempre venceria a descompactação de um arquivo e depois o grepping:

    
por 14.06.2010 / 23:04
0

gzip -dc | grep foo (ou gunzip -c) | grep foo escreve para um pipe. Como o pipe é implementado depende do seu sistema operacional, mas geralmente ele permanecerá na memória. Como outros salientaram, o uso de um arquivo descompactado é sempre sempre mais rápido devido ao tempo que leva para descompactar os dados compactados. Usando um programa de compactação diferente pode ou não melhorar o desempenho; você sempre pode medir isso.

    
por 14.06.2010 / 16:28
0

Depende do tamanho do arquivo: quando a E / S domina, a CPU de fazer a descompactação leva menos tempo que a transferência de arquivos. Se a E / S dominará depende muito das velocidades relativas de sua CPU, seus sistemas de armazenamento e a largura de banda entre eles.

Além disso, como um complemento, grep -Z aka zgrep também é útil.

    
por 14.06.2010 / 21:58