ZPAQ es un archivador de línea de comandos de código abierto para Windows y Linux . Utiliza un formato de registro o de solo adición que puede revertirse a un estado anterior para recuperar versiones anteriores de archivos y directorios. Admite actualizaciones incrementales rápidas agregando solo archivos cuya fecha de última modificación haya cambiado desde la actualización anterior. Comprime utilizando deduplicación y varios algoritmos ( LZ77 , BWT y mezcla de contexto ) según el tipo de datos y el nivel de compresión seleccionado. Para preservar la compatibilidad hacia adelante y hacia atrás entre versiones a medida que se mejora el algoritmo de compresión, almacena el algoritmo de descompresión en el archivo. El código fuente de ZPAQ incluye una API de dominio público , libzpaq , que proporciona servicios de compresión y descompresión a aplicaciones C++ . Se cree que el formato no está sujeto a patentes .
Formato de archivo
Los archivos se guardan en el formato de registro de nivel 2 de ZPAQ. [ 2 ] El estándar define dos formatos: transmisión continua y registro. Solo el formato de registro admite la deduplicación, los atributos de directorio y múltiples versiones de archivos con fecha.
El formato de archivo de transmisión está diseñado para extraerse en una sola pasada. Un archivo se divide en una secuencia de bloques que pueden descomprimirse de forma independiente y en paralelo. Los bloques se dividen en segmentos que deben descomprimirse secuencialmente. El encabezado de cada bloque contiene una descripción del algoritmo de descompresión. Cada segmento tiene un encabezado que contiene un nombre de archivo opcional y un comentario opcional para metadatos como tamaño, fecha y atributos, y una suma de verificación SHA-1 opcional al final de los datos originales para verificar la integridad. Si se omite el nombre del archivo, se asume que es una continuación del último archivo nombrado, que puede estar en el bloque anterior. Por lo tanto, insertar, eliminar o reordenar los bloques en un archivo de transmisión tiene el efecto de realizar las mismas operaciones sobre los datos que representan los bloques.
El formato de registro consta de una secuencia de transacciones o actualizaciones. Una actualización contiene cuatro tipos de bloques: un bloque de encabezado de transacción, una secuencia de bloques de datos, una secuencia correspondiente de tablas de fragmentos y una secuencia de bloques de índice. Un bloque de encabezado de transacción contiene la fecha de la transacción y un puntero que omite los bloques de datos para permitir una lectura rápida del índice del archivo. Los bloques de datos contienen una secuencia de fragmentos de archivo comprimidos. Las tablas de fragmentos proporcionan el tamaño y el hash SHA-1 de cada fragmento. Los bloques de índice contienen una lista de ediciones del índice global del archivo. Una edición puede ser una actualización o una eliminación de un archivo. Una actualización incluye el nombre del archivo, la fecha de última modificación, los atributos y una lista de punteros de fragmentos a las transacciones actual y anterior. Los fragmentos pueden ser compartidos por más de un archivo. Una eliminación no elimina ningún dato del archivo, sino que indica que el archivo no debe extraerse a menos que el archivo se revierta a una fecha anterior.
El estándar ZPAQ no especifica un algoritmo de compresión. En cambio, especifica un formato para representar el algoritmo de descompresión en los encabezados de bloque. Los algoritmos de descompresión se escriben en un lenguaje llamado ZPAQL y se almacenan como un código de bytes que puede interpretarse o convertirse directamente a código x86 de 32 o 64 bits y ejecutarse. Un programa ZPAQL consta de 3 partes.
- COMP - Una cadena opcional de componentes de modelado de contexto.
- HCOMP - Código máquina para calcular contextos para los componentes COMP.
- PCOMP: código máquina opcional para el postprocesamiento de los datos decodificados.
Los modelos COMP se basan en PAQ , que comprime un bit a la vez mediante codificación aritmética . Existen 9 tipos de componentes. Cada componente toma un contexto y, posiblemente, las predicciones de componentes anteriores, y genera una predicción o probabilidad de que el siguiente bit sea un 1. La salida del último componente está codificada aritméticamente. Los tipos de componentes son:
- CONST - Una predicción fija.
- CM - Modelo de contexto. El contexto se utiliza para buscar una predicción en una tabla. Al actualizar, la entrada seleccionada se ajusta para reducir el error de predicción.
- ICM - Modelo de contexto indirecto. El contexto se utiliza para buscar un estado de 8 bits que representa un historial de bits reciente. El historial selecciona una predicción, al igual que con un CM.
- MEZCLA: Un grupo de predicciones se combina mediante un promedio ponderado en el dominio logístico, o log(p/(1-p)). Los pesos se seleccionan según el contexto. Al actualizar, los pesos se ajustan para favorecer las entradas más precisas.
- MIX2: una mezcla de 2 entradas con pesos restringidos a sumar 1.
- AVG - Una mezcla MIX2 con pesos fijos.
- SSE - Estimador de símbolos secundarios. Busca una predicción en una tabla interpolada a partir de un contexto y una predicción cuantificada de otro componente.
- ISSE - Estimador indirecto de símbolos secundarios. El contexto selecciona un historial de bits como con un ICM, y luego el historial de bits selecciona un par de pesos para mezclar la entrada con una constante de 1.
- COINCIDENCIA: Busca la aparición anterior del contexto y predice qué parte le siguió, con una precisión que depende de la longitud de la coincidencia.
La sección HCOMP calcula los contextos para los componentes de la sección COMP. Se trata de una máquina virtual cuyo estado consta de cuatro registros de 32 bits (A, B, C, D), un contador de programa de 16 bits, un bit de indicador de condición y dos matrices de memoria: una de bytes (M) y otra de palabras de 32 bits (H). El inicio de H forma la matriz de contextos. Se ejecuta un programa similar al lenguaje ensamblador una vez por cada byte codificado o decodificado, utilizando dicho byte como entrada en A. El contexto final que ve la sección COMP es el contexto calculado combinado con los bits previamente vistos del byte actual.
La sección opcional PCOMP se utiliza para el posprocesamiento de los datos decodificados. Se ejecuta en una máquina virtual independiente, al igual que HCOMP. Sin embargo, a diferencia de las secciones COMP y HCOMP, que se utilizan tanto para la compresión como para la descompresión, la sección PCOMP se ejecuta únicamente durante la descompresión. El compresor se encarga de realizar la operación inversa sobre los datos de entrada antes de la codificación.
Ejemplo de ZPAQL
El código fuente de ZPAQL utiliza una sintaxis textual, donde cada palabra separada por espacios se ensambla en un byte en la mayoría de los casos, y los comentarios se muestran entre paréntesis. El siguiente ejemplo corresponde a la configuración intermedia , similar a la compresión de nivel 5. Describe una cadena de componentes ICM-ISSE que toma contextos hash de órdenes del 0 al 5, una operación MATCH que toma un contexto de orden 7 y, como paso final, promedia estas predicciones de bits mediante una operación MIX. No se realiza ningún procesamiento posterior.
comp 3 3 0 0 8 (hh hm ph pm n) 0 icm 5 (order 0...5 chain) 1 isse 13 0 2 isse 17 1 3 isse 18 2 4 isse 18 3 5 isse 19 4 6 match 22 24 (order 7) 7 mix 16 0 7 24 255 (order 1) hcomp c++ *c=a b=c a=0 (save in rotating buffer M) d= 1 hash *d=a (orders 1...5 for isse) b-- d++ hash *d=a b-- d++ hash *d=a b-- d++ hash *d=a b-- d++ hash *d=a b-- d++ hash b-- hash *d=a (order 7 for match) d++ a=*c a<<= 8 *d=a (order 1 for mix) halt endLos parámetros COMP describen los tamaños en base 2 logarítmica de las matrices de palabras y bytes (hh, hm), 8 bytes cada una en la sección HCOMP y no utilizadas en la sección PCOMP. Hay n = 8 componentes numerados. Los componentes toman parámetros que describen los tamaños de sus tablas y las entradas. En particular, cada ISSE toma su entrada del componente anterior, y el MIX toma la entrada de los 7 componentes a partir del 0. La línea "5 isse 19 4" indica que el ISSE tiene un tamaño de tabla de 2 19+6 historiales de bits y toma su entrada del componente 4.
En la sección HCOMP, los registros B y C apuntan al array rotatorio de 8 bytes M, y D apunta al array de 8 palabras H. M se utiliza para almacenar los últimos 8 bytes de entrada del registro A. C apunta al inicio de este búfer. La instrucción HASH calcula:
a = (a + *b + 512) * 773;
De este modo, el código almacena hashes de contexto de varios órdenes en H[0]...H[7].
Eliminación de duplicados
Al actualizarse, ZPAQ divide los archivos de entrada en fragmentos, calcula sus hashes SHA-1 y los compara con los hashes almacenados en el archivo. Si coinciden, se asume que los fragmentos son idénticos y solo se almacena un puntero al fragmento previamente comprimido. De lo contrario, el fragmento se empaqueta en un bloque para su compresión. El tamaño de los bloques puede variar entre 16 y 64 MiB, según el nivel de compresión.
Los archivos se dividen en fragmentos según límites que dependen del contenido. En lugar de una huella digital de Rabin , ZPAQ utiliza un hash rotatorio que depende de los últimos 32 bytes que no se predicen mediante un contexto de orden 1, más cualquier byte predicho entre ellos. Si los 16 bits iniciales del hash de 32 bits son todos 0, se marca un límite de fragmento. Esto da como resultado un tamaño de fragmento promedio de 64 KiB.
El hash rodante utiliza una tabla de 256 bytes que contiene el último byte visto en cada posible contexto de orden 1. El hash se actualiza sumando el siguiente byte y luego multiplicándolo por una constante impar si el byte fue predicho, o por un número par que no sea múltiplo de 4 si el byte no fue predicho.
Compresión
ZPAQ cuenta con 5 niveles de compresión, desde el más rápido hasta el mejor. En todos los niveles, excepto en el mejor, utiliza las estadísticas de la tabla de predicción de orden 1 empleada para la deduplicación para comprobar si la entrada parece aleatoria. En caso afirmativo, se almacena sin compresión para optimizar la velocidad.
ZPAQ utiliza una transformación E8E9 (véase BCJ ) para mejorar la compresión del código x86 que se encuentra habitualmente en archivos .exe y .dll. Esta transformación busca las instrucciones CALL y JMP (códigos de operación E8 y E9 en hexadecimal) y reemplaza sus direcciones relativas por direcciones absolutas. A continuación, inserta código en la sección PCOMP para realizar la transformación inversa.
Recuperación de errores
ZPAQ carece de corrección de errores, pero cuenta con varias características que limitan los daños en caso de corrupción del archivo. Durante la descompresión, se comprueban todos los hashes SHA-1. Si el hash no coincide o si se produce algún otro error, se imprime una advertencia y se ignora el bloque. Los bloques comienzan con una "etiqueta de localización" de 13 bytes que contiene una cadena fija elegida aleatoriamente para permitir la localización del inicio del siguiente bloque mediante escaneo. Si se pierde un fragmento de datos, también se pierden todos los archivos que hacen referencia a ese fragmento y los fragmentos restantes del bloque. Si se pierde una tabla de fragmentos, se puede recuperar a partir de una lista redundante de tamaños de fragmentos almacenada en el bloque de datos correspondiente y recalculando los hashes. En este caso, se comprueba un segundo hash de todo el bloque de datos. Si se pierde un bloque de índice, se pierden los archivos correspondientes. Los bloques de índice son pequeños (16 KiB) para limitar los daños.
Las actualizaciones se realizan añadiendo una cabecera de transacción temporal y, como último paso, actualizando dicha cabecera. Si una actualización se interrumpe, la cabecera temporal indica a ZPAQ que no se han encontrado datos útiles después de la misma. La siguiente actualización sobrescribirá estos datos sobrantes.
Uso básico
Creación de un archivo y actualización de un archivo.
zpaq add directory/archive.zpaq directory/source_directory -mX -key password
Las opciones -mX(donde X representa el nivel de compresión de 0 a 5) y -key(que realiza el cifrado AES-256 ) pueden omitirse. El nivel de compresión 0 no comprime los datos, pero sí realiza la deduplicación. Los niveles de compresión 4 y 5 pueden ser muy lentos. El valor predeterminado (1) utiliza la compresión LZ77 simple.
Listado de contenidos del archivo
zpaq list archive.zpaqMuestra los archivos y directorios de la versión más reciente. Si se añade, -allse mostrarán todas las versiones de todos los archivos y directorios, en el formato version_number/directory/file_name. La salida se puede procesar posteriormente con grep y otras herramientas.
Extrayendo archivos
zpaq extract archive.zpaqDescomprimirá la última versión del archivo completo en el directorio activo. zpaq extract backup.zpaq pathSolo extraerá el directorio (o archivo) especificado. Al agregar la -until Nopción, se selecciona la versión, donde se permiten números negativos. -2 extraería la tercera versión más reciente del archivo. La opción -toindica a ZPAQ dónde guardar los archivos extraídos.
zpaq extract backup.zpaq -all -only "*muppet*"Extraerá todas las versiones de todos los archivos y directorios cuyo nombre contenga "muppet". Las diferentes versiones de archivos se colocarán en diferentes directorios ( 0001/ 0002/ 0003/etcétera). -onlyEs opcional.
Historia
- 15 de febrero de 2009 - Lanzamiento experimental de zpaq 0.01.
- 12 de marzo de 2009 - Se finaliza la especificación zpaq 1.00, garantizando la compatibilidad con versiones anteriores.
- 29 de septiembre de 2009 - zpaq 1.06, especificación actualizada a la versión 1.01: se añaden etiquetas de localización para admitir archivos autoextraíbles.
- 14 de octubre de 2009 - zpaq 1.09 añade ZPAQL al traductor de C++ como optimización de velocidad.
- 27 de septiembre de 2010 - API separada de libzpaq 0.01.
- 21 de enero de 2011 - pzpaq 0.01, primera versión multihilo, posteriormente reincorporada a zpaq.
- 13 de noviembre de 2011 - zpaq 4.00, añade un compilador JIT (ZPAQL a x86) eliminando la necesidad de un compilador C++ externo para la optimización.
- 1 de febrero de 2012 - zpaq 5.00, especificación actualizada a la versión 2.00 para permitir una sección COMP vacía (solo para posprocesamiento).
- 28 de septiembre de 2012 - zpaq 6.00, especificación actualizada a la versión 2.01, añadiendo formato de registro de transacciones.
- 23 de enero de 2013 - zpaq 6.19 separa las funciones de desarrollo en un programa independiente, zpaqd.
Proyectos relacionados
- Squash , una capa de abstracción de compresión que admite muchos códecs .
- PeaZip , un compresor que admite más de 150 formatos, incluyendo la extracción del formato de transmisión ZPAQ.
- fastqz , un compresor FASTQ construido usando libzpaq. [ 3 ]
- zpaqfranz , la navaja suiza para el gestor de copias de seguridad y recuperación ante desastres más exigente.
- wcx_zpaq , un complemento de empaquetado (wcx) para Total Commander. [ 4 ]
- Bandizip , un archivador que proporciona una velocidad de procesamiento ultrarrápida y funciones prácticas, incluido el soporte para el formato ZPAQ. [ 5 ]
Referencias
- ↑ "Versión 7.15" . 22 de septiembre de 2016. Consultado el 15 de marzo de 2018 .
- ↑ Mahoney, Matt (3 de junio de 2013). "El estándar abierto ZPAQ para datos altamente comprimidos - Nivel 2" (PDF) . Recuperado el 28 de mayo de 2023 .
- ↑ Bonfield JK, Mahoney MV (2013) Compresión de datos de secuenciación en formato FASTQ y SAM . PLoS ONE 8(3): e59190. doi:10.1371/journal.pone.0059190
- ↑ " [ WCX ] ZPAQ" . Foros de Total Commander . Consultado el 10 de julio de 2021 .
- ↑ «Bandizip - Formato de archivo ZPAQ» . Bandizip . Consultado el 19 de mayo de 2025 .
Enlaces externos
- Sitio web oficial

- Espejo no oficial en GitHub
- Introducción a zpaql con imágenes en escala de grises
- Formatos de archivo
- Software gratuito de compresión de datos
- Formatos abiertos
- Algoritmos de compresión sin pérdidas