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 и sqashfs . [16] [17] [18]
В 2017 году Аллан Джуд интегрировал Zstandard в ядро FreeBSD [19] , и впоследствии он был интегрирован в качестве опции компрессора для дампов ядра (как пользовательских программ, так и ошибок ядра). Он также использовался для создания экспериментального метода сжатия OpenZFS [7] , который был интегрирован в 2020 году. [20]
Базы данных AWS Redshift и RocksDB поддерживают сжатие полей с помощью Zstandard. [21]
В марте 2018 года компания Canonical протестировала [22] использование zstd в качестве метода сжатия deb-пакетов по умолчанию для дистрибутива Ubuntu Linux. По сравнению со сжатием deb-пакетов xz , 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 в качестве алгоритма сжатия по умолчанию для исходного генератора виртуального диска mkinitcpio. [30]
Fedora добавила поддержку ZStandard в RPM в мае 2018 года (выпуск Fedora 28) и использовала ее для упаковки выпуска в октябре 2019 года (Fedora 31). [31] В Fedora 33 файловая система по умолчанию сжимается с помощью zstd. [32] [33]
Полная реализация алгоритма с возможностью выбора уровня сжатия используется в форматах файлов .NSZ/.XCZ [34] , разработанных доморощенным сообществом для гибридной игровой консоли Nintendo Switch . [35] Аналогично, это также один из многих поддерживаемых алгоритмов сжатия в формате файла образа диска .RVZ Wii и GameCube .
15 июня 2020 года Zstandard был реализован в версии 6.3.8 формата zip-файла с номером кодека 93, что делает устаревшим предыдущий номер кодека 20, поскольку он был реализован в версии 6.3.7, выпущенной 1 июня. [36] [37]
Эталонная реализация лицензируется по лицензии BSD , опубликованной на GitHub . [38] Начиная с версии 1.0, у него было дополнительное предоставление патентных прав. [39]
Начиная с версии 1.3.1 [40] выдача патента была прекращена, а лицензия была изменена на двойную лицензию BSD + GPLv2. [41]
Разработчики из Canonical рассматривают возможность исключения из заморозки функций, чтобы получить недавно разработанную поддержку Zstd Apt/Dpkg в Ubuntu 18.04 LTS.
При этом они упоминают, что будут рассматривать возможность включения сжатия Zstd для пакетов по умолчанию в Ubuntu 18.10.