Zstd чем распаковать windows

Обновлено: 04.07.2024

Каким архиватором вы пользуетесь, обсуждается только в этой теме;
вопросы настройки обсуждаются только в темах архиваторов.

Добавляйте новые!
Также на страницах этой темы много тестов, проведённых участниками форума. Не игнорируйте их, они столь же полезны, как и те тесты, что вывешены на сайтах о сжатии!

Ключи архивации в студию, пожалуйста.
kanzi по-умолчанию - однопоточный.

>> Сценарий 3: сжатие 4.5Х (201 МБ за 21 мин. с использованием 0,1 Гб ОЗУ).
cmd /c "ProcProfile64.exe -t=b nz64.exe a -cc -m100m 100.nz Test.srep 2>03.txt"
804,839,001 -> 211,807,912: 26.31%. Cpu 619 kb/s (1267.936 sec), real 624 kb/s (1258.157 sec) = 100%. ram 113944 KB, vmem 134532 KB

>> Сценарий 4: сжатие 4.7Х (192 МБ за 23 мин. с использованием 3,8 Гб ОЗУ).
cmd /c "ProcProfile64.exe -t=b nz64.exe a -cc -m4300m 4300.nz Test.srep 2>04.txt"
804,839,001 -> 202,101,971: 25.11%. Cpu 562 kb/s (1397.014 sec), real 566 kb/s (1387.976 sec) = 100%. ram 3938104 KB, vmem 3998500 KB

Hunter23071985

И, да, для бенчмарков утилит комм. строки рекомендую использовать hyperfine.

В 2016 – 2019 годах прошел «бум» и появилось много новых версий и новых рекордов по сжатию.


Зеленым цветом выделены абсолютно лучшие результаты сжатия, и версии архиваторов paq8pxd_v24x64, paq8pxd_v44, paq8pxd_v46_SPEED, paq8pxd_v53 – которые имеют хорошее отношение размер/ время (на этих данных).
Желтым цветом выделены плохие результаты (большой размер архива, или время).
Красным цветом - критические ошибки.
Для архиваторов серии fp8 и paq8px критической ошибкой является зависание при попытке сжать файл PIF.mht.
Для архиваторов серии paq8pxd критической ошибкой является невозможность распаковать свой сжатый архив с файлом 7z.dll.

Цель тестирования
В области сжатия данных все время появляются новые алгоритмы и программы. Но не все они одинаково интересны. В данной заметке будет приведен обзорный тест перспективного (на мой взгляд) метода сжатия Zstandart, посредством плагина Modern7z к программе 7-zip. Тест, повторюсь, обзорный, он не претендует на то, чтобы дать ответы на все вопросы. Его цель – привлечь внимание к методу. И если заинтересует – пробуйте и экспериментируйте.

Данные
2 020 999 669 байт, папок 129, файлов 684. Здесь я сохранял разные «нужные» файлы самых разных форматов: от хорошо сжимаемых doc и xls до уже сжатых pdf и jpg.
Данные копировались на RAMdisk, где и проводились тесты. Скорость работы RAMdisk достаточно высока и не являлась сильным ограничением.

Программы:
7-zip 19.00 (х64);
Плагин Modern7z 1.8.5.
Modern7z - это плагин для популярного архиватора 7-Zip, добавляющий в 7-Zip поддержку следующих методов сжатия:
• Zstandard v1.4.4
• Brotli v1.0.4
• LZ4 v1.9.2
• LZ5 v1.5
• Lizard v1.0
• Fast LZMA2 v0.9.2
Для установки плагина, в папке, в которой установлена программа 7-Zip, необходимо создать папку Codecs. В созданную папку необходимо скопировать либо содержимое папки 32, либо содержимое папки 64, в зависимости от разрядности программы 7-Zip. После этого 7-Zip при запуске будет автоматически находить плагин и использовать его для работы с дополнительными методами сжатия.
Интерфейс 7Zip не позволяет напрямую выбрать дополнительный алгоритм в качестве метода сжатия, который будет использоваться при упаковке в формат 7Z. Поэтому его нужно указывать в поле Параметры в виде строки вида "0=ZSTD", где ZSTD - это внутреннее название метода сжатия:


Ключ «x=17» означает установку уровня сжатия 17 из 1 – 22 возможных.

Описание теста
Часть 1
Сжатие данных проводилось методами по умолчанию, сначала LZMA2, затем ZSTD.

Таблица 1 с результатами теста


Использование памяти указано в процентах от всей имеющейся (16 ГиБ). Ключ в скобках (d=…) означает размер окна, который я в явном виде не задавал, он определялся библиотекой ZSTD.


По оси абсцисс – скорость сжатия, слева – медленнее, справа – быстрее.
По оси ординат – коэффициент сжатия, выше – больше, ниже – меньше.
При сравнении LZMA2 и ZSTD видно: диапазон скоростей работы у ZSTD существенно больше. Если у LZMA2 он примерно 4, то у ZSTD – 70.
На быстрых режимах работы ZSTD вне конкуренции.
В то же время при медленных режимах работы ZSTD «по умолчанию» есть зона, где ZSTD уступил LZMA2 по соотношению скорость/ коэфф. сжатия.
В самых медленных режимах работы ZSTD смог сжать сильнее LZMA2, но затратив при этом больше времени и памяти.

Часть 2
Как и у метода LZMA2, так и у ZSTD есть ряд ключей, которые могут управлять сжатием:
x – уровень сжатия от 1 до 22;
a – алгоритм от 1 до 9, по умолчанию 5 (не всегда);
c - размер блока (может быть больше 2g); Он был актуален для ранних версий библиотеки ZSTD, в которых не было многопоточности. В актуальной версии ZSTD есть своя реализация многопоточности, и при использовании метода ZSTD при упаковке в контейнер 7z этот ключ потерял свой смысл, и более того он стал вреден.
d - размер окна (до 2g включительно для х64 и 1g для х32);
mt - число потоков.
Обращаю внимание на важный факт:
Библиотека ZSTD, в зависимости от объема памяти и сжимаемых данных сама достаточно активно манипулирует параметрами сжатия.
Когда я только начал эксперименты с ZSTD, то у меня на компьютере был открыт браузер с несколькими вкладками, на которых я знакомился с плагином Modern7z. И сжатие по уровню x=22 дало у меня результаты: 433 с, 938 601 592 байта. Эксперименты с размером окна показали, что это соответствовало d=16m.
В последующем я проводил эксперименты после перезагрузки компьютера, никаких посторонних программ открыто не было. И сжатие по уровню x=22 дало другие результаты: 373 с, 923 472 839 байт, что заметно лучше. Эти данные и приведены в таблице 1. Этот результат соответствует уже другому размеру окна d=128m.
Также, ZSTD самопроизвольно при больших требованиях к памяти уменьшает количество потоков.
Поскольку далеко не всегда понятно, почему и какие параметры ZSTD использует, при экспериментах, желательно открыть Монитор ресурсов (или другим способом) и контролировать память и загрузку процессора (чтобы видеть количество потоков). Это может немного прояснить ситуацию.
Поэкспериментировав с различными ключами, я пришел к выводу, что с практической точки зрения самый полезный - размер окна, остальные можно не задавать.
Следующие эксперименты сделаны для максимально возможного размера окна d=2g.


Желтым цветом в таблице выделены режимы, когда библиотека ZSTD уменьшила количество потоков, видимо, из за нехватки памяти.


В целом ZSTD при большом размере окна показал с точки зрения скорость/ коэфф. сжатия результаты лучше, чем по умолчанию. Конечно, при больших затратах памяти.
Поскольку я нигде не нашел данных по требуемому объему памяти, то приведу таблицу на основе своих экспериментов:


В таблице 1 ГиБ = 2^30 Байт (1 ГБ = 10^9 Байт).
Я перепроверил на компьютере с ОЗУ 8 ГБ, при уровнях сжатия 21 и 22 размер окна 128m также использует 4 потока, а начиная с 256м – только 2 потока.
Вопрос, который остался неясным, используется ли при работе файл подкачки? Осталось подозрение, что иногда используется. И вероятнее всего на разных компьютерах ситуация будет разной.

По результатам эксперимента, мне очень понравился уровень сжатия 11. Если захотите поэкспериментировать, то сожмите большой объем данных сначала методом LZMA2 с уровнем сжатия «нормальный», а затем ZSTD с параметрами x=11 d=2g. По коэфф. сжатия должно быть примерно одинаково, а по времени – ZSTD раз в 5 быстрее.
Скажу еще следующее – за время экспериментов на 3 разных компьютерах, никаких сбоев плагина Modern7z я не наблюдал. Только в случае задания c=64g (напомню, ключ не рекомендуется к использованию) в процессе архивирования появилась надпись о нехватке памяти.

Разумеется, интересно сравнить реализацию метода ZSTD в плагине Modern7z и в программе 7z 19.00 ZS 1.4.4
Эксперименты я делал, когда у последней программы был первый релиз.

Часть 2 ZSTD в программе 7z 19.00 ZS 1.4.4
- нельзя задать размер окна;
- можно задавать размер блока. По умолчанию стоит небольшое значение 16m. Лучше установить «непрерывный».
Коэффициент сжатия получить, как в плагине Modern7z с большим размером окна, не удается.

Совместимость ZSTD в программе 7z 19.00 ZS 1.4.4 и плагине Modern7z
Несколько раз попробовал открыть и протестировать архивы ZSTD перекрестно.
7-zip 19.00 (x64) + Modern7z всегда безошибочно тестировал архивы от 7z 19.00 ZS 1.4.4.
А вот 7z 19.00 ZS 1.4.4 обычно выдавал ошибку тестирования архивов от 7-zip 19.00 (x64) + Modern7z.

В силу описанных особенностей и проблем, реализация ZSTD намного лучше сделана в плагине Modern7z.

Zstandard - новый, быстрый и эффективный алгоритм сжатия данных

Обрабатываемые объемы данных с каждым годом только растут, выдвигая новые и, зачастую, противоречивые требования к информационным системам. В частности? это касается архивации данных, с одной стороны для эффективного использования устройств хранения требуется высокий коэффициент сжатия, с другой стороны важное значение имеет скорость работы. Ранее существовавшие алгоритмы предлагали что-то одно: либо быструю скорость работы, либо отличное сжатие. Zstandard - новый алгоритм, разработанный с учетом современных требований и сегодня мы посмотрим насколько он эффективен.

Некоторое время назад мы проводили тестирование консольных архиваторов, которое показало что наиболее оптимальным является использование архиваторов на основе алгоритма Deflate, к которым относятся ZIP и gzip. Они обеспечивают высокую скорость архивации при неплохой степени сжатия. Их противоположностью являются использующие алгоритм LZMA продукты, самый известный из которых 7Zip, для них характерна отличная степень сжатия, но за это приходится платить низкой скоростью работы.

Постоянно растущие объемы данных не позволяют рассматривать LZMA, как эффективный алгоритм, делая его нишевым решением, когда на первый план выходит именно степень сжатия, а время создания и распаковки архивов не имеют значения. Поэтому при разработке Zstandard была поставлена цель добиться степени сжатия сравнимой с Deflate при более высокой скорости работы. Разработкой занимается Ян Колле (фр. Yann Collet) при поддержке Facebook и ему удалось достигнуть действительно отличных результатов. При использовании стандартной степени сжатия Zstandard сжимает лучше и быстрее Deflate, а на высоких степенях может тягаться с LZMA, но распаковка таких архивов происходит практически также быстро, как и архивов с низкой степенью компрессии.

Эта особенность обусловила переход на Zstandard для сжатия пакетов ведущими дистрибутивами, такими как Ubuntu, Fedora, Arc. Он применяется для сжатия в файловых системах btrfs и OpenZFS, в СУБД MySQL, PostgreSQL, MongoDB, Tarantool. С полным списком применяющих Zstandard проектов можно ознакомиться здесь: facebook.github.io/zstd. Все это заставляет присмотреться к новому алгоритму достаточно внимательно, поэтому мы провели собственное исследование эффективности Zstandard с которым и хотим вас ознакомить.

Тестирование эффективности Zstandard

На этот раз мы не стали устраивать полноценного тестирования, а использовали одну из реальных задач - архивирование дампа базы PostgreSQL объемом около 11 ГБ, а в качестве конкурентов использовали gzip (Deflate) и 7Zip (LZMA). Тестирование производилось в среде Debian 10 с установками сжатия по умолчанию. Для измерения времени использовалась команда time, результат представляет среднее от пяти запусков.

Результат нас очень сильно удивил: zstd сжал 10,8 ГБ за рекордные 35 секунд, за ним следует gzip с результатом в 2 мин 15 секунд, а замыкает список 7zip, которому потребовалось более получаса.

zstd-test-001.jpg

А как обстоят дела со степенью сжатия? Тоже неплохо: 9% - это немного лучше чем у gzip c его 10,4% и немного хуже 7,9% 7Zip. Но в целом разрыв по степени сжатия не столь велик и отходит на второй план по сравнению с разницей во времени.

zstd-test-002.jpg

Как можем видеть, LZMA вообще нельзя рассматривать как эффективный алгоритм, полчаса работы - это очень много, учитывая то, что сжатие данных требовательная к процессорным ресурсам операция, тем более что аналогичного результата можно достичь всего за 30 секунд! Да и Deflate тоже пора уступать место новому алгоритму, разрыв на фоне LZMA не так заметен, но все-таки в 4 раза, да и сжимает Zstandard лучше. Но у ZIP и gzip есть большое преимущество - распространенность, данные архиваторы поддерживаются в своих ОС "из коробки", что в некоторых случаях может быть важно.

Еще один важный параметр - время распаковки, здесь разница между архиваторами уже не столь велика: 7Zip тратит на извлечение данных чуть больше минуты, gzip и zstd справляются за 30 секунд, разница между ними в погрешности измерений, но мы помним, что zstd сжимает лучше.

zstd-test-003.jpg

А теперь сделаем несложные вычисления и подумаем. Zstandard распаковал и записал на диск 10,8 ГБ за 32 секунды, скорость копирования при этом составила около 360 МБ/с, что составляет практически верхнюю планку для нашего массива RAID 10 на котором расположена данная виртуальная машина. Может ли производительность дисковой подсистемы оказаться узким местом для архиватора? Вполне, причем не только при распаковке, но и при сжатии, так как данные с диска нужно прочитать, а с учетом результатов zstd мы получаем примерно такую же скорость обмена данными, близкую к физическим ограничениям подсистемы. Поэтому мы подключили к виртуальной машине еще один диск, расположенный на производительном NVMe SSD ADATA XPG SX8200 Pro и повторили тесты на нем.

Если классические алгоритмы не получили никакой выгоды от смены носителя, то для Zstandard эффект был получен незамедлительно, время сжатия дампа уменьшилось с 35 до 22 секунд, а это около 37%, что очень и очень неплохо.

zstd-test-004.jpg

С распаковкой картина аналогичная: Deflate и LZMA снова никак не отреагировали на смену носителя, а zstd обновил результаты, распаковав архив за 19 секунд и уверенно обозначил лидерство.

zstd-test-005.jpg

Даже столь небольшое тестирование дает понять, что перед нами очень эффективный алгоритм сжатия нового поколения, а стоящая за его разработкой компания Facebook, как раз работающая с большими объемами данных, обещает хорошие перспективы для дальнейшего развития.

Как начать пользоваться Zstandard

Следующий вопрос, который возникнет у наших читателей, как получить и начать использовать Zstandard? Для пользователей Linux все очень просто, zstd входит в репозитории и установить его можно простой командой (для DEB-based дистрибутивов):

Для получения краткой справки наберите:

а для ознакомления со всеми возможностями программы воспользуйтесь полной справкой:

zstd-test-006.jpg

Сжать файл можно командой:

Modern7z - это плагин для популярного архиватора 7-Zip, добавляющий в 7-Zip поддержку современных методов сжатия:

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

Открытие ZSTD in 7-Zip

Также плагин позволяет распаковывать из zip архивов файлы, упакованные методом ZSTD.

Установка

Установочный дистрибутив Modern7z представляет собой простой Zip-архив, содержащий файл ReadMe.txt и две папки с именами 32 и 64. В этих папках находятся 32-битная и 64-битная версии плагина, соответственно. Внутри папок находятся непосредственно файлы плагина. Для установки плагина в папке, в которую установлена программа 7-Zip, необходимо создать папку Codecs. В созданную папку необходимо скопировать либо содержимое папки 32, либо содержимое папки 64, в зависимости от разрядности программы 7-Zip. После этого 7-Zip при запуске будет автоматически находить плагин и использовать его для работы с дополнительными методами сжатия.

Использование

Для упаковки файла конкретным алгоритмом нужно выбрать в 7Zip стандартную команду упаковки. После появления окна Add To Archive нужно выбрать необходимый алгоритм в поле Archive format:

Упаковка в формат ZSTD в 7-Zip

Все дополнительные методы имеют очень широкий диапазон уровня сжатия:

Метод сжатияДиапазон уровня сжатия
Zstandard1-22
Brotli0-11
LZ40-12
LZ50-15
Lizard10-19 используется для подметода FastLZ4
20-29 используется для подметода LIZv1
30-39 используется для подметода FastLZ4 + Huffman
40-49 используется для подметода LIZv1 + Huffman
Fast LZMA21-9

Интерфейс 7Zip позволяет выбрать лишь значения 0, 1, 3, 5, 7 и 9, поэтому точное необходимое значение нужно указать напрямую в поле Parameters, например, строка "x=20" будет обозначать, что необходимо использовать уровень сжатия 20.

Интерфейс 7Zip не позволяет выбрать количество потоков, которые будут использоваться для упаковки данных. Поэтому этот параметр также нужно указать в поле Parameters, например, строка "mt=4" будет обозначать, что при сжатии необходимо использовать 4 потока. Если параметр mt не будет указан, то будет использоваться количество потоков, равное количеству ядер процессора в системе.

Для полученных после сжатия файлов поддерживается Random Access Mode. Это позволяет производить навигацию по вложенному TAR контейнеру без предварительного полного извлечения всего TAR контейнера. Данный режим поддерживается только в том случае, если размер отдельного независимого блока не превышает 64 Mb (о формировании независимых блоков см. в разделе Тонкая настройка).

Использование в качестве кодека

Интерфейс 7Zip не позволяет напрямую выбрать дополнительный алгоритм в качестве метода сжатия, который будет использоваться при упаковке в формат 7Z. Поэтому его нужно указывать в поле Parameters в виде строки вида "0=NAME", где NAME - это внутреннее название метода сжатия:

Метод сжатияВнутреннее название
ZstandardZSTD
BrotliBROTLI
LZ4LZ4
LZ5LZ5
LizardLIZARD
Fast LZMA2FLZMA2
Упаковка в формат ZSTD в 7-Zip

Например, строка "0=ZSTD" будет обозначать, что необходимо использовать метод сжатия Zstandard.

Точное значение уровня сжатия также нужно указать напрямую в поле Parameters (см выше).

Тонкая настройка

Алгоритмы позволяют установить значения дополнительных параметров, влияющих на различные аспекты сжатия. Все дополнительные параметры при необходимости их использования указываются в поле Parameters в виде строки key=value, аналогично выбору параметра Уровень сжатия.

Для определения размера используется следующая система сокращений: key=Nx, где N - это число, а x - это единица измерения. Допустимые единицы измерения: b - байт, k - килобайт, m - мегабайт, g - гигабайт.

Размер блока

При сжатии с использованием алгоритма Brotli в качестве кодека и алгоритмов Zstandard, LZ4, LZ5, Lizard как в качестве кодека, так и при создании отдельного файла, входной поток данных делится на блоки одинакового размера, каждый из которых сжимается отдельно. Это позволяет увеличить скорость сжатия данных за счет сжатия каждого блока в отдельном потоке. Но данный метод ускорения имеет и отрицательную сторону - он приводит к снижению общего уровня сжатия.

По умолчанию размер блока определяется в соответствии с выбранным уровнем сжатия:

Для настройки размера блока служит ключ "c". Например, строка "c=512m" установит размер блока в 512 Мб. Строка "c=0b" имеет особое значение - при ее использовании входной поток не будет делиться на блоки вообще, при этом будет отключено многопоточное сжатие (данная строка не влияет на работу алгоритма Brotli). Это дает максимальную эффективность сжатия, но в тоже время является самым медленным режимом работы.

LZ4, LZ5, and Lizard

Для алгоритмов LZ4, LZ5 и Lizard дополнительно можно настроить размер словаря с использованием ключа "d". По умолчанию размер словаря определяется в соответствии с размером упаковываемых данных, но его можно выбрать самостоятельно.

АлгоритмРазмер словаря
LZ464k, 256k, 1m, 4m
LZ564k, 256k, 1m, 4m, 16m, 64m, 256m
Lizard128k, 256k, 1m, 4m, 16m, 64m, 256m

Brotli

При упаковке с использованием метода Brotli можно настроить следующие дополнительные параметры:

  • Algorithm; ключ "a"
    Допустимые значения:
    0: В этом режиме компрессор ничего не знает заранее о свойствах входных данных.
    1: Режим сжатия текста в формате UTF-8.
    2: Режим сжатия, использующийся в WOFF 2.0.
    Пример: a=0
  • Sliding LZ77 window size; ключ "d"
    Диапазон допустимых значений: 1k - 1g
    Компрессор может уменьшить переданное значение, если, например, размер входных данных гораздо меньше размера окна.
    Пример: d=256m
  • Input block size; ключ "mem"
    Диапазон допустимых значений: 1k - 16m
    Компрессор может уменьшить переданное значение, если, например, размер входных данных гораздо меньше размера входного блока.
    Больший размер блока позволяет добиться большего уровня сжатия, но требует больше памяти для работы.
    Пример: mem=256m
  • Флаг, определяющий использование функции "literal context modeling"; ключ "lc"
    Допустимые значения: 0, 1
    Флаг определяет выбор приоритета между скоростью распаковки и уровнем сжатия.
    Пример: lc=1
  • The number of postfix bits (NPOSTFIX); ключ "pb"
    Допустимые значения: 0, 1, 2, 3
    Компрессор может изменить переданное значение.
    Пример: pb=0
  • The number of direct distance codes; ключ "fb"
    Диапазон допустимых значений: 0 - 15 << NPOSTFIX с шагом 1 << NPOSTFIX
    Компрессор может изменить переданное значение.

Fast LZMA2

При упаковке с использованием метода Fast LZMA2 можно настроить следующие дополнительные параметры:

  • Algorithm; ключ "a"
    Допустимые значения: 1 (fast), 2 (optimize), 3 (hybrid mode)
    Пример: a=3
  • Dictionary size; ключ "d"
    Диапазон допустимых значений: 1m - 128m для 32 битной версии плагина; 1m - 1g для 64 битной версии плагина.
    Пример: d=64m
  • The number of fast bytes; ключ "fb"
    Диапазон допустимых значений: 5-273
    Пример: fb=160
  • Match finder cycles; ключ "mc"
    Диапазон допустимых значений: 0-1000000000
    Пример: mc=1000
  • The number of literal context bits; ключ "lc"
    Диапазон допустимых значений: 0-4
    Пример: lc=3
  • The number of literal pos bits; ключ "lp"
    Диапазон допустимых значений: 0-4
    Пример: lp=0
  • The number of pos bits; ключ "pb"
    Диапазон допустимых значений: 0-4
    Пример: pb=2

Подробнее о значении ключей указанных ключей можно прочитать в справке к программе 7-Zip в разделе, описывающем алгоритмы сжатия LZMA и LZMA2.

Актуальная версия

  • Версия плагина: 1.8.7
  • Размер установочного дистрибутива: 2744 KB
  • Дата установочного дистрибутива: 23 May 2021

Примечание для разработчиков

Разработчики, желающие добавить поддержку плагина Modern7z в свою программу, могут сильно упростить жизнь своим пользователям, избавив их от необходимости ручного ввода параметров. Modern7z поддерживает механизм получения и передачи параметров 7z Parameter API. Данный механизм позволяет приложению использовать любой новый плагин (поддерживающий 7z Parameter API) и корректно отображать доступные для изменения параметры полностью автоматически, основываясь лишь на данных, передаваемых самим плагином.

Дополнительная информация

Вы также можете использовать все методы сжатия плагина Modern7z в программе TC4Shell. Эта программа позволяет открывать множество типов архива прямо в Проводнике в виде простых папок. Также TC4Shell может использоваться для модификации и создания новых архивов.

Некоторое время назад мы проводили тестирование консольных архиваторов, которое показало что наиболее оптимальным является использование архиваторов на основе алгоритма Deflate, к которым относятся ZIP и gzip. Они обеспечивают высокую скорость архивации при неплохой степени сжатия. Их противоположностью являются использующие алгоритм LZMA продукты, самый известный из которых 7Zip, для них характерна отличная степень сжатия, но за это приходится платить низкой скоростью работы.

Постоянно растущие объемы данных не позволяют рассматривать LZMA, как эффективный алгоритм, делая его нишевым решением, когда на первый план выходит именно степень сжатия, а время создания и распаковки архивов не имеют значения. Поэтому при разработке Zstandard была поставлена цель добиться степени сжатия сравнимой с Deflate при более высокой скорости работы. Разработкой занимается Ян Колле (фр. Yann Collet) при поддержке Facebook и ему удалось достигнуть действительно отличных результатов. При использовании стандартной степени сжатия Zstandard сжимает лучше и быстрее Deflate, а на высоких степенях может тягаться с LZMA, но распаковка таких архивов происходит практически также быстро, как и архивов с низкой степенью компрессии.

Эта особенность обусловила переход на Zstandard для сжатия пакетов ведущими дистрибутивами, такими как Ubuntu, Fedora, Arc. Он применяется для сжатия в файловых системах btrfs и OpenZFS, в СУБД MySQL, PostgreSQL, MongoDB, Tarantool. С полным списком применяющих Zstandard проектов можно ознакомиться здесь: facebook.github.io/zstd. Все это заставляет присмотреться к новому алгоритму достаточно внимательно, поэтому мы провели собственное исследование эффективности Zstandard с которым и хотим вас ознакомить.

Тестирование эффективности Zstandard

Результат нас очень сильно удивил: zstd сжал 10,8 ГБ за рекордные 35 секунд, за ним следует gzip с результатом в 2 мин 15 секунд, а замыкает список 7zip, которому потребовалось более получаса.

А теперь сделаем несложные вычисления и подумаем. Zstandard распаковал и записал на диск 10,8 ГБ за 32 секунды, скорость копирования при этом составила около 360 МБ/с, что составляет практически верхнюю планку для нашего массива RAID 10 на котором расположена данная виртуальная машина. Может ли производительность дисковой подсистемы оказаться узким местом для архиватора? Вполне, причем не только при распаковке, но и при сжатии, так как данные с диска нужно прочитать, а с учетом результатов zstd мы получаем примерно такую же скорость обмена данными, близкую к физическим ограничениям подсистемы. Поэтому мы подключили к виртуальной машине еще один диск, расположенный на производительном NVMe SSD ADATA XPG SX8200 Pro и повторили тесты на нем.

Если классические алгоритмы не получили никакой выгоды от смены носителя, то для Zstandard эффект был получен незамедлительно, время сжатия дампа уменьшилось с 35 до 22 секунд, а это около 37%, что очень и очень неплохо.

С распаковкой картина аналогичная: Deflate и LZMA снова никак не отреагировали на смену носителя, а zstd обновил результаты, распаковав архив за 19 секунд и уверенно обозначил лидерство.

Даже столь небольшое тестирование дает понять, что перед нами очень эффективный алгоритм сжатия нового поколения, а стоящая за его разработкой компания Facebook, как раз работающая с большими объемами данных, обещает хорошие перспективы для дальнейшего развития.

Как начать пользоваться Zstandard

Следующий вопрос, который возникнет у наших читателей, как получить и начать использовать Zstandard? Для пользователей Linux все очень просто, zstd входит в репозитории и установить его можно простой командой (для DEB-based дистрибутивов):

Для получения краткой справки наберите:

а для ознакомления со всеми возможностями программы воспользуйтесь полной справкой:

Эта тема будет посвящена сравнению алгоритмов сжатия. Для владельцев Медленного и Лимитного Интернета будет полезно, да и не только им.

Для сжатия использовался ZArchiver 0.9.5 для Android, настройки всех форматов на Ультра. Указаны Размер и Процент от Размера Оригинала. Для 7Z включён LZMA2 (В настройках ZArchiver)

Под первым Спойлером показаны исходные размеры (Смотрите в нижний левый угол, последняя строка).

Внимание! Много Картинок!








Есть 7 папок, под разные категории

Теперь начнём же сравнение!

1: Образ Windows 3.10

2: Война и мир, FB2

3: Jeanne d’Arc, Rus, PSP

4: 459 игр для NES aka Денди, Rus

5: Исходный код Той Самой Игры - DOOM

6: Прошивка Navitel C500

7: Субтитры для Наруто: Ураганные Хроники! Кто помнит Акацуки и Мадару?

Вот и комментарии

Категория 1: Образ Windows 3.10

Оригинал: 11.25 МБ

Форматы типа "Как у всех" (Далее будет указан как "Тип 1")

ZIP: 8.89 МБ / 79% // Слабовато.

7Z: 8.05 МБ / 71% // Что и следовало ожидать от 7Z.

Форматы типа "Найди их - тот ещё квест". Кроме TAR.XZ. (Далее будет указан как "Тип 2")

TAR.LZ4: 9.48 МБ / 84% // Слился от ZIP. Что ещё ожидать от формата, заточенного на скорость. Хотя.

TAR.ZST: 8.38 МБ / 74% // Очень быстрое сжатие и распаковка, размеры в основном между ZIP и 7Z, хотя возможны варианты. Известен как ZStandard или ZSTD

TAR.XZ: 7.70 МБ / 68% // Тот случай, когда 7Z - не самый крутой в области сжатия!

Категория 2: Война и мир, в формате FB2

Оригинал: 9.07 МБ

ZIP: 3.37 МБ / 37% // Перфекционисты могут быть довольны - 37 же!

7Z: 2.96 МБ / 32% // Классика жанра

TAR.LZ4: 4.57 МБ / 50% // LZ4 снова слился.

TAR.ZST: 3.31 МБ / 36% // И снова победа над ZIP!

TAR.XZ: 2.96 МБ / 32% // Тут 7Z и XZ равны.

Категория 3: Игра для PSP - Jeanne d’Arc, русская версия!

Оригинал: 1.16 ГБ

ZIP: 640.14 МБ / 53% // Почти в два раза. Но всё равно - размеры ого-го!

7Z: 459.80 МБ / 38% // Вот это адекватные размеры!

TAR.LZ4: 701.92 МБ / 59% // Такой архив весит многовато.

TAR.ZST: 601.44 МБ / 50% // Архив меньше на

40 МБ, но скорость распаковки. Вы удивитесь, когда начнёте тесты на файлах больше 1 ГБ!

TAR.XZ: 459.80 МБ / 38% // Снова они равны!

Категория 4: Сборник из 459 игр для NES / Денди на русском языке!

Оригинал: 76.44 МБ

ZIP: 38.30 МБ / 50% // Чётко и поровну!

7Z: 34.82 МБ / 45% // 5 Процентов разницы для кого-то могут значит.

TAR.LZ4: 46.15 МБ / 60% // Как всегда.

TAR.ZST: 33.80 МБ / 44% // 7Z гнут даже скоростные форматы!

TAR.XZ: 27.83 МБ / 36% // 7Z уложили на лопатки!

Категория 5: Исходный код Той Самой Игры - DOOM!

Оригинал: 1.36 МБ

ZIP: 440.01 КБ / 31% // Классике всегда будет место!

7Z: 400.31 КБ / 28% // Немного лучше.

TAR.LZ4: 492.36 КБ / 35% // Не удивляйтесь!

TAR.ZST: 323.63 КБ / 23% // И снова 7Z пои. Победили, вот!

TAR.XZ: 273.11 КБ / 19% // Fatality!

Категория 6: Прошивка Navitel C500

Оригинал: 64.93 МБ

ZIP: 47.39 МБ / 72% // Норм

7Z: 40.56 МБ / 62% //Вот так лучше!

TAR.LZ4: 51.56 МБ / 79% // ОК.

TAR.ZST: 44.89 МБ / 69% // Скорость - ваше всё! (Соник согласится)

TAR.XZ: 40.51 МБ / 62% // Тут разница некритична.

Категория 7: Субтитры для Наруто: Ураганные Хроники! Кто помнит Акацуки, Мадару?

Оригинал: 134.00 МБ

ZIP: 32.67 МБ / 24% // Тексты всегда сжимаются на ура!

7Z: 28.46 МБ / 21% // Кто-то сэкономит траффик.

TAR.LZ4: 39.68 МБ / 29% // Даже тексты. Сжимает хуже всего!

TAR.ZST: 19.53 МБ / 14% // 7Z нагибают аж от души!

TAR.XZ: 11.68 МБ / 8% // Ну. у 7Z нет шансов!

Вывод

ZIP средний во всём, кроме сжатия - тут он занимает предпоследнее место!

7Z имеет высокое сжатие и низкую скорость сжатия / распаковки, но иногда его нагибают скоростные форматы, не говоря уже об XZ!

LZ4 до появления ZStandard мог быть пригоден благодаря скорости сжатия / распаковки, но после появления ZStandart его стоит использовать разве то для совместимости.

ZStandard имеет сжатие в основном между ZIP и 7Z, ОЧЕНЬ высокую скорость сжатия / распаковки, а иногда он по сжатию превосходит 7Z!

XZ имеет самое лучшее сжатие и низкую скорость сжатия / распаковки. Шикарный вариант для медленного и лимитного интернета.

Делайте свои выводы.

Спасибо за чтение!

Upd: сделал дополнительные тесты и узнал, что:

1: LZ4 иногда сжимает ЛУЧШЕ, чем ZIP, притом НАМНОГО быстрее даже на ультра настройках!

2: По скорости сжатия / распаковки 1 место занимает LZ4 (Скорость пригодна для Оперативной Памяти), а второе - ZStandard. Учитивая то, что формат создал автор LZ4 для замены алгоритмов на основе Deflate (ZIP, GZIP и т.д.), по скорости и степени сжатия он круче ZIP по всём! Игра для PSP, которую ZIP на Ультрах сжимает десятки минут, ZStandard на тех же настройках делает это за несколько секунд, давая меньший размер! И да, образ Windows XP SP3 особо не сжимается - я пытался. Ещё раз спасибо за чтение!

Читайте также: