Здравствуй Хабр!
Данная статья посвящена, как правильно и максимально сжимать файлы в ZIP-архивы. Данную статью я решил написать по той причине, что очень много приложений свои форматы упаковывают именно в ZIP. В данной статье разберем методы сжатия ZIP, приложения для сжатия в ZIP, и как можно улучшить сжатие.
Для начало предлагаю разобрать с тем, что ZIP поддерживает разные методы сжатия (Copy, Deflate, Deflate64, BZip2, LZMA, PPMd), но мы будем рассматривать только один метод сжатия — Deflate, по той причине, что именно данный метод используют большинство приложений, которые упаковывают свои форматы в ZIP. Вот небольшой список форматов файлов, которые на самом деле являются ZIP-архивами — open-file.ru (введите в поиске ASCII-дескриптор заголовка — PK). Сразу оговорюсь, это только небольшой перечень файлов.
На сегодняшний день есть несколько библиотек, основанных на методе сжатия Deflate:
Так что перед тем как выбирать архиватор для ZIP, необходимо понять какой результат нам нужен, и сколько времени готовы затратить для его получения. для Deflate характерно, чем выше степень сжатия, тем больше времени придется затратить.

В данном разделе, мы будем рассматривать только те приложения, которые бесплатные для использования.
Здесь мы поговорим о двух программах, где реализован алгоритм 7-zip: 7-zip и advzip.
При создании zip-архива в помощью 7-zip, я использую следующие параметры
Особенность работы advzip в том, что он уже работает с готовыми архивами zip, т.е. вы просто указываете путь к архиву, и он сам пытается его сжать. Бывает удобно когда у вас уже есть готовый архив, и вам не надо распаковывать и архивировать еще раз.
Алгоритм kzip был реализован в приложении kzip, приложение работает крайне медленно, но практически всегда дает лучший результат. У него есть настройки (/s, /n, /b), которые могут улучшить/ухудшить степень сжатия ZIP.
Здесь я хотел дать несколько рекомендаций, как получать наилучшую степень сжатия (рекомендации основаны, на личном опыте):
И так решил показать, как это все работает. Для примера я взял игру для iPad — Angry Birds HD версии 2.0.0. Исходный размер игры 13 547 363 байт.
Как видно zipmix может ненамного улучшить степень сжатия. Лично мне когда надо получить максимум объединяю просто все три (kzip + advzip + 7-zip) результата в один. Это на много лучше, чем пытаться перебирать параметры в kzip.
Данная статья посвящена, как правильно и максимально сжимать файлы в ZIP-архивы. Данную статью я решил написать по той причине, что очень много приложений свои форматы упаковывают именно в ZIP. В данной статье разберем методы сжатия ZIP, приложения для сжатия в ZIP, и как можно улучшить сжатие.
Метод сжатия в ZIP
Для начало предлагаю разобрать с тем, что ZIP поддерживает разные методы сжатия (Copy, Deflate, Deflate64, BZip2, LZMA, PPMd), но мы будем рассматривать только один метод сжатия — Deflate, по той причине, что именно данный метод используют большинство приложений, которые упаковывают свои форматы в ZIP. Вот небольшой список форматов файлов, которые на самом деле являются ZIP-архивами — open-file.ru (введите в поиске ASCII-дескриптор заголовка — PK). Сразу оговорюсь, это только небольшой перечень файлов.
Метод сжатия Deflate
На сегодняшний день есть несколько библиотек, основанных на методе сжатия Deflate:
Библиотека Deflate | Скорость работы | Степень сжатия | Приложения |
Zlib | Высокая | Низкая | |
7-zip | Средняя | Средняя | 7-zip, advzip |
Kzip | Низкая | Высокая | kzip |

Архиваторы ZIP
В данном разделе, мы будем рассматривать только те приложения, которые бесплатные для использования.
Алгоритм 7-zip
Здесь мы поговорим о двух программах, где реализован алгоритм 7-zip: 7-zip и advzip.
При создании zip-архива в помощью 7-zip, я использую следующие параметры
-r -mm=Deflate -y -tzip -mpass=15 -mfb=258 -mx9
Особенность работы advzip в том, что он уже работает с готовыми архивами zip, т.е. вы просто указываете путь к архиву, и он сам пытается его сжать. Бывает удобно когда у вас уже есть готовый архив, и вам не надо распаковывать и архивировать еще раз.
Алгоритм kzip
Алгоритм kzip был реализован в приложении kzip, приложение работает крайне медленно, но практически всегда дает лучший результат. У него есть настройки (/s, /n, /b), которые могут улучшить/ухудшить степень сжатия ZIP.
Рекомендации
Здесь я хотел дать несколько рекомендаций, как получать наилучшую степень сжатия (рекомендации основаны, на личном опыте):
- Если вы архивируете файлы, и там есть архивы ZIP, рекомендую эти архивы разжать (для удобства можно использовать advzip с параметром /z0). Это объясняется тем, что метод Deflate не поддерживает непрерывные архивы, т.е. получается, что когда метод Deflate пытается сжать разжатый архив, разжатый архив в этом случаи предстает как один целый файл и его содержимое сжимается как непрерывный архив.
- Если вы хотите получить максимальный эффект сжатия, то можете воспользоваться приложением zipmix. Допустим вы создали два одинаковых по содержанию архива zip с помощью kzip, но разными настройками, и в итоги получали разные по размеру архивы. Но это не означает, что все файлы, которые вы сжали в первом архиве имеют по отдельности в сжатом виде меньший размер, чем во втором архиве. Для этих целей нужен zipmix, он создает из двух архивов третий архив, с меньшим размером, т.к. он сравнивает каждый файл по отдельности, и выбирает тот вариант, где размер меньше. zipmix работает не только с архивами kzip.
Практика
И так решил показать, как это все работает. Для примера я взял игру для iPad — Angry Birds HD версии 2.0.0. Исходный размер игры 13 547 363 байт.
Приложения | Результат, байт | Затраченное время, секунда |
advzip | 12 891 768 | 195 |
7-zip | 12 891 143 | 720 |
kzip | 12 877 794 | 2770 |
7-zip+advzip | 12 858 419 | — |
kzip+advzip | 12 849 101 | — |
kzip+7-zip+advzip | 12 842 760 | — |
Как видно zipmix может ненамного улучшить степень сжатия. Лично мне когда надо получить максимум объединяю просто все три (kzip + advzip + 7-zip) результата в один. Это на много лучше, чем пытаться перебирать параметры в kzip.