NOMBRE¶
bzip2, bunzip2 - un compresor de ficheros por ordenación de bloques, v0.9.0
bzcat - descomprime ficheros hacia la salida estándar
bzip2recover - recupera datos desde ficheros bzip2 dañados
SINOPSIS¶
bzip2 [
-cdfkstvzVL123456789 ] [
ficheros ... ]
bunzip2 [
-fkvsVL ] [
ficheros ... ]
bzcat [
-s ] [
ficheros ... ]
bzip2recover fichero
DESCRIPCIÓN¶
bzip2 comprime ficheros utilizando el algoritmo de compresión de
texto por ordenación de bloques de Burrows-Wheeler. Generalmente, la
compresión obtenida es considerablemente mejor que la de compresores
más convencionales basados en LZ77/LZ78, y se aproxima al rendimiento de
la familia PPM de compresores estadísticos.
Las opciones de la línea de comandos son deliberadamente muy similares a
las de
GNU Gzip, pero no son idénticas.
bzip2 espera que una lista de nombres acompañe las opciones de la
línea de comandos. Cada fichero es reemplazado por una copia comprimida
de él mismo, de nombre "nombre_original.bz2". Cada fichero
comprimido tiene la misma fecha de modificación y permisos que el
original correspondiente, de forma que estas propiedades puedan ser
recuperadas correctamente en el momento de la descompresión. El manejo de
los nombres de los ficheros es "ingenuo" en el sentido de que no hay
forma de preservar los nombres originales, los permisos y las fechas en los
sistemas de ficheros que carecen de estos conceptos, o que tienen serias
restricciones en el tamaño de los nombres, como por ejemplo MS-DOS.
Por defecto,
bzip2 y
bunzip2 no sobreescribirán ficheros
existentes. Si quieres que esto ocurra, especifica la opción -f.
Si no se especifica el nombre de ningún fichero,
bzip2
comprimirá desde la entrada estándar hacia la salida estándar.
En este caso,
bzip2 se negará a escribir la salida comprimida
hacia una terminal, ya que ésta sería totalmente incomprensible y
por lo tanto inútil.
bunzip2 (o
bzip2 -d) descomprime y recupera todos los ficheros
cuyos nombres acaben en ".bz2". Los ficheros sin este sufijo son
ignorados. Al igual que antes, si no se especifica el nombre de ningún
fichero, la descompresión se realiza desde la entrada estándar hacia
la salida estándar.
bunzip2 descomprimirá correctamente un fichero que sea la
concatenación de uno o más ficheros comprimidos. El resultado es la
concatenación de los correspondientes ficheros descomprimidos. Con (-t)
se puede comprobar la integridad de ficheros concatenados comprimidos.
También se pueden comprimir o descomprimir ficheros a la salida
estándar utilizando la opción -c. Múltiples ficheros pueden ser
comprimidos y descomprimidos de esta forma. Las salidas resultantes van siendo
pasadas secuencialmente hacia la salida estándar. La compresión de
múltiples ficheros de esta manera genera un flujo que contiene
múltiples representaciones de ficheros. Tal flujo solo puede ser
descomprimido correctamente por la versión 0.9.0 o superior de
bzip2; versiones anteriores de
bzip2 pararán tras
descomprimir el primer fichero del flujo.
bzcat (o
bzip2 -dc ) descomprime todos los ficheros especificados
hacia la salida estándar.
La compresión siempre se realiza, incluso aunque el fichero comprimido sea
ligeramente mayor que el original. Los ficheros de menos de cien bytes tienden
a hacerse más grandes, ya que el mecanismo de compresión tiene una
sobrecarga constante de unos 50 bytes. Datos aleatorios (incluyendo la salida
de la mayoría de compresores) son codificados a unos 8.05 bits por byte,
dando una expansión alrededor del 0.5%.
Como autocomprobación para tu protección,
bzip2 utiliza CRCs de
32 bits para asegurarse de que la versión descomprimida de un fichero es
idéntica a la original. Esto protege contra la corrupción de los
datos comprimidos, y contra fallos sin detectar en
bzip2
(afortunadamente es muy poco probable). La posibilidad de que la
corrupción de datos pase desapercibida es microscópica, alrededor de
una probabilidad entre cuatro billones por cada fichero procesado. Cuidado,
sin embargo, con que la comprobación se realiza tras la
descompresión, por lo que solo entonces se te informará de si algo
está mal. El programa no te puede ayudar a recuperar los datos originales
descomprimidos. Puede utilizar
bzip2recover para intentar recuperar los
datos de ficheros dañados.
VALOR DEVUELTO¶
0 para finalización normal, 1 para problemas de entorno (fichero no
encontrado, opciones no válidas, errores de E/S, etc...), 3 para un error
interno de consistencia (ej. un bug o fallo) que ha provocado que
bzip2
se asuste.
CONTROL DE MEMORIA¶
Bzip2 comprime en bloques los ficheros grandes. El tamaño del bloque
afecta tanto al porcentaje de compresión conseguido, como a la cantidad
de memoria necesitada para la compresión y la descompresión. Las
opciones -1 a -9 especifican que el tamaño de los bloques vaya de 100,000
bytes hasta 900,000 bytes (el utilizado) respectivamente. En el momento de
descompresión, el tamaño de bloque utilizado para la compresión
es leído de la cabecera del fichero comprimido y entonces
bunzip2
se asigna a si mismo la memoria justa para descomprimir el fichero. Puesto que
el tamaño de los bloques está guardado en los ficheros comprimidos,
se deduce que las opciones -1 hasta -9 son irrelevantes para la
descompresión y por tanto son ignoradas. Los requerimientos para la
descompresión y la compresión, en bytes, pueden ser calculados de
esta forma::
Compresión: 400k + ( 7 x tamaño de bloque )
Descompresión: 100k + ( 4 x tamaño de bloque ), o
100k + ( 2.5 x tamaño de bloque )
Los tamaños de bloques más grandes producen rápidamente
resultados marginales cada vez más pequeños. La mayor parte de la
compresión procede de los primeros doscientos o trecientos KBs de
tamaño de bloque, un hecho a considerar cuando se utilice
bzip2 en
máquinas pequeñas. También es importante apreciar que los
requerimientos de memoria en la descompresión vienen dados por el
tamaño de bloque elegido en la compresión.
Para ficheros comprimidos con el tamaño de bloque por defecto de 900k,
bunzip2 requerirá aproximadamente 3700 kbytes para descomprimir.
Para soportar la descompresión de cualquier fichero en una máquina
de 4MB,
bunzip2 tiene una opción para descomprimir utilizando
aproximadamente la mitad de esta cantidad de memoria, unos 2300 kbytes. La
velocidad de descompresión también se divide por dos, por lo que
solo se debe utilizar cuando sea necesario. La opción mencionada es -s.
En general, intenta utilizar el mayor tamaño de bloque que permita la
cantidad de memoria de tu sistema, puesto que esto maximiza la compresión
conseguida. La velocidad de compresión y descompresión no se ven
prácticamente afectadas por el tamaño de bloque.
Otro punto importante tiene que ver con los ficheros que caben en un solo bloque
-- eso equivale a la mayoría de ficheros que encontrará usando
grandes tamaños de bloque. La cantidad de memoria utilizada es
proporcional al tamaño del fichero, ya que el fichero es más
pequeño que un bloque. Por ejemplo, comprimir un fichero de 20.000 bytes
con la opción -9 hará que el compresor se asigne unos 6700k de
memoria, pero solo utilice 400k + 20000 * 7 = 540 kilobytes de ella. De forma
similar, el descompresor se asignará 3700k pero solo utilizará 100k
+ 20000 * 4 = 180 kbytes.
Aquí está una tabla que resume la utilización máxima de
memoria para los diferentes tamaños de bloque. También se recoge el
tamaño total resultante de compresión de 14 ficheros del
"Calgary Text Compression Corpus" que sumaban 3,141,622 bytes. Esta
columna da una idea de como varía la compresión en función del
tamaño de bloque. Estos datos no llegan a dar una verdadera idea de la
ventaja de tamaños de bloque grandes para ficheros grandes, ya que el
Corpus está dominado por ficheros pequeños.
Uso al Uso al Descomp. Tamaño
Opción comprimir descomp. usando -s del Corpus
-1 1100k 500k 350k 914704
-2 1800k 900k 600k 877703
-3 2500k 1300k 850k 860338
-4 3200k 1700k 1100k 846899
-5 3900k 2100k 1350k 845160
-6 4600k 2500k 1600k 838626
-7 5400k 2900k 1850k 834096
-8 6000k 3300k 2100k 828642
-9 6700k 3700k 2350k 828642
OPCIONES¶
- -c --stdout
- Comprime o descomprime hacia la salida estándar. -c
descomprimirá múltiples ficheros hacia la salida estándar,
pero solo comprimirá un solo fichero hacia la salida
estándar.
- -d --decompress
- Fuerza la descompresión. bzip2, bunzip2
y bzcat son en realidad el mismo programa, y la decisión sobre
la acción a realizar se toma en función del nombre que se
utilice. Esta opción ignora este mecanismo y hace que bzip2
descomprima.
- -z --compress
- El complementario a -d: fuerza la compresión,
independientemente del nombre con que se invoque.
- -t --test
- Comprueba la integridad del fichero(s) especificado, pero
no lo descomprime. En realidad se realiza una descompresión de prueba
y se lanza el resultado.
- -f --force
- Fuerza la sobrescritura de los ficheros de salida.
Normalmente, bzip2 no sobreescribe ficheros ya existentes.
- -k --keep
- Mantener (no borrar) los ficheros de entrada durante la
compresión o la descompresión.
- -s --small
- Reduce la utilización de memoria para la
compresión, la descompresión y la comprobación. Los
ficheros son descomprimidos y comprobados utilizando un algoritmo
modificado que solo requiere 2.5 bytes por cada byte del bloque. Esto
significa que cualquier fichero puede ser descomprimido en 2300k de
memoria, aunque a la mitad de la velocidad normal.
Durante la compresión, -s selecciona un tamaño de bloque de 200k,
lo que limita el uso de memoria a aproximadamente el mismo número, a
expensas del porcentaje de compresión. En pocas palabras, si su
máquina no tiene mucha memoria (8 megabytes o menos), utilice -s para
todo. Vea CONTROL DE MEMORIA arriba.
- -v --verbose
- Modo extenso (muestra el porcentaje de compresión para
cada fichero procesado). El uso de más opciones -v incrementa el
nivel de extensión, arrojando gran cantidad de información
principalmente de interés para usos de diagnóstico.
- -L --license -V --version
- Muestra la versión del programa, los términos de
la licencia y sus condiciones.
- -1 a -9
- Pone el tamaño de bloque a 100 k, 200 k .. 900 k en la
compresión. No afecta a la descompresión. Vea CONTROL DE MEMORIA
arriba.
- --repetitive-fast
- bzip2 introduce algunas variaciones pseudoaleatorias
en bloques muy repetitivos, para limitar los casos de peor funcionamiento
al comprimir. Si el ordenamiento encuentra dificultades, el bloque es
aleatorizado, y el ordenamiento se reinicia. En pocas palabras,
bzip2 lo intenta por tres veces antes de pasar a utilizar
aleatorización. Esta opción hace que lo deje de intentar mucho
antes.
- --repetitive-best
- Lo contrario de --repetitive-fast. Lo intenta mucho
más antes de pasar a la aleatorización.
RESCATANDO DATOS DESDE FICHEROS DAÑADOS¶
bzip2 comprime los ficheros en bloques, normalmente de 900kbytes. Cada
bloque se maneja de manera independiente. Si un error de transmisión o
del medio (físico) provoca que un fichero .bz2 multibloque sea
dañado, puede que sea posible recuperar los datos de los bloques intactos
que queden en el fichero.
La representación comprimida de cada bloque está delimitada por un
patrón de 48 bits, lo que hace posible el encontrar los límites de
los bloques con cierta certeza. Cada bloque contiene su propio CRC de 32 bit,
por lo que los bloques dañados puedes ser distinguidos de los intactos.
bzip2recover es un simple programa cuyo único propósito es la
búsqueda de bloques en ficheros .bz2, para su posterior escritura en su
propio fichero .bz2. Entonces puede utilizar
bzip2 -t para comprobar la
integridad de los ficheros resultantes y descomprimir aquellos que estén
intactos.
bzip2recover toma un solo argumento, el nombre del fichero dañado, y
crea un grupo de ficheros "rec0001fichero.bz2",
"rec0002fichero.bz2", etc, conteniendo los bloques extraídos.
Los nombres de salida están diseñados de forma que la
utilización de comodines en un procesado posterior (por ejemplo,
"bzip2 -dc rec*file.bz2 > recovered_data") liste los ficheros en
el orden "correcto".
bzip2recover será de mayor provecho cuando trate ficheros .bz2
grandes, ya que estos contendrán muchos bloques. Es inútil
utilizarlo en ficheros de un solo bloque dañados, ya que el bloque
dañado no podrá ser recuperado. Si desea minimizar cualquier posible
perdida de datos debida a un error del medio físico o de la
transmisión, puede considerar la utilización de tamaños de
bloque menores en la compresión.
NOTAS SOBRE El FUNCIONAMIENTO DEL PROGRAMA¶
La fase de ordenación del programa recoge y junta todas las cadenas
similares del fichero. Debido a esto, los ficheros que contienen series muy
largas de símbolos, tales como "aabaabaabaab ..." (repetida
varios cientos de veces) puede que se compriman de forma extraordinariamente
lenta. Puede utilizar la opción -vvvv para monitorizar en detalle el
progreso, si así lo desea. La velocidad de descompresión no se ve
afectada.
Estos casos patológicos son raros en la práctica, apareciendo
principalmente en ficheros de prueba construidos artificialmente, y en
imágenes a bajo nivel de discos. No es recomendable utilizar
bzip2
para comprimir estas últimas. Si obtiene un fichero que causa una
pronunciada lentitud al comprimir, intente utilizar un tamaño de bloque
tan pequeño como sea posible, con la opción -1.
Normalmente
bzip2 reserva varios megabytes de memoria para operar en
ellos, y entonces los utiliza de una manera bastante aleatoria. Esto significa
que el funcionamiento del programa, tanto para comprimir como para
descomprimir, se ve en gran parte determinado por la velocidad a la que su
máquina sea capaz de servir fallos de caché. Debido a esto, se ha
observado que pequeños cambios en el código para reducir la tasa de
fallos proporcionan una mejora desproporcionadamente grande en el
funcionamiento del programa. Supongo que
bzip2 funcionará mejor en
máquinas con caches de gran tamaño.
ADVERTENCIAS¶
Los mensajes de error de E/S no son tan útiles como podrían.
Bzip2 intenta detectar errores de E/S y salir limpiamente, pero los
detalles sobre la causa del problema a veces pueden ser engañosos.
Esta página del manual pertenece a la versión 0.9.0 de
bzip2.
Los datos comprimidos creados por esta versión son totalmente compatibles
en un sentido u otro con la anterior versión pública del programa,
la 0.1pl2, pero con la siguiente excepción: Solo la versión 0.9.0
puede descomprimir correctamente múltiples ficheros concatenados. La
0.1pl2 no puede hacer esto; parará justo después de descomprimir el
primer fichero en el flujo de datos.
La expansión de comodines bajo Windows 95 y NT no es perfecta.
bzip2recover utiliza enteros de 32 bits para representar las posiciones
de los bits en ficheros comprimidos, por lo que no puede manejar ficheros
comprimidos de más de 512 megabytes. Esto podría ser fácilmente
solucionado.
AUTOR¶
Julian Seward, jseward@acm.org.
http://www.muraroa.demon.co.uk
Las ideas incluidas en
bzip2 se deben (al menos) a la siguiente gente:
Michael Burrows y David Wheeler (por la transformación por
ordenación de bloques), David Wheeler (otra vez, por el codificador de
Huffman), Peter Fenwick (por el modelo de programación estructurada del
bzip, original, y por muchos refinamientos), y Alistair Moffat, Radford
Neal y Ian Witten (por el codificador aritmético del
bzip
original). Estoy en deuda con ellos por su ayuda, su apoyo y sus consejos. Vea
el manual en la distribución sin compilar para encontrar apuntes sobre
donde hallar fuentes de documentación. Christian von Roques me animó
a buscar algoritmos de ordenación más rápidos, para acelerar la
compresión. Bela Lubkin me alentó para que mejorara el
funcionamiento de la compresión en los casos peores. Mucha gente
envío parches, ayudó con los problemas de portabilidad, prestó
máquinas, dio consejo y fue de ayuda en general.