L'azienda Meta* ha presentato uno strumento per la compressione e decompressione dei dati OpenZL, che rispetto ai formati Zstd e XZ dimostra un livello di compressione più elevato e una maggiore velocità. OpenZL è stato sviluppato per comprimere efficacemente insiemi di dati strutturati, come quelli utilizzati nel machine learning, nonché archivi contenenti campi con vari tipi di informazioni ripetute. Il codice di OpenZL è scritto in C/C++ ed è open source sotto licenza BSD.
Compressando 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, per quanto riguarda la 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 è risultata 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 già nota. Il funzionamento di OpenZL consiste nella generazione adattiva di un pacchetto sulla base della descrizione dei dati fornita. Ne risulta un codice per la compressione, ottimizzato per un formato di dati specifico. Per la decompressione viene utilizzato un decompressore universale, compatibile con tutti i pacchetti generati.
La compressione e decompressione avviene tramite un'unica utility ‘‘zli’’ o tramite la libreria libopenzl. La struttura dei dati viene descritta in forma di profili. È già incluso un insieme di profili predefiniti che descrivono formati di archiviazione standard. Ad esempio, un profilo per il formato CSV o per dati memorizzati come un array di numeri a 64 bit. La compressione si riduce alla selezione 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 eseguire ‘‘zli decompress’’.
Per formati specifici, è necessario creare un profilo personalizzato utilizzando il comando «zli train», che identifica le regole nei dati e genera un profilo con il livello di compressione ottimale. Utilizzando l'opzione «—pareto-frontier», il profilo creato può essere ottimizzato per accelerare il processo di impacchettamento o decompattamento, a scapito di una riduzione del livello di compressione. Per descrivere formati complessi con strutture annidate e determinare la distribuzione dei formati dei dati nelle strutture, può essere utilizzato il linguaggio SDDL (Simple Data Description Language).
Il metodo di creazione di impacchettatori ottimali si basa sull'uso di un insieme di codificatori primitivi, ognuno dei quali è più efficace per specifici tipi e sequenze di dati. Per la compressione, viene formato un grafo aciclico orientato per l'elaborazione dei dati, i cui nodi sono i codec e gli archi rappresentano le varianti di dati nel formato elaborato. A seconda del tipo di dati in ingresso, viene selezionata una catena di codec che comprime in modo ottimale l'elemento di dati ricevuto. In questa organizzazione, l'intestazione del file è compressa da un codec, il campo con i dati interi da un secondo, il campo con il contatore incrementale da un terzo e il campo con i dati stringa da un quarto.

Fonte: opennet.ru
