Как мне добиться наилучшего стандартного сжатия ZIP?

20

Мне все равно, сколько времени нужно, чтобы сжать, все, чего я хочу добиться, это две вещи:

  • Абсолютно наилучшая степень сжатия
  • Совместимость со стандартными ридерами, такими как Windows и WinZip

Таким образом, такие предложения, как 7-zip, будут бесполезны, если только 7-zip не будет немного лучше при стандартном сжатии ZIP (в отличие от использования очень хорошего формата .7z).

В идеале я ищу:

  • Рекомендация части программного обеспечения
  • Конкретные настройки для этого программного обеспечения, которые обеспечивают абсолютное наилучшее сжатие
  • Что-то бесплатно

Помните, сколько времени занимает сжатие, это не проблема!

И последнее: некоторые файлы могут быть лучше сжаты с различными настройками, такими как «Размер слова» или «Размер словаря», - есть ли инструмент, который может анализировать файлы и выбирать наиболее подходящий коэффициент сжатия, или WinZip, 7-zip и т.д. уже это делать?

Джош Комли
источник

Ответы:

20

Если вам нужна совместимость с возможностями папок Zip, встроенных в Windows XP, вы застряли со сжатием Deflate. Я не думаю, что вы даже можете использовать Deflate64, тем более передовые методы сжатия (такие как LZMA, PPMD, WavPack, Bzip2 и т. Д.), Доступные в последних версиях winZip и PowerArchiver. PowerArchiver, по крайней мере, по умолчанию использует расширение .zipx для этих файлов - я не думаю, что WinZip это делает.

Наименьший возможный zip-файл, который может создать 7-Zip, можно выполнить с помощью следующей командной строки:

7za a -mm=Deflate -mfb=258 -mpass=15 -r C:\Path\To\Archive.zip C:\Path\To\Files\*

Особо следует отметить: шаблонный парсер 7-Zip отличается от большинства других в системе. *.*означает все файлы, которые имеют расширения. *означает все файлы.

Создание файлов .zip таким способом (и, по-видимому, с использованием других инструментов, которые пытаются сделать меньшие «стандартные» .zip файлы) действительно, очень медленно. Скорее всего, вы сэкономите значительное время и пространство, используя 7-Zip или WinRar для создания самораспаковывающихся архивов.

afrazier
источник
Моя ошибка 7z была на "-m0", но я думаю, "-mm" делает то же самое с последними версиями. Я также заметил, что в моем случае (сжатие файлов JPG) при использовании «-mx9» вместо «-mfb = 258 -mpass = 15» результат будет случайным образом отличаться в среднем на ± 15 байт (с исключениями, происходящими в пределах ± 50 с. )
Марк Иеронимус
1
@ Зом-Б: Вы правы, это должно было быть -mm=вместо -m0=. -m0=используется в .7zархивах. Кроме того, в руководстве 7-Zip указано, что -mx=9для архивов Zip эквивалентно -mfb=128 -mpass=10. Что я заметил, так это то, что -mfb=258 -mpass=15он всегда намного медленнее -mx=9и часто вообще не экономит много места (или иногда использует на несколько байт больше). Время от времени это экономит приличное место.
afrazier
«намного» медленнее в предыдущем комментарии переводится чуть более чем в 3 раза медленнее. Что касается места, более медленный вариант дает архив ок. Размер 99,885% по сравнению с более быстрой версией (т.е. -mx = 9 без -mpass = 15). Таким образом, в 3 раза больше времени можно сэкономить только 0,115% пространства. Так что, если это увеличение на 0,115% не является очень важным, используйте -mx = 9 вместо -mpass = 15.
ТВ
8

Наилучшие известные мне дефляторы (формат сжатия, используемый стандартными ZIP):

Сравнение размера сжатого файла с помощью сжатия данных с помощью Zopfli (заархивировано из оригинала ):

╔══════════════╦═══════════╦═════════╦═════════╦═════════╦═════════╗
║              ║Corpus size║gzip ­-9  ║7-­zip    ║kzip     ║Zopfli   ║
╠══════════════╬═══════════╬═════════╬═════════╬═════════╬═════════╣
║Alexa-top-10k ║  693108837║128498665║125599259║125163521║123755118║
║Calgary       ║    3141622║  1017624║   980674║   978993║   974579║
║Canterbury    ║    2818976║   730732║   675163║   674321║   669933║
║enwik8        ║  100000000║ 36445248║ 35102976║ 35025767║ 34995756║
╚══════════════╩═══════════╩═════════╩═════════╩═════════╩═════════╝

Даже на случайных PNG Zopfli был на 0,5% лучше, чем pngout . Zopfli делает самые маленькие из них.

Anon
источник
Как я могу использовать Zopfli для сжатия набора файлов, как с оригинальной командой zip?
Панайотис
1
@Panayotis Поиск в zopfli zip в Google ведет к github.com/google/zopfli/issues/29, в котором рассказывается о том, как проект zopfli не будет выполнять непосредственное выполнение Zip-файлов, но в нем обсуждаются такие инструменты, как advzip AdvanceCOMP, который может использовать zopfli в качестве бэкэнда. ,
Anon
5

Если вы работаете в Windows: если вы все еще хотите использовать формат ZIP, я бы порекомендовал использовать бесплатную утилиту командной строки KZIP Кена Сильвермана, которую можно найти здесь . Скопируйте его в папку, содержащую все файлы, которые нужно сжать, перейдите в эту папку с помощью CMD и выполните следующую команду:

kzip /r <filename of ZIP file> *.*

Как предполагает Роальд, лучше всего включить каталог, в котором kzip.exeнаходится переменная PATH вашей системы, чтобы предотвратить его включение в файл archive / Zip.

До сих пор я обнаружил, что файлы ZIP, созданные с помощью KZIP, примерно на 10-20% меньше, чем файлы, созданные другими программами сжатия ZIP. Они также полностью открыты другим архивным программным обеспечением (Winzip, WinRAR, 7-zip и т. Д.) И Windows.

Isxek
источник
5
Как насчет того, чтобы поместить его не в этот каталог, а где-нибудь в PATH вашей системы?
RD
1
У меня было такое же требование - должна поддерживаться стандартная функциональность Windows ZIP. KZIP - это то, что я в итоге использовал, так как он работал как чемпион. Не забудьте поиграть с параметрами / s / b / n, чтобы получить представление о том, что лучше всего работает в вашей среде.
Goyuix
Конечно! Переменная PATH Я отредактировал свой ответ. Спасибо, Роальд!
Isxek
или просто добавьте в команду префикс пути к исполняемому файлу
micsthepick
1

Супер простой скрипт для сжатия всех папок в папке в отдельные zip-файлы с использованием .zip filetype и метода сжатия Deflate64.

@echo off
for /d %%X in (*) do "c:\Program Files\7-Zip\7z.exe" a "%%X.zip" "%%X\" -tzip -mx9 -mm=Deflate64
SuperMar1o
источник
-1

Это больше предел того, сколько памяти вы должны сделать доступным для компрессора, пока он выполняет свою работу. Используя 7-Zip, я упаковал бы архив с форматом .Zip, ультра-сжатием, методом сжатия LZMA и размером словаря по умолчанию 64 МБ. Если у вас есть доступная память, увеличьте размер словаря, хотя учтите, что вам понадобится почти 3 ГБ доступной памяти для сжатия со словарем 64 МБ. Использование большего словаря должно позволить 7-zip охотиться за большим количеством совпадений и обеспечивать лучшее сжатие, если вы можете позволить себе память. LZMA превосходит gzip (я думаю, deflate / deflate64) и bzip2 в среднем на 5%, в зависимости от содержимого - до 10-12%.

Я не знаю инструмента, чтобы найти лучший размер слова / словаря, хотя я думаю, вы обнаружите, что метод сжатия имеет более сильную корреляцию с входными данными, и среднее / значения по умолчанию должны быть хорошими в противном случае.

Дарт Андроид
источник
3
У меня возникли некоторые проблемы с LZMA - например, независимо от того, какие настройки я пробую в 7zip, текстовый файл в этом zip ( joshz.com/Bad.zip ) не будет распаковываться при использовании встроенного декомпрессора Windows (я использую Windows 7).
Джош Комли
(zip-файл, на который я ссылался, содержит ошибочный файл для справки, но не был сжат с помощью LZMA)
Джош Комли
@joshcomley Мне не удалось найти список поддерживаемых схем сжатия для встроенного инструмента сжатия папок Windows. Согласно Википедии для LZMA, она будет поддержана WinZip и многими другими инструментами сжатия на различные платформы, поэтому я решил пойти с ним. * .zip - это просто контейнерный формат, поэтому я не знаю, существует ли «официальное» сжатие, которое будут поддерживать инструменты, или просто обычные (аналогично тому, как * .avi может хранить практически любой тип видео). Если вам нужно убедиться, что он всегда работает, упакуйте его как самораспаковывающийся.
Дарт Андроид
-3

Если вы ищете лучший компрессор для сред Windows , я бы порекомендовал вам попробовать либо * .zip формат с 7-zip LZMA 'Compression Method', либо использовать 7-Zip * .7z SFX архивы. SFX-архивы имеют накладные расходы около 130 КБ на сжатые файлы .7z и их стоит использовать, когда разница в размерах между .7z и .zip велика.

Другим хорошим, но необычным конкурентом является NSIS, который может использовать режим сжатия LZMA для создания настраиваемых exe-файлов. Я знаю, что NSIS - не компрессор, а язык сценариев, но я был впечатлен, что он работает лучше, чем 7-zip SFX.

Тест, который я сделал с 2 файлами -

  • AutoHotkey-H.exe (946 КБ)
  • AutoHotkey.dll (1003 КБ)
  • Общий размер - 1955 кб

  • 7-Zip .zip - 794 кб
  • 7-Zip .7z SFX - 594 кб
  • NSIS LZMA Solid Compression - 552 Кбайт
  • 7-Zip .7z - 461 кб

Поскольку # 4 - это не то, что вам нужно, абсолютный победитель - NSIS, но по практическим причинам я рекомендую использовать .zip сжатый размер менее 500 КБ, а если больше, то использовать инструмент для создания exe-файлов, такой как 7-Zip SFX или NSIS (в частности, 7-zip, так как его легко настроить).

Avi
источник
2
Требования в вопросе специально исключают 7z и другие форматы.
Боб
@Bob Он сказал, что компрессор, который совместим с Windows и EXE (мои # 2 и # 3) есть. 7z - это только № 4, на который я указал.
Avi