Zstandard , или сокращенная версия zstd
, — это быстрый алгоритм сжатия без потерь, предназначенный для сценариев сжатия в реальном времени на уровне zlib и лучших коэффициентов сжатия. Это поддерживается очень быстрой стадией энтропии, обеспечиваемой Huff0 и библиотекой FSE.
Формат Zstandard стабилен и документирован в RFC8878. Уже доступно несколько независимых реализаций. Этот репозиторий представляет собой эталонную реализацию, предоставленную в виде библиотеки C с открытым исходным кодом, лицензируемой двойной BSD или GPLv2, а также утилиты командной строки, создающей и декодирующей файлы .zst
, .gz
, .xz
и .lz4
. Если вашему проекту требуется другой язык программирования, список известных портов и привязок представлен на домашней странице Zstandard.
Статус ветки разработки:
Для справки: несколько алгоритмов быстрого сжатия были протестированы и сравнены на настольном компьютере с процессором Core i7-9700K с тактовой частотой 4,9 ГГц и под управлением Ubuntu 20.04 ( Linux ubu20 5.15.0-101-generic
) с использованием lzbench — программы в памяти с открытым исходным кодом. тест @inikep, скомпилированный с помощью gcc 9.4.0, на корпусе сжатия Silesia.
Название компрессора | Соотношение | Сжатие | Распаковать. |
---|---|---|---|
зстд 1.5.6 -1 | 2,887 | 510 МБ/с | 1580 МБ/с |
злиб 1.2.11 -1 | 2,743 | 95 МБ/с | 400 МБ/с |
бротли 1.0.9 -0 | 2.702 | 395 МБ/с | 430 МБ/с |
zstd 1.5.6 --fast=1 | 2.437 | 545 МБ/с | 1890 МБ/с |
zstd 1.5.6 --fast=3 | 2.239 | 650 МБ/с | 2000 МБ/с |
Quicklz 1.5.0 -1 | 2.238 | 525 МБ/с | 750 МБ/с |
lzo1x 2,10 -1 | 2.106 | 650 МБ/с | 825 МБ/с |
лз4 1.9.4 | 2.101 | 700 МБ/с | 4000 МБ/с |
лзф 3,6 -1 | 2,077 | 420 МБ/с | 830 МБ/с |
шустрый 1.1.9 | 2,073 | 530 МБ/с | 1660 МБ/с |
Отрицательные уровни сжатия, указанные с помощью --fast=#
, обеспечивают более высокую скорость сжатия и распаковки за счет степени сжатия.
Zstd также может предложить более высокую степень сжатия за счет скорости сжатия. Компромисс между скоростью и сжатием настраивается небольшими шагами. Скорость распаковки сохраняется и остается примерно одинаковой при всех настройках — свойство, общее для большинства алгоритмов сжатия LZ, таких как zlib или lzma.
Следующие тесты были проведены на сервере под управлением Linux Debian ( Linux version 4.14.0-3-amd64
) с процессором Core i7-6700K @ 4,0 ГГц с использованием lzbench, теста производительности в памяти с открытым исходным кодом от @inikep, скомпилированного с помощью gcc. 7.3.0, на корпусе сжатия Силезии.
Скорость сжатия в зависимости от коэффициента | Скорость декомпрессии |
---|---|
Некоторые другие алгоритмы могут обеспечивать более высокие степени сжатия на более медленных скоростях, выходя за пределы графика. Для получения более крупного изображения, включая медленные режимы, нажмите на эту ссылку.
Предыдущие диаграммы предоставляют результаты, применимые к типичным сценариям файлов и потоков (несколько МБ). Маленькие данные имеют разные точки зрения.
Чем меньше объем данных для сжатия, тем сложнее его сжать. Эта проблема является общей для всех алгоритмов сжатия, и причина в том, что алгоритмы сжатия учатся на прошлых данных тому, как сжимать будущие данные. Но в начале нового набора данных нет никакого «прошлого», на которое можно было бы опереться.
Для решения этой ситуации Zstd предлагает режим обучения , с помощью которого можно настроить алгоритм под выбранный тип данных. Обучение Zstandard достигается путем предоставления ему нескольких образцов (по одному файлу на образец). Результат такого обучения сохраняется в файле под названием «словарь», который необходимо загрузить перед сжатием и распаковкой. Используя этот словарь, степень сжатия небольших данных значительно улучшается.
В следующем примере используется набор образцов github-users
, созданный на основе общедоступного API github. Он состоит примерно из 10 тысяч записей весом около 1 КБ каждая.
Степень сжатия | Скорость сжатия | Скорость декомпрессии |
---|---|---|
Эти преимущества сжатия достигаются при одновременном обеспечении более высоких скоростей сжатия и распаковки.
Обучение работает, если есть некоторая корреляция в семействе небольших выборок данных. Чем более специфичен словарь для данных, тем он эффективнее ( универсального словаря не существует). Следовательно, развертывание одного словаря для каждого типа данных обеспечит наибольшие преимущества. Прирост словаря наиболее эффективен в первых нескольких КБ. Затем алгоритм сжатия будет постепенно использовать ранее декодированное содержимое, чтобы лучше сжать остальную часть файла.
Создать словарь
zstd --train FullPathToTrainingSet/* -o dictionaryName
Сжать со словарем
zstd -D dictionaryName FILE
Распаковать со словарем
zstd -D dictionaryName --decompress FILE.zst
make
— официально поддерживаемая система сборки этого проекта. Все остальные системы сборки «совместимы» и поддерживаются сторонними производителями. Они могут иметь небольшие различия в дополнительных параметрах. Если ваша система это позволяет, лучше использовать make
для сборки zstd
и libzstd
.
Если ваша система совместима со стандартным make
(или gmake
), вызов make
в корневом каталоге создаст zstd
cli в корневом каталоге. Он также создаст libzstd
в lib/
.
Другие доступные варианты включают в себя:
make install
: создать и установить zstd cli, библиотеку и справочные страницы.make check
: создайте и запустите zstd
, проверьте его поведение на локальной платформе. Makefile
соответствует стандартным соглашениям GNU Makefile, допуская поэтапную установку, стандартные флаги, переменные каталога и командные переменные.
Для расширенных вариантов использования специализированные флаги компиляции, управляющие генерацией двоичных файлов, описаны в lib/README.md
для библиотеки libzstd
и в programs/README.md
для интерфейса командной строки zstd
.
Генератор проекта cmake
предоставляется в build/cmake
. Он может генерировать файлы Makefile или другие сценарии сборки для создания двоичных файлов zstd
, а также динамических и статических библиотек libzstd
.
По умолчанию для CMAKE_BUILD_TYPE
установлено значение Release
.
zstd
можно собрать и установить с поддержкой как Apple Silicon (M1/M2), так и Intel, используя поддержку Universal2 CMake. Чтобы выполнить сборку и установку Fat/Universal2, используйте следующие команды:
cmake -B build-cmake-debug -S build/cmake -G Ninja -DCMAKE_OSX_ARCHITECTURES= " x86_64;x86_64h;arm64 "
cd build-cmake-debug
ninja
sudo ninja install
Проект Meson предоставляется в build/meson
. Следуйте инструкциям по сборке в этом каталоге.
Вы также можете просмотреть файл .travis.yml
для примера того, как Meson используется для создания этого проекта.
Обратите внимание, что тип сборки по умолчанию — Release .
Вы можете собрать и установить менеджер зависимостей zstd vcpkg:
git clone https://github.com/Microsoft/vcpkg.git
cd vcpkg
./bootstrap-vcpkg.sh
./vcpkg integrate install
./vcpkg install zstd
Порт zstd в vcpkg постоянно обновляется членами команды Microsoft и участниками сообщества. Если версия устарела, создайте проблему или запрос на извлечение в репозитории vcpkg.
Вы можете установить готовые двоичные файлы для zstd или собрать его из исходного кода с помощью Conan. Используйте следующую команду:
conan install --requires= " zstd/[*] " --build=missing
Рецепт zstd Conan постоянно обновляется сопровождающими Conan и участниками сообщества. Если версия устарела, создайте проблему или запрос на извлечение в репозитории ConanCenterIndex.
Зайдя в каталог build
, вы обнаружите дополнительные возможности:
build/VS_scripts
, которые позволяют собрать библиотеку zstd
cli и libzstd
без необходимости открывать решение Visual Studio. Вы можете собрать двоичный файл zstd с помощью buck, выполнив: buck build programs:zstd
из корня репозитория. Выходной двоичный файл будет находиться в buck-out/gen/programs/
.
Вы легко можете интегрировать zstd в свой проект Bazel, используя модуль, размещенный в центральном репозитории Bazel.
Вы можете запустить быстрые локальные дымовые тесты, запустив make check
. Если вы не можете использовать make
, запустите сценарий playTest.sh
из каталога src/tests
. Две переменные env $ZSTD_BIN
и $DATAGEN_BIN
необходимы тестовому сценарию для поиска двоичных файлов zstd
и datagen
. Информацию о CI-тестировании можно найти на сайте TESTING.md
.
Zstandard в настоящее время развернут в Facebook и многих других крупных облачных инфраструктурах. Он запускается постоянно для сжатия больших объемов данных в различных форматах и вариантах использования. Zstandard считается безопасным для производственных сред.
Zstandard имеет двойную лицензию BSD ИЛИ GPLv2.
Ветка dev
— это та ветка, в которой все внесенные изменения объединяются перед release
. Если вы планируете предложить патч, пожалуйста, зафиксируйте его в ветке dev
или в отдельной ветке функций. Прямая фиксация release
не допускается. Для получения дополнительной информации, пожалуйста, прочитайте ВКЛАД.