2009-12-27 27 views
6

De acuerdo con la especificación de gz, el tamaño del archivo se guarda en los últimos 4 bytes de un archivo .gz.obtener el tamaño de archivo del archivo .gz muy grande en una plataforma de 64 bits

He creado 2 archivos con

dd if=/dev/urandom of=500M bs=1024 count=500000 
dd if=/dev/urandom of=5G bs=1024 count=5000000 

les gziped

gzip 500M 5G 

Comprobé los últimos 4 bytes haciendo

tail -c4 500M|od -I  (returns 512000000 as expected) 
tail -c4 5G|od -I  (returns 825032704 as not expected) 

Parece que golpear la barrera de 32 bits invisibles, hace que el valor escrito en el ISIZE sea completamente absurdo. Lo cual es más molesto, que si hubieran usado algún bit de error en su lugar.

¿Alguien sabe de una forma de obtener el tamaño de archivo .gz sin comprimir del .gz sin extraerlo?

gracias

especificación: http://www.gzip.org/zlib/rfc-gzip.html

edición: si alguien para probarlo, se puede usar/dev/cero en lugar de/dev/urandom

+0

'dd buscan 10G = if =/dev/zero of = count = out.dat 0' es más práctico para la mayoría de los sistemas de archivos – nodakai

Respuesta

8

No hay una sola.

La única forma de obtener el tamaño exacto de una secuencia comprimida es ir y descomprimirla (incluso si escribe todo en/dev/null y solo cuenta los bytes).

Su pena señalar que ISIZE se define como

ISIZE (tamaño de la entrada)
Este contiene el tamaño de la entrada original (sin comprimir)
datos módulo 2^32.

en el gzip RFC por lo que es en realidad no romper en la barrera de 32 bits, el comportamiento de lo que se está viendo que se espera.

2

No he probado esto con un archivo del tamaño que usted menciona, pero a menudo encontrar el tamaño sin comprimir de un archivo .gz con

zcat file.gz | wc -c 

cuando no quiero dejar el archivo descomprimido por ahí o me molesto en comprimirlo nuevamente.

Obviamente, los datos no están comprimidos, pero luego se canalizan a wc.

Vale la pena intentarlo, de todos modos.

EDIT: Cuando intenté crear un archivo con datos de 5G/dev/random se produce un archivo de tamaño 5G 5120000000, aunque mi administrador de archivos informó esto como 4,8 g

Entonces Comprimí con gzip 5G , los resultados 5G.gz tenían el mismo tamaño (no mucha compresión de datos aleatorios).

Luego, zcat 5G.gz | wc -c informó el mismo tamaño que el archivo original: 5120000000 bytes. Así que mi sugerencia parecía haber funcionado para esta prueba, de todos modos.

Gracias por la espera

+0

Sí, gracias, pero mi pregunta era más en el sentido de. ¿Cómo obtengo el tamaño de archivo sin comprimir sin realizar una descompresión? Para archivos menores que 32 bits. Solo puede extraer los últimos 4 bytes. Esto no es posible para archivos más grandes, y como lo ha hecho, la única forma es realizar una descompresión. – monkeyking

+0

Pero mi método realizó una descompresión que no afectó el archivo comprimido original, y no creó un archivo adicional sin comprimir. No habría limpieza después. Y creo que vale la pena señalar que la respuesta que aceptaste decía que la descompresión era la * única * forma de obtener el tamaño exacto. Tiene sentido que * la única forma de descubrir qué hay en la caja sea abrirla *. – pavium

+0

Sí, no afectó el archivo original, pero mi preocupación no era "no tocar" el archivo, sino simplemente un problema de velocidad. Si quiero asignar una matriz para toda la información, entonces debería saber el tamaño. Eso requiere hacer una descompresión, seguida de otra descompresión para la copia de datos real. Esto no es necesario si el archivo es más pequeño que 2.1 gig. std gunzip también puede descomprimir a la salida estándar, haciendo -c archivo gunzip | wc -c Pero gracias por sus comentarios :) – monkeyking

0

gzip tiene una opción -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. 
+0

Esta solución funciona solo para un archivo de disco, no una secuencia (la pregunta original no especificaba una secuencia, por lo que a ese respecto es una respuesta viable). Desafortunadamente, para archivos con un tamaño superior a 2^32-1 bytes, el tamaño sin comprimir se muestra en el módulo 2^32, por lo que no es confiable. – Curt

Cuestiones relacionadas