La société Meta* a présenté un outil de compression et de décompression de données, OpenZL, qui démontre un niveau de compression et une rapidité de traitement supérieurs par rapport aux formats Zstd et XZ. OpenZL est conçu pour compresser efficacement des ensembles de données structurées, par exemple, ceux utilisés dans l'apprentissage automatique, ainsi que des entrepôts contenant des champs avec divers types d'informations répétées. Le code OpenZL est écrit en C/C++ et est open source sous licence BSD.
Lors de la compression d'une base de données contenant le catalogue astronomique d'étoiles SAO, l'outil OpenZL a permis de réduire la taille des données de 2,06 fois, tandis que l'algorithme zstd a compressé les informations de 1,31 fois et XZ de 1,64 fois. En termes de vitesse de compression, OpenZL a surpassé zstd par deux fois (203 Mo/s contre 115 Mo/s) et XZ par 65 fois (203 Mo/s contre 3,1 Mo/s). La décompression avec OpenZL s'est révélée légèrement plus lente que zstd (822 Mo/s contre 890 Mo/s) mais 27 fois plus rapide que XZ.

OpenZL n'est pas un algorithme à usage général et montre de bons résultats uniquement pour des données dont la structure est connue à l'avance. Le fonctionnement d'OpenZL se résume à la génération adaptative d'un compresseur basé sur la description des données fournies. En conséquence, un code de compression optimisé pour un format de données spécifique est généré. Pour la décompression, un décompresseur universel compatible avec tous les compresseurs générés est utilisé.
La compression et la décompression se font à l'aide d'un seul utilitaire « zli » ou d'une bibliothèque libopenzl. La structure des données est décrite sous forme de profils. Un ensemble prédéfini de profils décrivant des formats de stockage standard est déjà inclus. Par exemple, un profil pour le format CSV ou des données stockées sous forme de tableau de nombres entiers sur 64 bits. La compression se résume à choisir un profil avec la commande « zli list-profiles » et à lancer le processus de compression avec la commande « zli compress —profile nom_du_profil ». Pour la décompression, il suffit de lancer « zli decompress ».
Pour les formats spécifiques, il est nécessaire de créer un profil personnalisé en utilisant la commande «zli train», qui identifie les motifs dans les données et crée un profil avec un niveau de compression optimal. En utilisant l'option «—pareto-frontier», le profil créé peut être amélioré pour accélérer l'emballage ou le déballage, au prix d'une réduction du niveau de compression. Pour décrire des formats complexes avec des structures imbriquées et déterminer la disposition des formats de données dans les structures, le langage SDDL (Simple Data Description Language) peut être utilisé.
La méthode de création des emballeurs optimaux repose sur l'utilisation d'un ensemble d'encodeurs primitifs, chacun étant le plus efficace pour des types et des séquences de données spécifiques. Pour la compression, un graphe orienté acyclique de traitement des données est formé, dont les nœuds sont des codecs et les arêtes représentent les variantes de données dans le format traité. En fonction du type de données entrant, une chaîne de codecs est choisie pour compresser de manière optimale l'élément de données reçu. Dans cette organisation, l'en-tête du fichier est compressé par un codec, le champ contenant des données entières par un second, le champ avec un compteur croissant par un troisième, et le champ contenant des données textuelles par un quatrième.

Source : opennet.ru
