ZPAQ
ZPAQ est un archiveur de ligne de commande open source pour Windows et Linux . Il utilise un format de journalisation ou d'ajout uniquement qui peut ĂȘtre restaurĂ© Ă un Ă©tat antĂ©rieur pour rĂ©cupĂ©rer les anciennes versions des fichiers et des rĂ©pertoires. Il prend en charge la mise Ă jour incrĂ©mentielle rapide en ajoutant uniquement les fichiers dont la date de derniĂšre modification a changĂ© depuis la mise Ă jour prĂ©cĂ©dente. Il compresse Ă l'aide de la dĂ©duplication et de plusieurs algorithmes ( LZ77, BWT et mixage de contexte ) en fonction du type de donnĂ©es et du niveau de compression sĂ©lectionnĂ©. Pour prĂ©server la compatibilitĂ© ascendante et descendante entre les versions Ă mesure que l'algorithme de compression est amĂ©liorĂ©, il stocke l'algorithme de dĂ©compression dans l'archive. Le code source ZPAQ inclut une API de domaine public, libzpaq, qui fournit des services de compression et de dĂ©compression aux applications C++ . Le format est considĂ©rĂ© comme non protĂ©gĂ© par des brevets.
Développé par | Matt Mahoney |
---|---|
DerniĂšre version | 7.15 ()[1] |
DĂ©pĂŽt | github.com/zpaq/zpaq |
Ăcrit en | C++ |
SystĂšme d'exploitation | Type Unix |
Formats lus | ZPAQ Archive (d) |
Formats Ă©crits | ZPAQ Archive (d) |
Type |
Logiciel de compression de données Logiciel d'archivage |
Licence | MIT, Public domain |
Site web | mattmahoney.net/dc/zpaq.html |
Format d'archive
Les fichiers sont enregistrés au format de journalisation ZPAQ niveau 2[2]. La norme définit deux formats - le streaming et la journalisation. Seul le format de journalisation prend en charge la déduplication, les attributs de répertoire et les versions de fichiers datées multiples.
Le format d'archive en continu est conçu pour ĂȘtre extrait en un seul passage. Une archive est divisĂ©e en une sĂ©quence de blocs qui peuvent ĂȘtre dĂ©compressĂ©s indĂ©pendamment en parallĂšle. Les blocs sont divisĂ©s en segments qui doivent ĂȘtre dĂ©compressĂ©s sĂ©quentiellement dans l'ordre. Chaque en-tĂȘte de bloc contient une description de l'algorithme de dĂ©compression. Chaque segment a un en-tĂȘte contenant un nom de fichier facultatif et un commentaire facultatif pour les mĂ©tadonnĂ©es telles que la taille, la date et les attributs, et une somme de contrĂŽle SHA-1 finale facultative des donnĂ©es d'origine pour la vĂ©rification de l'intĂ©gritĂ©. Si le nom du fichier est omis, il est supposĂ© ĂȘtre une continuation du dernier fichier nommĂ©, qui peut ĂȘtre dans le bloc prĂ©cĂ©dent. Ainsi, l'insertion, la suppression ou la rĂ©organisation des blocs dans une archive en continu a pour effet d'effectuer les mĂȘmes opĂ©rations sur les donnĂ©es que les blocs reprĂ©sentent.
Le format de journalisation consiste en une sĂ©quence de transactions, ou mises Ă jour. Une mise Ă jour contient 4 types de blocs : un bloc d'en-tĂȘte de transaction, une sĂ©quence de blocs de donnĂ©es, une sĂ©quence correspondante de tables de fragments et une sĂ©quence de blocs d'index. Un bloc d'en-tĂȘte de transaction contient la date de transaction et un pointeur sautant les blocs de donnĂ©es pour permettre une lecture rapide de l'index d'archive. Les blocs de donnĂ©es contiennent une sĂ©quence de fragments de fichiers compressĂ©s ensemble. Les tables de fragments donnent la taille et le hachage SHA-1 de chaque fragment. Les blocs d'index contiennent une liste des modifications apportĂ©es Ă l'index d'archive global. Une modification est soit une mise Ă jour de fichier, soit une suppression de fichier. Une mise Ă jour inclut un nom de fichier, la date de la derniĂšre modification, des attributs et une liste de pointeurs de fragment dans les transactions en cours et prĂ©cĂ©dentes. Les fragments peuvent ĂȘtre partagĂ©s par plusieurs fichiers. Une suppression ne supprime aucune donnĂ©e de l'archive, mais indique plutĂŽt que le fichier ne doit pas ĂȘtre extrait Ă moins que l'archive ne soit restaurĂ©e Ă une date antĂ©rieure.
La norme ZPAQ ne spĂ©cifie pas d'algorithme de compression. Au lieu de cela, il spĂ©cifie un format pour reprĂ©senter l'algorithme de dĂ©compression dans les en-tĂȘtes de bloc. Les algorithmes de dĂ©compression sont Ă©crits dans un langage appelĂ© ZPAQL et stockĂ©s sous forme de code d'octet qui peut ĂȘtre interprĂ©tĂ© ou converti directement en code x86 32 ou 64 bits et exĂ©cutĂ©. Un programme ZPAQL comporte 3 parties.
- COMP - Une chaßne facultative de composants de modélisation de contexte.
- HCOMP - Code machine pour le calcul des contextes des composants COMP.
- PCOMP - Code machine facultatif pour le post-traitement des données décodées.
Les modÚles COMP sont basés sur PAQ, qui compresse un bit à la fois en utilisant le codage arithmétique . Il existe 9 types de composants. Chaque composant prend un contexte et éventuellement les prédictions des composants précédents, et génÚre une prédiction ou une probabilité que le bit suivant soit un 1. La sortie du dernier composant est codée arithmétiquement. Les types de composants sont :
- CONST - Une prédiction fixe.
- CM - ModÚle de contexte. Le contexte est utilisé pour rechercher une prédiction dans une table. Lors de la mise à jour, l'entrée sélectionnée est ajustée pour réduire l'erreur de prédiction.
- ICM - ModÚle de contexte indirect. Le contexte est utilisé pour rechercher un état de 8 bits représentant un historique de bits récent. L'historique sélectionne une prédiction comme avec un CM.
- MIX - Un groupe de prédictions est combiné par moyenne pondérée dans le domaine logistique, ou log(p/(1-p)). Les poids sont sélectionnés par un contexte. Lors de la mise à jour, les pondérations sont ajustées pour favoriser les entrées les plus précises.
- MIX2 - Un MIX à 2 entrées avec des poids contraints de s'additionner à 1.
- AVG - Un MIX2 avec des poids fixes.
- SSE - Estimateur de symbole secondaire. Recherche une prédiction à partir d'une table interpolée en fonction d'un contexte et d'une prédiction quantifiée à partir d'un autre composant.
- ISSE - Estimateur indirect de symboles secondaires. Le contexte sélectionne un historique de bits comme avec un ICM, puis l'historique de bits sélectionne une paire de poids pour mélanger l'entrée avec une constante 1.
- MATCH - Recherche l'occurrence précédente du contexte et prédit le bit suivi, avec une force dépendant de la longueur de la correspondance.
La section HCOMP calcule les contextes des composants de la section COMP. C'est une machine virtuelle dont l'état est de 4 registres de 32 bits (A, B, C, D), un compteur de programme de 16 bits, un bit d'indicateur de condition et deux matrices de mémoire, une d'octets (M) et une de 32 bits. mots (H). Le début de H forme le tableau des contextes. Un programme de type langage assembleur est appelé une fois pour chaque octet codé ou décodé avec cet octet comme entrée dans A. Le contexte final vu par la section COMP est le contexte calculé combiné avec les bits précédemment vus de l'octet actuel.
La section optionnelle PCOMP est utilisée pour le post-traitement des données décodées. Il s'exécute dans une machine virtuelle distincte comme celle de HCOMP. Cependant, contrairement aux sections COMP et HCOMP qui sont utilisées à la fois pour la compression et la décompression, la section PCOMP n'est exécutée que pendant la décompression. Le compresseur est chargé d'effectuer l'opération inverse sur les données d'entrée avant le codage.
Exemple ZPAQL
Le code source ZPAQL utilise une syntaxe textuelle, chaque mot délimité par des espaces s'assemblant sur un octet dans la plupart des cas, et les commentaires entre parenthÚses. L'exemple suivant est la configuration intermédiaire, similaire à la compression de niveau 5. Il décrit une chaßne ICM-ISSE de composants prenant des contextes hachés d'ordres 0 à 5, un MATCH prenant un contexte d'ordre 7 et, comme étape finale, la moyenne de ces prédictions de bits à l'aide d'un MIX. Il n'y a pas de post-traitement.
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
end
Les paramÚtres COMP décrivent les tailles de base 2 du journal des tableaux de mots et d'octets (hh, hm), 8 octets chacun dans la section HCOMP et non utilisés dans la section PCOMP. Il y a n = 8 composants numérotés. Les composants prennent des paramÚtres décrivant leurs tailles de table et leurs entrées. En particulier, chaque ISSE prend son entrée du composant précédent, et le MIX prend l'entrée des 7 composants en commençant à 0. La ligne "5 isse 19 4" indique que l'ISSE a une taille de table de 2 historiques de 19 + 6 bits et prend son entrée du composant 4.
Dans la section HCOMP, les registres B et C pointent vers le tableau rotatif de 8 octets M, et D pointe vers le tableau de 8 mots H. M est utilisĂ© pour stocker les 8 derniers octets d'entrĂ©e du registre A. C pointe vers la tĂȘte de ce tampon. L'instruction HASH calcule :
a = (a + *b + 512) * 773;
Ainsi, le code stocke des hachages de contexte de différents ordres dans H[0]. . . H[7].
DĂ©duplication
Lors de la mise Ă jour, ZPAQ divise les fichiers d'entrĂ©e en fragments, calcule leurs hachages SHA-1 et les compare aux hachages stockĂ©s dans l'archive. S'il y a correspondance, les fragments sont supposĂ©s ĂȘtre identiques et seul un pointeur vers le fragment prĂ©cĂ©demment compressĂ© est stockĂ©. Sinon, le fragment est compressĂ© dans un bloc pour ĂȘtre compressĂ©. La taille des blocs peut aller jusqu'Ă 16 Mio Ă 64 Mio selon le niveau de compression.
Les fichiers sont divisés en fragments sur des limites dépendantes du contenu. PlutÎt qu'une empreinte digitale Rabin, ZPAQ utilise un hachage roulant qui dépend des 32 derniers octets qui ne sont pas prédits par un contexte d'ordre 1, plus tous les octets prédits entre les deux. Si les 16 premiers bits du hachage de 32 bits sont tous 0, alors une limite de fragment est marquée. Cela donne une taille moyenne de fragment de 64 KiB.
Le hachage roulant utilise une table de 256 octets contenant le dernier octet vu dans chaque contexte d'ordre 1 possible. Le hachage est mis à jour en ajoutant l'octet suivant puis en le multipliant soit par une constante impaire si l'octet a été prédit, soit par un nombre pair qui n'est pas un multiple de 4 si l'octet n'a pas été prédit.
Compression
ZPAQ a 5 niveaux de compression, du plus rapide au meilleur. à tous les niveaux sauf au meilleur, il utilise les statistiques de la table de prédiction d'ordre 1 utilisée pour la déduplication pour tester si l'entrée semble aléatoire. Si tel est le cas, il est stocké sans compression en tant qu'optimisation de la vitesse.
ZPAQ utilisera une transformation E8E9 pour améliorer la compression du code x86 généralement présent dans les fichiers .exe et .dll. Une transformation E8E9 recherche les instructions CALL et JMP (opcodes E8 et E9 hex) et remplace leurs adresses relatives par des adresses absolues. Ensuite, il insÚre du code dans la section PCOMP pour effectuer la transformation inverse.
Récupération d'erreur
ZPAQ manque de correction d'erreur mais possĂšde plusieurs fonctionnalitĂ©s qui limitent les dommages si l'archive est corrompue. Lors de la dĂ©compression, tous les hachages SHA-1 sont vĂ©rifiĂ©s. Si le hachage ne correspond pas ou si une autre erreur se produit, un avertissement est imprimĂ© et le bloc est ignorĂ©. Les blocs commencent par une "balise de localisation" de 13 octets contenant une chaĂźne choisie au hasard mais fixe pour permettre au dĂ©but du bloc suivant d'ĂȘtre trouvĂ© par balayage. Si un fragment de donnĂ©es est perdu, tous les fichiers faisant rĂ©fĂ©rence Ă ce fragment et les fragments restants dans le bloc sont Ă©galement perdus. Si une table de fragments est perdue, elle peut ĂȘtre rĂ©cupĂ©rĂ©e Ă partir d'une liste redondante de tailles de fragments stockĂ©es dans le bloc de donnĂ©es correspondant et en recalculant les hachages. Dans ce cas, un deuxiĂšme hachage de l'ensemble du bloc de donnĂ©es est vĂ©rifiĂ©. Si un bloc d'index est perdu, les fichiers correspondants sont perdus. Les blocs d'index sont petits (16 ko) afin de limiter les dĂ©gĂąts.
Les mises Ă jour sont traitĂ©es en ajoutant un en-tĂȘte de transaction temporaire, puis en mettant Ă jour l'en-tĂȘte comme derniĂšre Ă©tape. Si une mise Ă jour est interrompue, l'en-tĂȘte temporaire signale au ZPAQ qu'aucune donnĂ©e utile n'est trouvĂ©e aprĂšs. La prochaine mise Ă jour Ă©crasera ces donnĂ©es excĂ©dentaires.
Utilisation de base
Créer une archive et mettre à jour une archive
zpaq add directory/archive.zpaq directory/source_directory -mX -key password
Les options -mX
(avec X Ă©tant le niveau de compression de 0 Ă 5) et -key
(qui effectue le cryptage AES-256 ) peuvent ĂȘtre omises. Le niveau de compression 0 ne compresse pas les donnĂ©es, mais exĂ©cute toujours la dĂ©duplication des donnĂ©es. Les niveaux de compression 4 et 5 peuvent ĂȘtre trĂšs chronophages. La valeur par dĂ©faut (1) utilise une simple compression LZ77.
Lister le contenu des archives
zpaq list archive.zpaq
répertorie les fichiers et répertoires de la version la plus récente. L'ajout de -all
listera toutes les versions de tous les fichiers et répertoires, au format version_number/directory/file_name
. La sortie peut ĂȘtre traitĂ©e ultĂ©rieurement avec grep et d'autres outils.
Extraction des fichiers
zpaq extract archive.zpaq
la derniÚre version de l'intégralité de l'archive dans le répertoire actif. zpaq extract backup.zpaq path
que le répertoire (ou fichier) spécifié. L'ajout de l'option -until N
sĂ©lectionne la version, oĂč les nombres nĂ©gatifs sont autorisĂ©s. -2 extraira la troisiĂšme version la plus rĂ©cente de l'archive. L'option -to
indique Ă ZPAQ oĂč enregistrer les fichiers extraits.
zpaq extract backup.zpaq -all -only "*muppet*"
extraira toutes les versions de tous les fichiers et répertoires dont le nom contient "muppet". Différentes versions de fichiers seront placées dans différents répertoires ( 0001/ 0002/ 0003/
et cetera). -only
est facultatif.
Histoire
- 15 février 2009 - version expérimentale de zpaq 0.01.
- 12 mars 2009 - Finalisation de la spécification zpaq 1.00 garantissant la rétrocompatibilité.
- 29 septembre 2009 - zpaq 1.06, spécification mise à jour vers la v1.01, ajout de balises de localisation pour prendre en charge les archives auto-extractibles.
- 14 octobre 2009 - zpaq 1.09 ajoute ZPAQL au traducteur C++ pour optimiser la vitesse.
- 27 septembre 2010 - API libzpaq 0.01 séparée.
- 21 janvier 2011 - pzpaq 0.01, premiÚre version multithread, réincorporée plus tard dans zpaq.
- 13 novembre 2011 - zpaq 4.00, ajoute le compilateur JIT (ZPAQL Ă x86) Ă©liminant le besoin d'un compilateur C++ externe pour l'optimisation.
- 1er février 2012 - zpaq 5.00, spécification mise à jour vers la v2.00 pour autoriser une section COMP vide (post-traitement uniquement).
- 28 septembre 2012 - zpaq 6.00, spécification mise à jour vers v2.01 ajoutant le format de journalisation.
- 23 janvier 2013 - zpaq 6.19, divise les fonctions de développement en un programme distinct, zpaqd.
Projets liés
- Squash, une couche d'abstraction de compression prenant en charge de nombreux codecs .
- PeaZip, un archiveur prenant en charge plus de 150 formats, y compris l'extraction du format de streaming ZPAQ.
- fastqz, un compresseur FASTQ construit Ă l'aide de libzpaq[3].
- zpaqfranz, couteau suisse pour le gestionnaire sérieux de sauvegarde et de reprise aprÚs sinistre.
- wcx_zpaq, un plug-in packer (wcx) pour Total Commander[4].
Références
- « Release 7.15 », (consulté le )
- Mahoney, M. The ZPAQ Open Standard for Highly Compressed Data - Level 2, June 3, 2013
- Bonfield JK, Mahoney MV (2013) Compression of FASTQ and SAM Format Sequencing Data.
- « [WCX] ZPAQ », Total Commander Forums (consulté le )