Digamos que haja um db.sql.gz
tamanho enorme de 100 GB disponível https://example.com/db/backups/db.sql.gz
e o servidor suporte solicitações de intervalo .
Portanto, 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 consegui baixar o conteúdo parcial do arquivo gzipado, agora minha dúvida é como posso ler esse conteúdo parcial?
tentei gunzip -c db.sql.gz | dd ibs=1024 skip=0 count=1 > o.sql
mas dá erro
gzip: dbrrange.sql.gz: não está no formato gzip
O erro é aceitável, pois acho que na parte superior do arquivo pode haver blocos de cabeçalho que descrevem a codificação.
Percebi que, se estou baixando o arquivo sem deslocamento, consigo ler o arquivo usando gunzip
e canalizando.
curl -r 0-2024 https://example.com/db/backups/db.sql.gz
gzip
não produz arquivos compactados em bloco (consulte o RFC para obter os detalhes sangrentos), portanto, não é adequado para acesso aleatório por conta própria. Você pode iniciar a leitura de um stream e parar quando quiser, por isso seucurl -r 0-2024
exemplo funciona, mas não pode pegar um stream no meio, a menos que tenha um arquivo complementar para fornecer os dados que faltam (como os arquivos de índice criado porgztool
).Para conseguir o que você está tentando fazer, você precisa usar algum tipo de compactação de bloco; por exemplo
bgzip
(que produz arquivos que podem ser descompactados por planíciegzip
) oubzip2
, e faça algum trabalho na extremidade receptora para determinar onde estão os limites do bloco. Peter Cock escreveu alguns posts interessantes sobre o assunto: BGZF - Blocked, Bigger & Better GZIP! , Acesso aleatório a BZIP2?Apenas FWIW, gzip pode ser acessado aleatoriamente, se um arquivo de índice anterior tiver sido criado...
Desenvolvi uma ferramenta de linha de comando que pode acessar rapidamente e (quase) aleatoriamente um gzip se um índice for fornecido (se não for fornecido, será criado automaticamente):
https://github.com/circulomeos/gztool
gztool
pode ser usado para acessar partes do arquivo gzip original, se essas partes forem recuperadas nos pontos de byte específicos para os quais o índice apontou (-1 byte para ter certeza, porque gzip é um fluxo de bits, não bytes) ou melhor, depois deles.Por exemplo , se um índice aponta (
gztool -ll index.gzi
fornece esses dados) no byte compactado 1508611 do arquivo gzip e queremos 1M de bytes compactados depois disso:chunk.gz
ocupará no disco apenas o tamanho do bloco!Agora, o índice completo (anteriormente criado apenas uma vez: por exemplo
gztool -i *.gz
, para criar índices para todos os seus arquivos já compactados com gzip ougztool -c *
para compactar e criar índice) também deve ser recuperado. Observe que os índices são ~ 0,3% do tamanho do gzip (ou muito menores segztool
compactar os próprios dados).E agora a extração pode ser feita com gztool . O byte descompactado correspondente (ou um byte passado por aquele) de 1508610 compactado deve ser conhecido, mas o índice pode mostrar essa informação com
gztool -ll
. Veja exemplos aqui . Vamos supor que seja o byte 9009009. Ou o byte descompactado que queremos acabou de receber o primeiro ponto de índice correspondente que está contido em chunk.gz. Vamos supor novamente que este byte também seria 9009009 para este caso.gztool
irá parar de extrair dados quando ochunk.gz
arquivo terminar.Talvez complicado, mas seria executado sem alterar o método de compactação nem os arquivos já compactados. Mas índices precisariam ser criados para eles.
NOTAS : Outra forma de fazer a extração sem usar o
-n
parâmetro é preencher o arquivo gzip com zeros esparsosdd
: isso é feito para o exemplo com um comando antes do primeirocurl
para recuperar ochunk.gz
arquivo, então:Desta forma, os primeiros 1508609 bytes do arquivo são zeros, mas não ocupam espaço em disco . Sem o comando
seek
indd
, os zeros são todos gravados no disco, o que valerá também paragzip
, mas assim não ocupamos espaço desnecessário no disco. Então, o comando gztool não precisa do-n
parâmetro. Os dados zerados não são necessários porque, como o índice existe,gztool
ele será usado para pular para o ponto de índice imediatamente antes da posição descompactada de 9009009 bytes, portanto, todos os dados anteriores são simplesmente ignorados: