Zstandard, или zstd
в сокращённом виде, — это быстрый алгоритм беспотери компрессии, ориентированный на реальные ситуации сжатия в режиме реального времени с соотношением сжатия уровня zlib и выше. Он использует очень быстрый этап энтропийного кодирования, предоставленный библиотеками Huff0 и FSE.
Формат Zstandard является стабильным и подробно описан в RFC8878. Уже доступны несколько независимых реализаций. Этот репозиторий представляет собой эталонную реализацию, представленную как открытая библиотека на языке C, лицензированная под двойной лицензией BSD или GPLv2, а также командную строку для создания и декодирования файлов с расширениями .zst
, .gz
, .xz
и .lz4
. В случае, если ваш проект требует другого языка программирования, список известных портов и привязок можно найти на главной странице Zstandard.
Статус ветки разработки:
Для справки были протестированы и сравнены несколько быстрых алгоритмов сжатия на рабочей станции с процессором Core i7-9700K @ 4.9 ГГц, работающей под управлением Ubuntu 24.04 (Linux 6.8.0-53-generic
) с использованием lzbench, открыто-источника внутреннего бенчмарка от @inikep, скомпилированного с помощью gcc 14.2.0, на [корпусе Silesia для сжатия].
Название компрессора | Соотношение | Скорость сжатия | Скорость восстановления |
---|---|---|---|
zstd 1.5.7 -1 | 2.896 | 510 МБ/с | 1550 МБ/с |
zlib 1.3.1 -1 | 2.743 | 105 МБ/с | 390 МБ/с |
brotli 1.1.0 -0 | 2.702 | 400 МБ/с | 425 МБ/с |
zstd 1.5.7 --fast=1 | 2.439 | 545 МБ/с | 1850 МБ/с |
zstd 1.5.7 --fast=3 | 2.241 | 635 МБ/с | 1980 МБ/с |
quicklz 1.5.0 -1 | 2.238 | 520 МБ/с | 750 МБ/с |
lzo1x 2.10 -1 | 2.106 | 650 МБ/с | 780 МБ/с |
lz4 1.10.0 | 2.101 | 675 МБ/с | 3850 МБ/с |
snappy 1.2.1 | 2.089 | 520 МБ/с | 1500 МБ/с |
lzf 3.6 -1 | 2.077 | 410 МБ/с | 820 МБ/с |
Отрицательные уровни сжатия, указанные с помощью --fast=#
, предлагают более высокую скорость сжатия и восстановления за счёт снижения соотношения сжатия.
Zstandard также может обеспечивать более высокое соотношение сжатия за счёт снижения скорости сжатия. Баланс между скоростью и соотношением сжатия настраивается малыми шагами. Скорость восстановления остаётся примерно одинаковой при всех настройках, что свойственно большинству алгоритмов сжатия типа LZ, таких как zlib или lzma.
Следующие тесты были выполнены на сервере с операционной системой Linux Debian (Linux версия 4.14.0-3-amd64
) с процессором Core i7-6700K @ 4.0 ГГц, используя lzbench, открыто-источниковый внутренний бенчмарк от @inikep, скомпилированный с помощью gcc 7.3.0, на [корпусе Silesia для сжатия].
Скорость сжатия против соотношения сжатия | Скорость восстановления |
---|---|
![]() |
![]() |
Несколько других алгоритмов могут обеспечивать более высокое соотношение сжатия при более медленной скорости, что выходит за рамки графика. Для получения полной картины, включая медленные режимы, перейдите по этой ссылке.
Предыдущие диаграммы предоставляют результаты применимые к типичным сценариям файлов и потоков (несколько МБ). Малые данные имеют свои особенности.
Чем меньше объём данных для сжатия, тем труднее его сжать. Это проблема общая для всех алгоритмов сжатия, причина заключается в том, что алгоритмы сжатия учатся на прошлом контенте, чтобы лучше сжимать будущий контент. Но в начале нового набора данных нет "прошлого", на котором можно было бы основаться.
Чтобы решить эту ситуацию, Zstandard предлагает режим обучения, который можно использовать для настройки алгоритма для выбранного типа данных. Обучение Zstandard достигается путём предоставления ему нескольких образцов (один файл на каждый образец). Результат этого обучения хранится в файле, называемом "словарь", который должен быть загружен перед сжатием и восстановлением. Используя этот словарь, соотношение сжатия, достижимое для малых данных, значительно улучшается.
Пример ниже использует набор образцов github-users
sample set, созданный из public GitHub API. Он состоит из около 10К записей весом около 1КБ каждая.
Соотношение сжатия | Скорость сжатия | Скорость восстановления |
---|---|---|
![]() |
![]() |
![]() |
Эти улучшения сжатия достигаются одновременно с повышением скорости сжатия и восстановления.
Обучение работает, если есть некоторая корреляция среди семейства малых данных. Чем больше специфично словарь для конкретного типа данных, тем эффективнее он будет (нет "универсального словаря"). Поэтому использование одного словаря на каждый тип данных обеспечивает наибольшие преимущества. Приобретенные преимущества особенно эффективны в первых нескольких КБ. Затем алгоритм сжатия будет постепенно использовать ранее декодированный контент для лучшего сжатия остальной части файла.
Создайте словарь
zstd --train ПолныйПутьКОбразцам/*.json -o имя_словаря
Сожмите с использованием словаря
zstd -D имя_словаря файл
Восстановите с использованием словаря
zstd -D имя_словаря --decompress файл.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
для CLI zstd
.
Проект-генератор cmake находится в build/cmake
. Он может создать Makefiles или другие скрипты сборки для создания бинарника 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 и сообществом. Если версия устарела, пожалуйста, создайте issue или pull request на репозиторий vcpkg.
Вы можете установить предварительно собранные бинарники для zstd или собрать его из исходников с помощью Conan. Используйте следующую команду:
conan install --requires="zstd/[*]" --build=missing
Рецепт zstd в Conan поддерживается командой Conan и сообществом. Если версия устарела, пожалуйста, создайте issue или pull request на репозиторий ConanCenterIndex.
Перейдя в каталог build
, вы найдёте дополнительные возможности:
build/VS_scripts
, которые позволят собрать zstd
CLI и libzstd
библиотеку без необходимости открывать решение Visual Studio.Вы можете собрать бинарник zstd через buck, выполнив: buck build programs:zstd
из корня репозитория. Выходной бинарник будет находиться в buck-out/gen/programs/
.
Вы легко можете интегрировать zstd в свой проект Bazel, используя модуль, хостируемый на Bazel Central Repository.
Вы можете выполнить быстрое локальное тестирование, запустив make check
. Если вы не можете использовать make
, выполните скрипт playTest.sh
из каталога src/tests
. Для тестового скрипта необходимы две переменные окружения $ZSTD_BIN
и $DATAGEN_BIN
для расположения бинарников zstd
и datagen
. Для информации о CI тестировании, обратитесь к файлу TESTING.md
.
Zstandard активно используется внутри Facebook и многих других крупных облачных инфраструктур. Он постоянно используется для сжатия больших объёмов данных в различных форматах и случаях применения. Zstandard считается безопасным для использования в производственной среде.
Zstandard распространяется под двойной лицензией BSD или GPLv2.
Ветка dev
— это та, где все вклады сливаются перед выпуском release
. Если вы планируете предложить исправление, пожалуйста, сделайте коммит в ветку dev
или её собственную ветку функциональности. Прямые коммиты в release
не допускаются. Для получения дополнительной информации прочитайте CONTRIBUTING.
Вы можете оставить комментарий после Вход в систему
Неприемлемый контент может быть отображен здесь и не будет показан на странице. Вы можете проверить и изменить его с помощью соответствующей функции редактирования.
Если вы подтверждаете, что содержание не содержит непристойной лексики/перенаправления на рекламу/насилия/вульгарной порнографии/нарушений/пиратства/ложного/незначительного или незаконного контента, связанного с национальными законами и предписаниями, вы можете нажать «Отправить» для подачи апелляции, и мы обработаем ее как можно скорее.
Комментарии ( 0 )