L'azienda Meta* ha presentato uno strumento per la compressione e la decompressione dei dati OpenZL, che mostra un livello di compressione e una velocità di elaborazione superiori rispetto ai formati Zstd e XZ. OpenZL è stato progettato per la compressione efficiente di set di dati strutturati, ad esempio, quelli utilizzati nel machine learning, nonché di archivi contenenti campi con vari tipi di informazioni ripetute. Il codice OpenZL è scritto in C/C++ ed è open source sotto licenza BSD.
Durante la compressione di un database con il catalogo astronomico delle stelle SAO, lo strumento OpenZL ha ridotto la dimensione dei dati di 2,06 volte, mentre l'algoritmo zstd ha compresso le informazioni di 1,31 volte, e XZ di 1,64 volte. Inoltre, in termini di velocità di compressione, OpenZL ha superato zstd di due volte (203 MB/s contro 115 MB/s) e XZ di 65 volte (203 MB/s contro 3,1 MB/s). La decompressione in OpenZL è stata leggermente più lenta di zstd (822 MB/s contro 890 MB/s) e 27 volte più veloce di XZ.

OpenZL non è un algoritmo di uso generale e mostra buoni risultati solo per dati con una struttura nota in anticipo. Il funzionamento di OpenZL consiste nella generazione adattativa di un compressore basata sulla descrizione dei dati fornita. Di conseguenza, viene creato un codice per la compressione, ottimizzato per un formato di dati specifico. Per la decompressione viene utilizzato un decompressore universale, compatibile con tutti i compressori generati.
La compressione e la decompressione avvengono tramite un'unica utilità "zli" o la libreria libopenzl. La struttura dei dati è descritta sotto forma di profili. Già inclusi ci sono un insieme di profili predefiniti che descrivono formati di archiviazione tipici. Ad esempio, un profilo per il formato CSV o per dati memorizzati come un array di numeri interi a 64 bit. La compressione si riduce alla scelta del profilo con il comando "zli list-profiles" e all'avvio del processo di compressione con il comando "zli compress --profile nome_profilo". Per la decompressione, basta avviare "zli decompress".
Per formati specifici è necessario creare un profilo personalizzato utilizzando il comando «zli train», che identifica le tendenze nei dati e crea un profilo con un livello di compressione ottimale. Utilizzando l'opzione «—pareto-frontier», il profilo creato può essere ottimizzato per accelerare l'imballaggio o l'estrazione, a discapito della riduzione del livello di compressione. Per descrivere formati complessi con strutture annidate e definire la disposizione dei formati di dati nelle strutture, può essere utilizzato il linguaggio SDDL (Simple Data Description Language).
Il metodo di creazione di imballatori ottimali si basa sull'applicazione di un insieme di codificatori primitivi, ognuno dei quali è più efficace per tipi e sequenze specifiche di dati. Per la compressione viene creato un grafo aciclico orientato per l'elaborazione dei dati, le cui nodi sono i codec e gli archi sono le varianti di dati nel formato in elaborazione. A seconda del tipo di dati in ingresso, viene selezionata una catena di codec che compattano in maniera ottimale l'elemento di dati ricevuto. Con tale organizzazione, l'intestazione del file viene compressa da un codec, il campo con i dati interi da un secondo, il campo con il contatore crescente da un terzo e il campo con i dati testuali da un quarto.

Fonte: opennet.ru
