2009-09-30 20 views
9

Digamos que tengo un archivo bzip2 (más de 5GB), y quiero descomprimir solo el bloque #x, porque allí están mis datos (el bloqueo es diferente cada vez). ¿Cómo haría esto?Descomprimir solo un bloque bzip2 específico

Pensé en hacer un índice de dónde están todos los bloques, luego cortar el bloque que necesito del archivo y aplicarle bzip2recover.

También pensé en comprimir digamos 1MB a la vez, luego anexar esto a un archivo (y registrar la ubicación), y simplemente tomar el archivo cuando lo necesito, pero prefiero mantener el archivo original bzip2 intacto.

Mi idioma preferido es Ruby, pero la solución de cualquier idioma está bien para mí (siempre que entienda el principio).

Respuesta

6

Hay una http://bitbucket.org/james_taylor/seek-bzip2

Grab la fuente, compilarlo.

Ejecutar con

./seek-bzip2 32 < bzip_compressed.bz2 

a prueba.

el único parámetro es el desplazamiento de bit de la cabecera del bloque. Puede obtenerlo con la búsqueda de una cadena hexadecimal "31 41 59 26 53 59" en el archivo binario. ESTO FUE INCORRECTO. El inicio del bloque puede no estar alineado con el límite de bytes, por lo que debe buscar todos los cambios de bit posibles de la cadena hexadecimal "31 41 59 26 53 59", como se hace en bzip2recover - http://www.bzip.org/1.0.3/html/recovering.html

32 es el tamaño de bit de "BZh1 "encabezado donde 1 puede ser cualquier dígito desde" 1 "hasta" 9 "(en el clásico bzip2) - es un tamaño de bloque (sin comprimir) en cientos de kb (no exacto).

+0

sic! el inicio de bloque no puede ser un límite de bytes :(Hay un programa bzip-table incluido en "seek-bzip2" para obtener una lista de desplazamiento de bits y tamaños de tamaños de bloques de datos originales. – osgx

+0

desafortunadamente, "bzip-table" es casi el mismo velocidad como descompresión real :(. Hace un ciclo de descompresión casi completo, pero no verifica el CRC. – osgx

+0

Además, echa un vistazo a los bzips paralelos, como pbzip2 de Jeff Gilchrist. En descompresión paralela necesita buscar los encabezados de un bloque. http://www.google.com/codesearch/p?hl=en#calSvFpbfuI/trunk/trunk/demo/pbzip2-1.0.2/pbzip2.cpp&q=pbzip2&sa=N&cd=2&ct=rc&l=3 función 'productor_decompresión' – osgx

2

Es cierto que bzip-table es casi tan lento como descomprimir pero, por supuesto, solo tiene que hacerlo una vez y puede almacenar la salida de alguna manera para utilizarla como índice. Esto es perfecto para lo que necesito, pero puede que no sea lo que todo el mundo necesita.

Aunque necesité un poco de ayuda para compilar en Windows.

+0

intente mingw con msys – osgx

+0

http://sourceforge.net/projects/mingw/files/Automated%20MinGW%20Installer/mingw-get-inst/mingw-get-inst-20110316/mingw-get-inst-20110316.exe/download – osgx

Cuestiones relacionadas