Obtenha o tamanho do arquivo de arquivo .gz muito grande em uma plataforma de 64 bits
Pergunta
De acordo com a especificação do GZ, o tamanho do arquivo é salvo nos últimos 4bytes de um arquivo .gz.
Eu criei 2 arquivos com
dd if=/dev/urandom of=500M bs=1024 count=500000
dd if=/dev/urandom of=5G bs=1024 count=5000000
Eu os gzipe
gzip 500M 5G
Eu verifiquei os últimos 4 bytes fazendo
tail -c4 500M|od -I (returns 512000000 as expected)
tail -c4 5G|od -I (returns 825032704 as not expected)
Parece que atingir a barreira invisível de 32 bits faz com que o valor seja escrito no Isize completamente sem sentido. O que é mais irritante, do que se eles tivessem usado algum erro.
Alguém sabe de uma maneira de obter o .gz Filesize não compactado do .gz sem extraí -lo?
obrigado
especificação: http://www.gzip.org/zlib/rfc-gzip.html
Editar: se alguém para experimentar, você pode usar /dev /zero em vez de /dev /urandom
Solução
Não há um.
A única maneira de obter o tamanho exato de um fluxo compactado é realmente ir e descompactá -lo (mesmo que você escreva tudo para /dev /null e apenas conte os bytes).
Vale a pena notar que o ISize é definido como
Isize (tamanho da entrada)
Isso contém o tamanho da entrada original (não compactada)
Módulo de dados 2^32.
no gzip RFC Então não é realmente quebra Na barreira de 32 bits, o que você está vendo é um comportamento esperado.
Outras dicas
Eu não tentei isso com um arquivo do tamanho que você mencionou, mas muitas vezes encontro o não compactado tamanho de um arquivo .gz com
zcat file.gz | wc -c
Quando não quero deixar o arquivo não compactado por aí ou me preocupar em comprimi -lo novamente.
Obviamente, os dados não são comprovados, mas são canalizados para wc
.
Vale a pena tentar, de qualquer maneira.
EDITAR: Quando tentei criar um arquivo 5g com dados de /dev /aleatório, ele produziu um arquivo 5G
do tamanho 5120000000, embora meu gerente de arquivos tenha relatado isso como 4.8g
Então eu compactei com gzip 5G
, os resultados 5G.gz
era do mesmo tamanho (não muita compressão de aleatória dados).
Então zcat 5G.gz | wc -c
relataram o mesmo tamanho do arquivo original: 5120000000 bytes. Então, minha sugestão parecia ter funcionado para este julgamento, de qualquer maneira.
Obrigado por esperar
O GZIP tem uma opção -l:
-l --list
For each compressed file, list the following fields:
compressed size: size of the compressed file
uncompressed size: size of the uncompressed file
ratio: compression ratio (0.0% if unknown)
uncompressed_name: name of the uncompressed file
The uncompressed size is given as -1 for files not in gzip format, such as compressed .Z files. To
get the uncompressed size for such a file, you can use:
zcat file.Z | wc -c
In combination with the --verbose option, the following fields are also displayed:
method: compression method
crc: the 32-bit CRC of the uncompressed data
date & time: time stamp for the uncompressed file
The compression methods currently supported are deflate, compress, lzh (SCO compress -H) and pack.
The crc is given as ffffffff for a file not in gzip format.
With --name, the uncompressed name, date and time are those stored within the compress file if
present.
With --verbose, the size totals and compression ratio for all files is also displayed, unless some
sizes are unknown. With --quiet, the title and totals lines are not displayed.