Meta* har præsenteret et værktøj til komprimering og dekomprimering af data kaldet OpenZL, som i forhold til formaterne Zstd og XZ viser et højere niveau af kompression og hastighed. OpenZL er designet til effektiv komprimering af strukturerede datasæt, såsom dem der anvendes i maskinlæring, samt opbevaringssystemer, der indeholder felter med forskellige gentagne typer information. Koden til OpenZL er skrevet i C/C++ og er open source under BSD-licensen.
Ved komprimering af en database med det astronomiske katalog SAO, gjorde OpenZL det muligt at reducere datastørrelsen med 2,06 gange, mens zstd-algoritmen komprimerede informationen med 1,31 gange, og XZ med 1,64 gange. Samtidig overgik OpenZL zstd i komprimeringshastighed med det dobbelte (203 MB/s mod 115 MB/s) og XZ med 65 gange (203 MB/s mod 3,1 MB/s). Dekomprimering med OpenZL viste sig at være kun lidt langsommere end zstd (822 MB/s mod 890 MB/s) og 27 gange hurtigere end XZ.

OpenZL er ikke en generel algoritme og viser kun gode resultater for data med en forudkendt struktur. OpenZLs funktionalitet består i adaptiv generering af en kompressor baseret på den leverede databeskrivelse. Resultatet er en komprimeringskode, der er optimeret til et specifikt dataformat. Til dekomprimering anvendes en universel dekompressor, der er kompatibel med alle genererede kompressorer.
Pakning og dekomprimering foretages ved hjælp af et enkelt værktøj kaldet 'zli' eller biblioteket libopenzl. Datastrukturen beskrives i form af profiler. Der er allerede inkluderet et sæt foruddefinerede profiler, der beskriver typiske lagringsformater. For eksempel en profil til CSV-formatet eller data, der er gemt som et array af 64-bit tal. Komprimering går ud på at vælge en profil med kommandoen 'zli list-profiles' og starte komprimeringsprocessen med kommandoen 'zli compress --profile profilnavn'. For at dekomprimere er det tilstrækkeligt at køre 'zli decompress'.
For specific formats, you need to create a custom profile using the command «zli train», which identifies patterns in the data and forms a profile with an optimal level of compression. Using the option «—pareto-frontier», the created profile can be upgraded towards faster packing or unpacking at the cost of reduced compression levels. For describing complex formats with nested structures and determining the layout of data formats in structures, the SDDL (Simple Data Description Language) can be used.
The method of creating optimal packers is based on the application of a set of primitive encoders, each of which is most effective for different types and sequences of data. For compression, a directed acyclic graph of data processing is formed, with nodes being the codecs and edges representing data variations in the processed format. Depending on the type of data input, a chain of codecs is selected that optimally compresses the incoming data element. In this organization, the file header is compressed by one codec, the integer data field by a second, the field with an increasing counter by a third, and the string data field by a fourth.

Kilde: opennet.ru
