OpenZL 0.2.0

1000px.jpg

После семи месяцев разработки состоялся выпуск 0.2.0 фреймворка OpenZL, предназначенного для создания компрессоров данных без потерь.

Фреймворк состоит из базовой библиотеки и инструментов для создания специализированных компрессоров, описанных на языке SDDL.
Для создания хорошего специализированного компрессора есть два этапа:

  1. Анализ данных для извлечения структуры.
  2. Использование хороших бэкенд-компрессоров, которые используют полученную структуру для достижения хорошего сжатия.

OpenZL предоставляет инструменты для обоих этапов.

Проект написан на языках C и C++ и распространяется по лицензии BSD.

Основные изменения

SDDL2

SDDL был полностью переработан с нуля для достижения заложенных целей проектирования. Если первоначальная демо-версия представляла собой упрощённую среду выполнения, то SDDL2 — это полноценный компилятор: синтаксический анализатор передаёт данные семантическому анализатору, тот, в свою очередь, передаёт типизированное абстрактное синтаксическое дерево (AST) оптимизатору, а оптимизатор управляет генератором кода, который генерирует байт-код виртуальной машины.

Ключевым результатом является мгновенный синтаксический анализ. Когда расположение записи можно полностью определить только по параметрам и константам, движок переходит непосредственно к любому полю, не сканируя предшествующие байты, что обеспечивает доступ без копирования и пропускную способность в несколько ГБ/с.

Сам язык развивался вместе с набором инструментов. Теперь он поддерживает блоки when для условных расположений, параметризованные и анонимные записи, доступ к членам полей записи, а также побитовые и логические операторы.

Что касается удобства разработчика, то этап семантического анализа теперь выявляет неопределенные ссылки, несоответствия типов и ошибки арности на этапе компиляции — с указанием местоположения в исходном коде –, а не во время выполнения, а также выпущено расширение VS Code для подсветки синтаксиса файлов .sddl.

Новый встроенный кодек LZ

В OpenZL теперь включен собственный LZ-кодек, представленный в виде ZL_GRAPH_LZ, а также профиль последовательной компресии в утилите zli. Работа над кодеком продолжается: ведётся расширение набора функций и повышение производительности при обработке небольших входных данных. На данный момент он поддерживает функциональность, эквивалентную zstd уровня 1, с размером окна компрессии 64 КБ.

OpenZL даёт возможность перепроектировать каждый этап конвейера LZ с целью повышения скорости. Его графовая архитектура также позволяет комбинировать этапы энтропийного кодирования вместо того, чтобы использовать единый конвейер, который одинаково хорошо подходит для всех сценариев использования. Затем несколько этапов можно объединить в одну операцию для повышения скорости обработки. Это позволяет OpenZL обеспечить на 10% более высокую скорость сжатия и на 70% более высокую скорость распаковки по сравнению с Zstandard уровня 1 на корпусе Silesia в наших тестах:

CompressorCompression RatioCompression SpeedDecompression Speed
OpenZL LZ level 12.74466 MB/s2288 MB/s
Zstd level 1 with 64K window size2.74419 MB/s1254 MB/s
Zstd level 12.89424 MB/s1345 MB/s

Поддержка очень больших входных данных

zli теперь поддерживает обработку огромных входных данных (объёмом в несколько гигабайт). Перед сжатием такие данные теперь автоматически разбиваются на фрагменты управляемого размера (по умолчанию — примерно 16МБ), что позволяет ограничить объём используемой памяти, повысить локальность данных и открывает возможности для параллельной обработки. В SDDL2 реализована аналогичная функция автоматического фрагментирования при работе по схеме. В процессе были созданы или обновлены новые сегментаторы — для CSV, Parquet и стандартных числовых данных — и все сегментаторы теперь сериализуемы и настраиваемы, так что выбранная компоновка может быть сохранена в компрессоре и повторно использована позже.

Это прозрачно применяется во время сжатия. Обратите внимание, что конвейер обучения отличается и остается незатронутым, поэтому он не предназначен для приема гигантских входных данных в качестве учебного материала.

Улучшения в онлайн-визуализаторе графа (попробовать)
Теперь визуализатор распознает трассировки сжатия и распаковки от начала до конца.

Панель предварительного просмотра потока позволяет просматривать байты, фактически проходящие по каждому ребру, а благодаря элементам управления обрезанием даже большие потоки остаются удобными для работы.

Панель настроек объединяет все параметры отображения в одном месте, а полный набор клавиш быстрого доступа — навигация по направлениям, упорядоченный обход, развертывание и сворачивание, выбор узлов — позволяет удобно работать с инструментом без мыши.

Теперь трассировки имеют версии, сжатие с разбиением на блоки отображается правильно, а zli наконец-то может генерировать собственные трассировки с помощью новых флагов --trace и --trace-streams-dir.

Разное

  • В каталог добавлены несколько кодеков. Кодеки Partition и bitpack теперь используют объединённый декодер. Кодек Floating-point bitsplit получил специальные кодировщики и декодеры для форматов fp16, fp32, fp64 и bf16 со специализированными ускорениями. Добавлены разбиение с учётом диапазона (split_byrange), мультиплексор длины, кодек sentinel, граф lz4 и небольшие вспомогательные функции, такие как tryParseInt и splitByParam.
  • Упорядочен API.
  • Улучшено фуззинг-тестирование.
  • Улучшен процесс сборки и пакетирования для большего числа платформ.

>>> Подробности на GitHub и в первой редакции новости

©  Linux.org.ru