Différence: LZ77 vs. LZ4 vs. LZ4HC (algorithmes de compression)?

je comprends les algorithmes LZ77 et LZ78. J'ai lu à propos de LZ4 ici et ici et code.

ces liens décrivent le format de bloc LZ4. Mais ce serait bien si quelqu'un pouvait m'expliquer (ou me diriger vers une ressource expliquant):

  • Quelle est la différence entre LZ4 et LZ77?
  • EN QUOI LZ4HC diffère-t-il de LZ4?
  • quelle idée rend l'algorithme LZ4HC si rapide?
18
demandé sur twotwotwo 2015-02-20 21:09:37

1 réponses

LZ4 est construit pour compresser rapidement, à des centaines de MB/s par cœur. C'est un bon choix pour les applications où vous voulez une compression qui est très bon marché: par exemple, vous essayez de rendre un réseau ou un format sur disque plus compact, mais vous ne pouvez pas vous permettre de passer un tas de temps CPU sur la compression. C'est dans une famille, par exemple, prompt et IZO.

le point de comparaison naturel est zlib's DEFLATE algorithm, qui utilise LZ77 et codage Huffman et est utilisé dans gzip, le .ZIP and .Les formats PNG, et trop d'autres endroits à compter.

ces compresseurs rapides diffèrent parce que:

  1. ils utilisent un code de détection de répétition plus rapide (souvent un simple hashtable sans détection de collision), mais ne cherche pas à travers plusieurs correspondances possibles pour la meilleure (qui prendrait du temps mais entraînerait une compression plus élevée), et ne peut pas trouver certains court de matchs.
  2. ils essaient seulement de compresser les répétitions en entrée--ils n'essaient pas de tirer avantage du fait que certains octets sont plus communs que d'autres.
  3. étroitement liées à 2, elles génèrent des octets de sortie à la fois, et non des bits; autoriser des codes de fraction-d'octet permettrait parfois une plus grande compression, mais nécessiterait plus d'opérations CPU (potentiellement bit-shifting et masking and branching) pour encoder et décoder.
  4. Beaucoup de travail pratique a disparu dans rendant leurs implémentations rapides sur les processeurs modernes.

en comparaison, DEFLATE obtient une meilleure compression, mais compresse et décompresse plus lentement, et des algorithmes de haute compression comme LZMA, bzip2, LZHAM, ou brotli ont tendance à prendre encore plus de temps (si Brotli à ses réglages plus rapides peut rivaliser avec zlib). Il y a beaucoup de variation entre les algorithmes de haute compression, mais en gros, ils ont tendance à capturez les redondances sur de plus longues distances, profitez davantage du contexte pour déterminer quels octets sont probables, et utilisez des moyens plus compacts mais plus lents pour exprimer leurs résultats en bits.

LZ4HC est une variante "haute compression" de LZ4 qui, je crois, change le point 1 ci-dessus--le compresseur trouve plus d'une correspondance entre les données actuelles et passées et cherche la meilleure correspondance pour s'assurer que la sortie est petite. Cela améliore la compression rapport mais réduit la compression vitesse comparé à LZ4. La vitesse de décompression n'est pas mal, donc si vous compressez une fois et décompressez plusieurs fois et que vous voulez surtout une décompression très bon marché, LZ4HC aurait du sens.

notez que même un compresseur rapide peut ne pas permettre à un noyau de saturer une grande quantité de bande passante, comme celle fournie par les SSD ou les liens rapides dans les centres de données. Il existe même des compresseurs plus rapides avec des rapports plus faibles, parfois utilisés pour pack temporarily data in RAM. WKdm et Densité sont deux compresseurs de ce genre; un trait qu'ils partagent agit sur 4 octets lavable en mots d'entrée à un moment plutôt qu'en octets individuels. Parfois, le matériel spécialisé peut obtenir une compression très rapide, comme dans Samsung Exynos puces ou la technologie QuickAssist D'Intel.

si vous êtes intéressé à compresser plus de LZ4 mais avec moins de temps CPU que deflate, l'auteur de LZ4 (Yann Collet) a écrit une bibliothèque appelée Zstd; à sa version stable, Facebook posté sur la façon dont ils l'utilisent. Il utilise machines d'états finis, pas les codes de Huffman, pour le codage entropique; je ne suis pas un expert dans ce genre de choses, mais au moins l'algorithme est décrit en détail dans un RFC. modes les plus rapides de zstd approchent maintenant LZ4 en rapport et en vitesse. Pomme a écrit izfse sur des principes similaires. Quelques années en arrière, Google a publié une bibliothèque appelée gipfeli, bien qu'il ne semble pas avoir beaucoup de traction. Il y a aussi des projets visant une compression plus rapide dans le format Zlib, comme SLZ et patchs pour zlib par CloudFlare et Intel.

par rapport aux compresseurs les plus rapides, ces packers "moyens" ajoutent une forme de entropie d'encodage, ce qui veut dire qu'ils tirent avantage de la façon dont certains octets sont plus communs que d'autres et (en effet) mettez moins de bits dans la sortie pour les valeurs des octets les plus communs.

si la latence plutôt que le temps CPU total est votre principale préoccupation et que vous compressez un long flux, il y a des outils pour faire la compression en parallèle, comme pigz et -T option threading de l'outil en ligne de commande zstd. (Il y a divers expérimentales packers là-bas aussi, mais ils existent plus pour repousser les limites de vitesse ou de densité, plutôt que pour être utilisés aujourd'.)

donc, en général, vous avez un assez bon spectre de compresseurs alternatifs pour différentes applications: LZ4 (ou compresseurs de mémoire encore plus faible) pour la compression en temps réel, DEFLATE comme l'ancien standard pour la compression équilibrée et Zstd comme une alternative activement développée plus récente, et brotli et d'autres pour la compression élevée. Comme vous passez de LZ4 par DEFLATE à brotli vous layer sur plus d'effort pour prédire et encoder des données et obtenir plus de compression au coût d'une certaine vitesse.

49
répondu twotwotwo 2018-06-30 01:45:17