Открыть сервис

Zstandard

Zstandard (также известный как Zstd) — это алгоритм сжатия данных без потерь, разработанный компанией Meta (организация признана экстремистской и запрещена в РФ) в 2015 году. Относится к классу алгоритмов LZ77-подобного сжатия, использующих энтропийное кодирование, и предназначен для обеспечения высокой степени сжатия при скорости, сопоставимой с алгоритмами семейства LZ4 и gzip. Zstandard сочетает в себе гибкость настройки уровня сжатия (от 1 до 22) и возможность использования словарей, что делает его применимым как для потокового сжатия, так и для работы с фиксированными блоками данных.

История

Разработка Zstandard началась в 2015 году под руководством инженера Ян Коле (Yann Collet), ранее известного как создатель алгоритма LZ4. Первоначальная версия была выпущена в открытый доступ под лицензией BSD в августе 2015 года. Основной целью было создание алгоритма, который бы превосходил gzip по скорости сжатия и распаковки, сохраняя при этом сопоставимую степень сжатия. В 2016 году алгоритм был включён в состав ядра Linux (начиная с версии 4.14), а в 2018 году — в стандартную библиотеку сжатия Facebook (Meta, организация признана экстремистской и запрещена в РФ) для использования в проектах компании.

Ключевым этапом развития стало внедрение поддержки многопоточного сжатия в версии 1.3.0 (2017 год), что позволило значительно ускорить обработку больших объёмов данных. В 2020 году вышла версия 1.4.5, в которой была добавлена поддержка длинных последовательностей (Long Range Mode), улучшающая сжатие для данных с повторяющимися паттернами на больших расстояниях. По состоянию на 2024 год Zstandard остаётся одним из наиболее активно развиваемых алгоритмов сжатия с регулярными обновлениями.

Принцип работы

Zstandard использует комбинацию методов сжатия, основанных на алгоритме LZ77 (поиск повторяющихся последовательностей) и энтропийном кодировании. Основные этапы сжатия включают:

  • Поиск совпадений: алгоритм сканирует входные данные в поиске повторяющихся фрагментов (строк) и заменяет их ссылками на предыдущие вхождения.
  • Энтропийное кодирование: после удаления избыточности применяется кодирование Хаффмана или метод конечных состояний (Finite State Entropy, FSE), который является вариантом арифметического кодирования.
  • Управление окном: размер окна поиска (history window) по умолчанию составляет до 128 КБ, но может быть увеличен до 2 ГБ для режима длинных последовательностей.

Zstandard поддерживает 22 уровня сжатия (от 1 до 22), где более высокие уровни увеличивают степень сжатия за счёт большего времени обработки. Уровень 1 обеспечивает максимальную скорость, уровень 22 — максимальную степень сжатия. Для большинства практических задач используются уровни от 3 до 19.

Характеристики

Скорость и степень сжатия

Zstandard демонстрирует следующие показатели в сравнении с другими алгоритмами (на тестовых данных типа Silesia Corpus, 2023 год):

АлгоритмУровень сжатияСтепень сжатия (коэффициент)Скорость сжатия (МБ/с)Скорость распаковки (МБ/с)
Zstd32.8–3.2300–500800–1200
Zstd193.5–4.010–20600–900
gzip62.5–2.850–80200–300
LZ412.0–2.2400–6001000–1500

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

Потоковое сжатие

Zstandard поддерживает потоковый режим, позволяющий сжимать данные произвольного объёма без необходимости загрузки всего файла в память. Это достигается за счёт разбиения данных на блоки (по умолчанию 128 КБ) с независимым сжатием каждого блока. Для распаковки требуется только последовательное чтение блоков.

Словарное сжатие

Одной из ключевых особенностей Zstandard является возможность использования предварительно обученных словарей (dictionaries). Словарь представляет собой набор часто встречающихся строк и паттернов, характерных для конкретного типа данных (например, JSON-файлов, логов, текстов на русском языке). Применение словаря может увеличить степень сжатия на 10–30% для специализированных данных, при этом незначительно снижая скорость.

Применение

Zstandard широко используется в различных областях, где требуется эффективное сжатие данных:

  • Системы хранения данных: файловые системы (например, ZFS, Btrfs) и базы данных (MySQL, PostgreSQL) поддерживают Zstandard для сжатия таблиц и журналов.
  • Сетевые протоколы: HTTP-сжатие (Content-Encoding: zstd), протоколы передачи данных (например, SSH, WebSocket).
  • Форматы файлов: архиваторы (tar, 7-Zip), контейнеры для машинного обучения (ONNX, TensorFlow), форматы логов (Apache Arrow, Parquet).
  • Операционные системы: ядро Linux использует Zstandard для сжатия образов initramfs, а также в подсистеме сжатия памяти (zswap, zram).
  • Встраиваемые системы: благодаря низкому потреблению памяти и высокой скорости распаковки, Zstandard применяется в микроконтроллерах и IoT-устройствах.

Примеры использования

Командная строка

Для сжатия файла с помощью утилиты zstd (входит в состав пакета Zstandard):

``bash zstd -3 file.txt -o file.txt.zst # сжатие с уровнем 3 zstd -d file.txt.zst -o file.txt # распаковка ``

Программный интерфейс (C)

Пример сжатия данных с использованием библиотеки libzstd:

```c

include <zstd.h>

include <stdio.h>

int main() { const char src = "Пример данных для сжатия"; size_t srcSize = strlen(src) + 1; size_t dstSize = ZSTD_compressBound(srcSize); char dst = malloc(dstSize); size_t compressedSize = ZSTD_compress(dst, dstSize, src, srcSize, 3); printf("Сжато: %zu байт\n", compressedSize); free(dst); return 0; } ```

Критика и ограничения

Несмотря на широкое распространение, Zstandard имеет ряд ограничений:

  • Высокое потребление памяти при сжатии: для уровней 19–22 требуется до 1–2 ГБ оперативной памяти, что может быть проблематично для встраиваемых систем.
  • Отсутствие аппаратного ускорения: в отличие от gzip (использующего инструкции DEFLATE) или LZ4, Zstandard не имеет специализированных аппаратных реализаций, что ограничивает его применение в высокопроизводительных сетевых устройствах.
  • Сложность настройки: выбор оптимального уровня сжатия и размера словаря требует тестирования на конкретных данных, что усложняет автоматизацию.

Интересные факты

  • Название «Zstandard» происходит от комбинации буквы Z (символ сжатия в Unix-традиции) и слова «standard» (стандарт), что подчёркивает стремление к универсальности.
  • Алгоритм используется в формате сжатия файлов .zst, который является альтернативой .gz и .bz2.
  • В 2020 году Zstandard был включён в стандарт HTTP/3 (RFC 9000) как один из рекомендуемых методов сжатия.

Источники

  • Collet, Y. (2015). Zstandard: Real-time compression algorithm. GitHub Repository.
  • RFC 8478: Zstandard Compression Algorithm and Application. Internet Engineering Task Force (IETF), 2018.
  • Silesia Corpus: Benchmarking Data Compression Algorithms. 2023.
  • Документация библиотеки libzstd (версия 1.5.5). Meta (организация признана экстремистской, деятельность запрещена в РФ) Platforms, Inc., 2024.

BFOmetr — база данных и аналитика по компаниям России.

На главную BFOmetr →