bzip2(1) | General Commands Manual | bzip2(1) |
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
bzip2 [ -cdfkstvzVL123456789 ] [ ficheros ...
]
bunzip2 [ -fkvsVL ] [ ficheros ... ]
bzcat [ -s ] [ ficheros ... ]
bzip2recover fichero
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.
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.
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
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.
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.
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.
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.
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.