Lendo parcialmente baixado gzip com um deslocamento

2

Digamos que há um grande db.sql.gz de tamanho de 100 GB disponível https://example.com/db/backups/db.sql.gz e o servidor suporta solicitações de intervalo .

Então, em vez de baixar o arquivo inteiro, baixei y bytes (digamos 1024 bytes) com um deslocamento de x bytes (digamos 1000 bytes) como o seguinte.

curl -r 1000-2024 https://example.com/db/backups/db.sql.gz

Com o comando acima eu consegui baixar o conteúdo parcial do arquivo gzipado, agora minha pergunta é como eu posso ler esse conteúdo parcial?

Eu tentei gunzip -c db.sql.gz | dd ibs=1024 skip=0 count=1 > o.sql , mas isso dá um erro

gzip: dbrange.sql.gz: not in gzip format

O erro é aceitável, pois acho que no topo do arquivo pode haver blocos de cabeçalho que descrevem a codificação.

Percebi que, se estou baixando o arquivo sem um deslocamento, posso ler o arquivo usando gunzip e canalização.

curl -r 0-2024 https://example.com/db/backups/db.sql.gz

    
por bravokeyl 09.03.2018 / 10:41

1 resposta

2

gzip não produz arquivos compactados em bloco (consulte a RFC para obter detalhes sangrentos ), por isso não é adequado para acesso aleatório. Você pode começar a ler em um stream e parar quando quiser, e é por isso que o seu exemplo de curl -r 0-2024 funciona, mas você não pode escolher um stream no meio.

Para conseguir o que você está tentando fazer, é necessário usar algum tipo de compactação de bloco; por exemplo bgzip (que produz arquivos que podem ser descomprimidos por% normalgzip ) ou bzip2 , e fazer algum trabalho no final do recebimento para determinar onde estão os limites do bloco. Peter Cock escreveu alguns posts interessantes sobre o assunto: BGZF - Blocked, Bigger & ; Melhor GZIP! , Acesso aleatório ao BZIP2?

    
por 09.03.2018 / 11:19

Tags