Zstandard — это алгоритм сжатия данных без потерь, разработанный Яном Коллетом из Facebook . Zstd — это соответствующая эталонная реализация на языке C , выпущенная как программное обеспечение с открытым исходным кодом 31 августа 2016 года. [3] [4]
Zstandard был разработан, чтобы обеспечить степень сжатия , сравнимую с алгоритмом DEFLATE (разработанным в 1991 году и использовавшимся в оригинальных программах ZIP и gzip ), но более быструю, особенно для распаковки. Он настраивается с уровнями сжатия от отрицательного 7 (самый быстрый) [5] до 22 (самая медленная скорость сжатия, но лучшая степень сжатия).
Начиная с версии 1.3.2 (октябрь 2017 г.), zstd опционально реализует очень дальний поиск и дедупликацию ( --long
окно 128 МБ), аналогично rzip или lrzip . [6]
Скорость сжатия может различаться в 20 и более раз между самым быстрым и самым медленным уровнями, в то время как декомпрессия происходит равномерно быстро, различаясь менее чем на 20% между самым быстрым и самым медленным уровнями. [7] Командная строка Zstandard имеет «адаптивный» ( --adapt
) режим, который изменяет уровень сжатия в зависимости от условий ввода-вывода, в основном от того, насколько быстро она может записывать вывод.
Zstd при максимальном уровне сжатия обеспечивает степень сжатия, близкую к lzma , lzham и ppmx , и работает лучше [ неопределенно ], чем lza или bzip2 . [ неправильный синтез? ] [8] [9] Zstandard достигает текущей границы Парето , поскольку он распаковывает быстрее, чем любой другой доступный в настоящее время алгоритм с аналогичной или лучшей степенью сжатия. [10] [11]
Словари могут оказывать большое влияние на степень сжатия небольших файлов, поэтому Zstandard может использовать предоставленный пользователем словарь сжатия. Он также предлагает режим обучения, способный генерировать словарь из набора образцов. [12] [13] В частности, один словарь может быть загружен для обработки больших наборов файлов с избыточностью между файлами, но не обязательно внутри каждого файла, например, файлы журналов .
Zstandard объединяет этап сопоставления со словарем ( LZ77 ) с большим окном поиска и этапом быстрого энтропийного кодирования . Он использует как кодирование Хаффмана (используемое для записей в разделе «Литералы») [14] , так и конечную энтропию (FSE) — быструю табличную версию ANS, tANS , используемую для записей в разделе «Последовательности». Из-за того, как FSE переносит состояние между символами, декомпрессия включает обработку символов в разделе «Последовательности» каждого блока в обратном порядке (от последнего к первому).
Ядро Linux включает Zstandard с ноября 2017 года (версия 4.14) в качестве метода сжатия для файловых систем btrfs и squashfs . [16] [17] [18]
В 2017 году Аллан Джуд интегрировал Zstandard в ядро FreeBSD [19] , и впоследствии он был интегрирован как опция компрессора для дампов ядра (как пользовательских программ, так и паник ядра). Он также использовался для создания метода сжатия OpenZFS для проверки концепции [7] , который был интегрирован в 2020 году. [20]
Базы данных AWS Redshift и RocksDB поддерживают сжатие полей с использованием Zstandard. [21]
В марте 2018 года Canonical протестировала [22] использование zstd в качестве метода сжатия deb-пакетов по умолчанию для дистрибутива Ubuntu Linux. По сравнению с xz -сжатием deb-пакетов, zstd на уровне 19 распаковывает значительно быстрее, но за счет увеличения размера файлов пакетов на 6%. Поддержка была добавлена в Debian (и впоследствии в Ubuntu) в апреле 2018 года (в версии 1.6~rc1). [23] [22] [24]
В 2018 году алгоритм был опубликован как RFC 8478, который также определяет связанный тип носителя «application/zstd», расширение имени файла «zst» и кодировку HTTP-контента «zstd». [25]
Arch Linux добавил поддержку zstd в качестве метода сжатия пакетов в октябре 2019 года с выпуском менеджера пакетов pacman 5.2 [26] и в январе 2020 года перешел с xz на zstd для пакетов в официальном репозитории. Arch использует zstd -c -T0 --ultra -20 -
, размер всех сжатых пакетов вместе увеличился на 0,8% (по сравнению с xz), скорость распаковки в 14 раз выше, память распаковки увеличилась на 50 МБ при использовании нескольких потоков, память сжатия увеличивается, но масштабируется с количеством используемых потоков. [27] [28] [29] Arch Linux позже также перешел на zstd в качестве алгоритма сжатия по умолчанию для начального генератора ramdisk mkinitcpio. [30]
Fedora добавила поддержку ZStandard в RPM в мае 2018 года (выпуск Fedora 28) и использовала ее для упаковки выпуска в октябре 2019 года (Fedora 31). [31] В Fedora 33 файловая система по умолчанию сжимается с помощью zstd. [32] [33]
Полная реализация алгоритма с возможностью выбора уровня сжатия используется в форматах файлов .NSZ/.XCZ [34], разработанных сообществом homebrew для гибридной игровой консоли Nintendo Switch . [35] Аналогично, это также один из многих поддерживаемых алгоритмов сжатия в формате файлов образов дисков .RVZ Wii и GameCube .
15 июня 2020 года Zstandard был реализован в версии 6.3.8 формата zip-файла с кодеком номером 93, что отменило предыдущий кодек номер 20, реализованный в версии 6.3.7, выпущенной 1 июня. [36] [37]
В марте 2024 года Google Chrome версии 123 (и браузеры на базе Chromium , такие как Brave или Microsoft Edge ) добавили поддержку zstd в заголовке HTTP Content-Encoding
. [38] В мае 2024 года Firefox версии 126.0 добавил поддержку zstd в заголовке HTTP Content-Encoding
. [39]
Эталонная реализация лицензирована по лицензии BSD , опубликованной на GitHub . [40] Начиная с версии 1.0, она имела дополнительные права на патент. [41]
Начиная с версии 1.3.1 [42] этот патент был отменен, а лицензия была изменена на двойную лицензию BSD + GPLv2. [43]
Разработчики Canonical рассматривают исключение заморозки функций, чтобы получить поддержку недавно разработанного Zstd Apt/Dpkg в Ubuntu 18.04 LTS. При этом они упоминают, что будут рассматривать включение сжатия Zstd для пакетов по умолчанию в Ubuntu 18.10.