Bzip2

le bzip2 est un l'algorithme sans perte ouvert libre de la compression de données de de la source de et et le programme développé par le Julian Seward . Seward a fait le premier dégagement public de bzip2, la version 0. La stabilité et la popularité du compresseur se sont développées au-dessus des plusieurs années à venir, et de la version libérée 1.0 de Seward vers la fin de 2000.

Efficacité de compression

bzip2 comprime la plupart des dossiers plus effectivement qu'un plus traditionnel Gzip ou une FERMETURE ÉCLAIR mais est plus lent. De cette manière il est assez semblable à d'autres algorithmes de compression de récent-génération. À la différence d'autres formats tels que RAR ou FERMETURE ÉCLAIR (et semblable au gzip), bzip2 est seulement un compresseur de données, pas un archiver. Le programme lui-même n'a aucun équipement pour les dossiers multiples, chiffrage ou archive-division, dans la tradition d'UNIX se fondant à la place sur des utilités externes séparées telles que le goudron et le GnuPG pour ces tâches.

Comme indiqué dans la première page du site Web bzip2, dans la plupart des cas bzip2 est surpassé par LZMA et algorithmes de la page par minute en termes d'efficacité absolue de compression. Selon l'auteur, bzip2 obtient à moins de dix à quinze pour cent de page par minute, tout en étant rudement deux fois aussi rapidement la compression et six fois à plus rapidement à la décompression.

bzip2 utilise le Burrows-Rouleur de transforme pour convertir des ordres fréquemment périodiques de caractère en cordes des lettres identiques, et puis applique un Déplacer-à-avant transforme et finalement codage de Huffman de . Dans bzip2 les blocs sont généralement toutes les mêmes tailles dans le plaintext, qui peut être choisi par une commande-ligne argument entre le kB - de 100 le kB 900. Des blocs de compression sont délimités par un ordre de 48 bits (nombre magique ) dérivé de la représentation de la décimale codée en binaire du π , 0x314159265359 de , avec l'extrémité-de-jet pareillement délimité par une valeur représentant la racine carrée (π de ), 0x177245385090.

À l'origine, le bzip d'ancêtre de bzip2 a employé le codage arithmétique après le blocksort ; ceci a été discontinué en raison de la restriction du brevet à remplacer par le codage de Huffman de actuellement utilisé dans bzip2.

bzip2 est connu pour être extrêmement lent à la compression, faisant des personnes opter pour des solutions de rechange telles que le Gzip ou le RAR quand le temps est une issue. Ce problème est asymétrique, car la décompression est relativement rapidement. Motivé par le grand temps- CPU exigé pour la compression, une version modifiée a été créée en 2003 que le soutenu multifile, donnant des améliorations significatives de vitesse sur multi-unité centrale de traitement et ordinateurs multinucléaires. À partir de 2007 cette fonctionnalité n'a pas été incorporée au projet principal.

Pile de compression

Bzip2 emploie plusieurs couches de techniques de compression empilées sur l'un l'autre, qui se produisent dans l'ordre suivant pendant la compression et l'ordre d'inversion pendant la décompression : codage (RLE) de Courir-longueur de : n'importe quel ordre de 4 à 255 symboles doubles consécutifs est remplacé par les quatre premiers symboles et une longueur de répétition entre 0 et 251. Ainsi le " d'ordre ; AAAAAAABBBBCCCD" ; est remplacé par le " ; AAAA \ 3BBBB \ 0CCCD" ; . Des séries de symboles sont toujours transformées après quatre symboles consécutifs, même si la courir-longueur est placée à zéro, pour maintenir la transformation réversible. Dans le pire des cas, elle peut causer une expansion de pre-BWT de 1.25 et dans le meilleur cas une réduction à <0.02 de format document. Noter que tandis que les spécifications tiennent compte théoriquement des séries de longueur 256 - 259 à coder, ceci n'est pas dans la pratique réalisé dû à l'utilisation du " limité ; char" ; datatype pour stocker et charger des longueurs de RLE. L'auteur considère cette étape une erreur historique -- elle n'améliore pas réellement la compression beaucoup, et a été prévue pour protéger l'algorithme de BWT contre des cas pathologiques.
  • Le Burrows-Rouleur de transforment (BWT) : c'est la bloquer-sorte réversible qui est au noyau de bzip2. Le bloc est entièrement d'un seul bloc, avec l'entrée et les amortisseurs de rendement demeurant les mêmes taille-dans bzip2, la limite d'opération pour cette étape est le kB 900. Pour la bloquer-sorte, on crée la matrice (notionnelle) d'a dans laquelle la rangée i contient la totalité de l'amortisseur, tourné jusqu'au début à partir du symbole de i^ \ mathrm {Th} . Après rotation, les rangées de la matrice sont assorties dans l'ordre (numérique) alphabétique. Des 24 indicateurs de bit sont stockés marquant la position de départ de pour quand le bloc untransformed. Dans la pratique, il n'est pas nécessaire de construire la pleine matrice, plutôt la sorte est exécuté using des indicateurs pour chaque position dans l'amortisseur. L'amortisseur de rendement est la dernière colonne de la matrice ; ceci contient l'amortisseur entier, mais l'a commandé à nouveau de sorte qu'il soit susceptible de contenir de grandes séries de symboles identiques.
  • Mouvement de d'affronter (MTF) : encore, ceci transforment ne change pas la taille du bloc traité. Chacun des symboles en service dans le document est placé dans une rangée. Quand un symbole est traité, il est remplacé par son indice inférieur (compenser) dans la rangée et ce symbole est brouillé à l'avant de la rangée. L'effet est que des symboles immédiatement périodiques sont remplacés par les symboles zéro (les longues séries de n'importe quel symbole arbitraire de deviennent ainsi des séries de symboles zéro), alors que d'autres symboles remapped selon leur frequency.
    local beaucoup de " ; natural" ; les données contiennent les symboles identiques qui se reproduisent dans une marge limitée (le texte est un bon exemple). Pendant que les MTF transforment assignent des valeurs basses aux symboles qui réapparaissent fréquemment, ceci a comme conséquence un train de données de données qui contient beaucoup de symboles dans la basse gamme de nombre entier, bon nombre d'entre eux étant identiques (les différents symboles périodiques d'entrée peuvent réellement tracer au même symbole de rendement). De telles données peuvent être très efficacement codées par n'importe quelle méthode de compression de legs.
  • codage (RLE) de Courir-longueur de : de longues cordes des symboles répétés dans le rendement (normalement zéros à cette heure) sont remplacées par une combinaison du symbole et un ordre de deux codes spéciaux, RUNA et RUNB, qui représentent la courir-longueur comme nombre binaire plus considérablement qu'un (1). L'ordre 0,0,0,0,0,1 serait représenté comme 0, RUNB, RUNA, 1 ; RUNB et RUNA représentant la valeur 4 dans la décimale. Le code de courir-longueur est terminé en atteignant un autre symbole normal. Ce processus de RLE est plus flexible que le RLE de l'étape 1, car il peut coder arbitrairement de longs nombres entiers (dans la pratique, ceci est habituellement limité par la longueur de bloc, de sorte que cette étape ne code pas une série de plus de 900000 bytes). La courir-longueur est codée de cette fa4con : l'attribution des valeurs d'endroit de 1 au premier peu, de 2 à la seconde, de 4 au tiers, etc. dans l'ordre de RUNA/RUNB, multiplient chaque valeur d'endroit dans une tache de RUNB par 2, et ajoutent toutes les valeurs d'endroit en résultant (pour des valeurs de RUNA et de RUNB de même) ensemble. Ainsi, l'ordre RUNB, RUNA a comme conséquence la valeur (1*2 + 2) = 4. Comme exemple plus compliqué :
  • : RUNA RUNB RUNA RUNA RUNB (ABAAB)
    &NBSP ;   ;   ; 1  ;   ;   ;   ; 2  ;   ;   ;   ; 4  ;   ;   ;   ; 8  ;   ;   ; 16
      ;   ;   ; 1  ;   ;   ;   ; 4  ;   ;   ;   ; 4  ;   ;   ;   ; 8  ;   ;   ; 32 =
  • 49 Codage de Huffman de : ce processus remplace des symboles de longueur fixe (octets) par des codes de longueur variable basés sur la fréquence de l'utilisation. Les codes plus fréquemment utilisés finissent vers le haut plus court (2 ou 3 bits) tandis que des codes rares peuvent être assignés jusqu'à 20 bits. Les codes sont choisis soigneusement de sorte qu'aucun ordre de peu ne puisse être confus pour un code différent d'extrémité-de-jet de code.
    The soit particulièrement intéressant. S'il y a différents bytes du n (symboles) utilisés dans les données non comprimées, alors le code de Huffman se composera de deux codes de RLE (RUNA et RUNB), de codes de symbole du n-1 et d'un code d'extrémité-de-jet. En raison du résultat combiné des codages de MTF et de RLE dans les deux étapes précédentes, il n'y a jamais n'importe quel besoin de mettre en référence explicitement le premier symbole dans la table de MTF, ainsi le symbole de l'économie une pour le marqueur d'extrémité-de-jet (et expliquer pourquoi seulement des symboles du n-1 sont codés dans l'arbre de Huffman). Dans le cas extrême où seulement un symbole est employé dans les données non comprimées, il n'y aura aucun code de symbole du tout dans l'arbre de Huffman, et le bloc entier se composera de RUNA et RUNB (répétant implicitement le byte simple) et un marqueur d'extrémité-de-jet avec la valeur 2.
  • : 0 : RUNA
    1 : RUNB
    2-257 : le byte évalue 0-255
    258 : fin de jet, procédé de finition. (pourrait être aussi bas que le
  • 2). Le multiple Huffman ajourne : plusieurs tables identique-classées de Huffman peuvent être employées avec un bloc si le gain de les employer est plus grand que le coût d'inclure la table supplémentaire. Au moins deux (2) et jusqu'à six (6) tables peuvent être présentes, avec la table la plus appropriée étant resélectionnée avant chaque 50 symboles traités. Ceci a l'avantage de avoir la dynamique très sensible de Huffman sans devoir sans interruption fournir de nouvelles tables, comme serait exigé dans le DÉGONFLENT . le codage de Courir-longueur dans l'étape précédente est conçu pour prendre soin des codes qui ont une probabilité inverse d'utilisation plus haut que le code de Huffman de code le plus court en service.
  • Codage unaire de la base 1 : si les tables multiples de Huffman sont en service, le choix de chaque table (numéro 0.5) est fait d'une liste par un peu zéro-terminé couru entre un (1) et six (6) bits de longueur. Le choix est dans une liste du MTF des tables. Using ce dispositif a comme conséquence une expansion maximum environ de 1.015, mais généralement moins. Cette expansion est susceptible d'être considérablement éclipsée par l'avantage de choisir des tables plus appropriées de Huffman et le commun-cas de la continuation pour employer la même table de Huffman est représenté en tant qu'à bit unique. Plutôt que le codage unaire, effectivement c'est une forme extrême d'un arbre de Huffman où chaque code a la moitié de la probabilité du
  • précédent de code.

    Codage (Δ) de delta de : Des peu-longueurs de code de Huffman sont exigées pour reconstruire chacune des tables canoniques utilisées de Huffman. Chaque peu-longueur est stockée comme différence codée contre la peu-longueur précédente de code. Un zéro-peu (0) signifie que la peu-longueur précédente devrait être reproduite pour le code courant, tandis qu'un un-peu (1) signifie qu'un autre peu devrait être lu et la peu-longueur incrémentée ou décrémentait basé sur cette valeur. Dans le cas commun qu'un à bit unique est employé par symbole par table et plus mauvais cas-aller de la longueur une (1) à la longueur vingt (20) - exigerait approximativement 37 bits. En raison du codage plus tôt de MTF, les longueurs de code commenceraient à 2-3bits longtemps (des codes très fréquemment utilisés) et augmenteraient graduellement, la signification que le format de delta efficace-exige assez environ 300 bits (38 bytes) par pleine table de Huffman.
  • Rangée de peu clairsemée : une carte binaire est employée pour montrer quels symboles sont employés à l'intérieur du bloc et devraient être inclus dans les arbres de Huffman. Les données binaires sont susceptibles d'employer chacun des 256 symboles représentables par un byte, tandis que les données textuelles peuvent seulement employer un petit sous-ensemble de valeurs disponibles, peut-être couvrant la gamme du ASCII entre 32 et 126. Le stockage de 256 bits zéro serait inefficace s'ils étaient la plupart du temps inutilisés. Une méthode clairsemée du est employée, les 256 symboles sont divisés en 16 gammes et seulement si des symboles sont employés dans ce bloc est une rangée de 16 bits incluse. La présence de chacune de ces 16 gammes est indiquée par une rangée de peu de 16 bits additionnelle à l'avant. Toutes les utilisations de carte binaire entre 32 et 272 bits de stockage (4-34 bytes). Pour le contraste, le DÉGONFLENT l'algorithme de montrerait l'absence d'un symbole en codant le symbole en tant qu'ayant la peu-longueur zéro ; c'est très inefficace avec le Delta-codage utilisé dans bzip2 qui est la raison de bzip2 ayant une rangée de peu séparée.

    Format de fichier

    Un jet de .bz2 se compose d'un en-tête de 4 bytes, suivi les blocs zéro ou plus comprimés, immédiatement suivis d'un marqueur d'extrémité-de-jet contenant un centre de détection et de contrôle à 32 bits pour le jet entier de plaintext traité. Les blocs comprimés peu-sont alignés et aucune remplissage ne se produit.

    < ! -- /* Paul Sladen, 2007-01-11 * -->

     .magic : 16 = signature du « BZ »/nombre magique .version : 8 = « h » pour Bzip2 ('codage de H'uffman), « 0 » pour Bzip1 (désapprouvé) taille de .hundred_k_block : 8 = « 1 ». « 9 » kB de la bloquer-taille 100 kB-900 

    .com pressed_magic : 48 = 0x314159265359 (BCD (pi)) .crc : 32 = somme pour ce bloc .randomised : 1 = 0=>normal, 1=>randomised (désapprouvé) .origPtr : 24 = engageant l'indicateur dans BWT pour après l'untransform .huffman_used_map : 16 = carte binaire, des gammes de 16 bytes, présent/pas présent .huffman_used_bitmaps : 0.256 = carte binaire, des symboles utilisés, actuel/pas présent (multiples de 16) .huffman_groups : le nombre 3 = 2.6 de Huffman différent ajourne en service .selectors_used : 15 = nombre de fois que le Huffman ajourne sont

  • permuté de
      (de chaque 50 bytes) .6 = zéro-a terminé les séries de peu (0.62) de table de MTF'ed Huffman (*selectors_used)
    .start_huffman_length : 5 = 0.20 longueur de bit de départ pour le
    deltas de Huffman .40 = symbole 0=>next ; longueur 1=>alter
  • {longueur 1=>decrement ; longueur 0=>increment} (* (symbols+2)*groups) .∞ = train de données de données codé par Huffman jusqu'à l'extrémité du bloc

    .eos_magic : 48 = 0x177245385090 (racine carrée de BCD (pi)) .crc : 32 = somme pour le jet entier .7 = alignent sur le byte entier

    Note pour des réalisateurs : En raison de la compression du premier étage de RLE (voir ci-dessus), la longueur maximum du plaintext qui un 900  simple ; le bloc du kB bzip2 peut contenir est autour de 46  ; Mb (45,899,235  ; bytes). Ceci peut se produire si le plaintext entier consiste entièrement en valeurs répétées (le dossier en résultant de .bz2 est dans ce cas-ci 46  ; bytes long).

    Utilisation

    Dans le Unix , bzip2 peut être employé a combiné avec ou indépendamment du goudron : dossier du bzip2 à comprimer et bzip2 - d file.bz2 aux uncompress (le de nom d'emprunt bunzip2 pour la décompression peut également être employé).

    la ligne de commande de bzip2 drapeaux sont la plupart du temps la même que dans le Gzip . Ainsi, pour extraire à partir d'un goudron-dossier de bzip2-compressed :

    bzip2 - d < archivefile .bz2 | goudron - xf - ou bunzip2 < archivefile .bz2 | goudron - xf -

    Pour créer un goudron-dossier de bzip2-compressed :

    goudron - Cf - noms de fichier de | bzip2 > archivefile .bz2

    Le goudron de GNU soutient a - le drapeau de j, qui permet la création des dossiers tar.bz2 sans canalisation : goudron - dossier-liste archivefile de du .bz2 de cjf

    Décompression dans le goudron de GNU : goudron - archivefile .bz2 de xjf

    Réalisations

    bzip2 : Exécution originale de référence de s de Julian Seward 'disponible sous un permis de schéma de .
    7-Zip : écrit par Igor Pavlov dans le C++ , la suite 7-Zip contient un encodeur bzip2/décodeur qui est librement autorisé.
    micro-bzip2 : une version par Rob Landley a conçu pour le nombre d'instructions compilé réduit et disponible sous le LGPL de GNU.bzip2 : Exécution de Java du système de construction de la fourmi d'Apache de disponible sous le permis d'Apache de .
    PBZIP2 : Pthreads parallèles - exécution basée de dans le C++ par Jeff Gilchrist.
    SelfImage : Nominalement une encre en poudre de disque de Windows, SelfImage manipule également bzip2 le dossier parallèle de/compression
    bzip2smp : une modification à libbzip2 qui a le " de parallélisation de la SMP ; in" entaillé ; par Konstantin Isakov.
    smpbzip2 : Des autres s'attaquent à bzip2 parallèle, par Niels Werensteijn.
    pyflate : un python pur bzip2 autonome de et le DÉGONFLENT le décodeur de ( Gzip ) par Paul Sladen. Probablement utile pour la recherche et le prototypage, rendu disponible sous le schéma / GPL / LGPL / DFSG autorise.
  • Voir également


    la liste d'archives compose
    Liste de des archivers de dossier
    Comparaison de des archivers de dossier
    Liste de des programmes d'Unix
    Rzip , un système à grande échelle de compression qui emploie Bzip2 comme un compresseur du deuxième étage suivant une étape de dictionnaire de LZ77-style.
    Random links:Gouvernement de l'Israël antique | David Sanes | Nikolai Viktorovich Avilov |

    de Wang Xizhi | Bâti Whisler | Bzip2