zcat um arquivo linha por linha? [fechadas]

2

Eu escrevi um aplicativo C ++ que lê arquivos linha por linha. Ele lê uma linha, processa e lê a próxima linha.

Eu gostaria de adicionar suporte para arquivos gzipados, e estou procurando uma alternativa para usar bibliotecas de descompactação C ++. Uma solução é descompactar todo o arquivo e depois lê-lo como de costume.

No entanto, estou lidando com arquivos muito grandes e prefiro o tempo de inicialização rápida que o zcat fornece ao descompactar imediatamente as primeiras linhas do arquivo. O problema é que, sem controle, zcat iria descompactar muito o arquivo muito rapidamente para que meu aplicativo fosse mantido e o buffer de saída do comando do sistema fosse preenchido rapidamente com um arquivo descompactado de 10GB enquanto meu aplicativo ainda processava o primeiro poucas linhas.

É possível pausar zcat ou dizer para ler apenas uma linha por vez, avançando apenas quando o usuário indicar?

    
por Cory Klein 06.08.2013 / 20:25

3 respostas

3

Citado abaixo da página de manual de pipe (7) .

Pipe capacity

A pipe has a limited capacity. If the pipe is full, then a write(2) will block or fail, depending on whether the O_NONBLOCK flag is set (see below). Different implementations have different limits for the pipe capacity. Applications should not rely on a particular capacity: an application should be designed so that a reading process consumes data as soon as it is available, so that a writing process does not remain blocked.

In Linux versions before 2.6.11, the capacity of a pipe was the same as the system page size (e.g., 4096 bytes on i386). Since Linux 2.6.11, the pipe capacity is 65536 bytes.

O pipe tem uma capacidade específica, provavelmente 64k para o kernel moderno do Linux. Se essa capacidade for atingida, quaisquer gravações serão bloqueadas até que alguma sala esteja disponível após uma chamada de leitura. Portanto, geralmente, zcat your_file.gz | your_program teria apenas 64k descompactado a qualquer momento e, portanto, você não deveria se preocupar com o uso da memória.

    
por 06.08.2013 / 23:16
1

Se o seu aplicativo estiver configurado apenas para ler arquivos e não stdin , você poderá usar a substituição de processos. Ele funcionará de maneira semelhante a um pipe, mas o shell o apresentará ao seu aplicativo como um arquivo. Este recurso está disponível na maioria dos shells modernos, mas não é POSIX. Aqui está um exemplo:

yourscript <(zcat filename)
    
por 06.08.2013 / 20:45
0

Você pode usar pv para classificar os dados que você canaliza para zcat.

pv -L 5k -q < test.gz | zcat
    
por 06.08.2013 / 20:58