Какой алгоритм сжатия наиболее эффективен между xz, gzip и bzip2?
Между xz, gzip и bzip2, какой алгоритм сжатия дает наименьший размер файла и самую высокую скорость при сжатии довольно больших тарболлов?
5 ответов
В моем стресс-тесте я сжал 464 мегабайта данных, используя три перечисленных формата. Gzip вернул файл размером 364 МБ. Bzip2 вернул файл размером 315 МБ. Xz вернул файл размером 254 МБ. Я также сделал простой тест скорости:
Сжатие:
1: Gzip
2: Xz
3: Bzip2 (мой вентилятор дул довольно долго, пока это происходило, указывая на то, что мой Athlon II был довольно напряженным)
Декомпрессия:
1: Xz
2: Gzip
3: Bzip2
Обратите внимание, что все эти тесты были выполнены с использованием последней версии 7-Zip.
Xz - лучший формат для всестороннего сжатия, в то время как Gzip очень хорош для скорости. Bzip2 подходит для своей степени сжатия, хотя xz, вероятно, следует использовать вместо него.
Я думаю, что эта статья дает очень интересные результаты.
http://pokecraft.first-world.info/wiki/Quick_Benchmark:_Gzip_vs_Bzip2_vs_LZMA_vs_XZ_vs_LZ4_vs_LZO
Наиболее эффективными форматами являются xz и lzma, оба с переданным параметром -e.
Самым быстрым алгоритмом на сегодняшний день являются lzop и lz4, которые могут выдавать уровень сжатия не очень далеко от gzip за 1,3 секунды, в то время как gzip занимал 8,1 секунды. Степень сжатия составляет 2,8 для lz4 и 3,7 для gzip.
Вот несколько результатов, которые я извлек из этой статьи:
Gzip: 8,1 с при 3,7
lz4: 1,3 с при 2,8
xz: 32,2 с при 5,43
xz-e: 6m40 @ 7.063
- xz: 4m51s @ 7.063
Так что если вам действительно нужна скорость, lz4 великолепен и по-прежнему обеспечивает степень сжатия 2,8.
Если вам отчаянно нужно сэкономить байт, xz при максимальном уровне сжатия (9) лучше всего справляется с текстовыми файлами, такими как исходный код ядра. Однако это очень долго и занимает много памяти.
Хорошим примером для минимизации влияния на время и пространство является gzip. Это тот, который я бы использовал для ежедневного ручного резервного копирования производственной среды.
Я сделал свой собственный тест для установочного образа Linux на 1.1GB vmdk:
rar =260MB comp= 85s decomp= 5s
7z(p7z)=269MB comp= 98s decomp=15s
tar.xz =288MB comp=400s decomp=30s
tar.bz2=382MB comp= 91s decomp=70s
tar.gz =421MB comp=181s decomp= 5s
все уровни сжатия на макс., процессор Intel I7 3740QM, память 32 ГБ 1600, источник и место назначения на RAM-диске
Обычно я использую rar или 7z для архивирования обычных файлов, таких как документы.
а для архивирования системных файлов я использую.tar.gz или.tar.xz с помощью file-roller или tar с параметрами -z или -J вместе с --preserve для непосредственного сжатия с помощью tar и сохранения разрешений (также альтернативно.tar.7z или.tar.rar можно использовать)
Обновление: поскольку tar сохраняет только обычные разрешения, но не ACL, в любом случае также можно использовать обычные разрешения.7z плюс резервное копирование и восстановление, а также ACL вручную через getfacl и sefacl, что представляется наилучшим вариантом как для архивирования файлов, так и для резервного копирования системных файлов, поскольку он будет заполнен Сохранять разрешения и ACL, имеет контрольную сумму, проверку целостности и возможность шифрования, только недостатком является то, что p7zip не везде доступен
Вопрос из 2014 года, но за это время наметились некоторые тенденции. bzip2 практически устарел из-за xz , и вероятно, лучше всего подходит для большинства рабочих процессов.
Минимальный размер файла: xz по-прежнему является лучшим вариантом, когда речь идет о минимальном размере файла. Однако сжатие довольно дорогое занятие, поэтому, если это вызывает беспокойство, лучше подходят более быстрые алгоритмы сжатия. Реализация pxz позволяет использовать многоядерность, что может немного ускорить сжатие xz.
Оптимизация для быстрого сжатия. Когда дело доходит до лучшего алгоритма при оптимизации в первую очередь по скорости сжатия, на мой взгляд, явного победителя нет, но lz4 — хороший кандидат.
Лучший компромисс: если вам нужно выбрать хороший общий алгоритм, не зная слишком много о сценарии, тогда zstd,zstd подойдет. Если он настроен на работу с той же скоростью, что и gzip, он легко превзойдет его по размеру. При более высокой степени сжатия он приближается к xz, но на более высоких скоростях. Итак, если вам нужен надежный алгоритм для широкого спектра случаев использования, zstd, скорее всего, превзойдет другие. Он также имеет некоторые расширенные функции, такие как возможность создания внешнего словаря, поэтому его можно дополнительно оптимизировать для конкретных доменов.
Максимальная совместимость: если вам нужен алгоритм, который сможет понять любое приложение, то gzip по-прежнему будет лучшим вариантом по умолчанию. По сравнению с zstd, он сейчас по большей части устарел, но с gzip сможет работать практически любая среда, а поддержки zstd до сих пор нет (в 2021 году). Он был выпущен в 2016 году, а gzip — в 1992 году.
Дополнительно: есть драматизм! разница в размере вывода, когда вы хотите сжать архив из структуры папок с большим количеством повторяющихся файлов.
Вы можете настроить сжатие для ВАШЕГО большого архива (в моем случае с множеством повторяющихся файлов). Это означает либо:
- используйте инструмент, который выполняет дедупликацию перед фактическим сжатием, например, sqashfs или libwim
- используйте инструмент, который может создавать архивы с надежным механизмом, например 7z https://en.wikipedia.org/wiki/Solid_compression
- и поиграйте с размером словаря и размером твердого фрагмента (если доступно) xz/gzip/bzip2/etc. Это имеет существенное значение для больших файлов с повторяющимися частями.
Мой образец набора данных составляет 1 ГБ необработанных данных. Несколько dll-файлов, среди которых много дубликатов. При простом сжатии я получил архивы размером около 150 МБ с xz/gz/etc.
Мой лучший результат — 40 МБ за 9 секунд сwimcapture data out.wim --compress=none --solid --solid-chunk-size=1M
.
Во время исследования я также наткнулся на https://github.com/mhx/dwarfs , на который, возможно, стоит обратить внимание. Он сочетает в себе современные методы сжатия с дедупликацией и скоростью.