Як я можу досягти найкращого, стандартного стиснення ZIP?


20

Мені все одно, скільки часу потрібно стиснути, я хочу досягти двох речей:

  • Абсолютно найкращий коефіцієнт стиснення
  • Сумісність зі стандартними читачами, такими як Windows та WinZip

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

В ідеалі я шукаю:

  • Рекомендація щодо програмного забезпечення
  • Конкретні налаштування цього програмного забезпечення, що дозволяють отримати найкращу компресію
  • Щось безкоштовно

Пам'ятайте, скільки часу потрібно для стиснення - це не проблема!

І останнє - деякі файли, можливо, краще стискати з різними налаштуваннями, як-от "Розмір слова" або "Розмір словника" - чи є інструмент, який може аналізувати файли і вибирати найбільш відповідне коефіцієнт стиснення, або WinZip, 7-zip тощо вже роблять це?

Відповіді:


20

Якщо ви хочете сумісність із функцією Zip Folders, вбудованою в 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 для створення архівів, що самостійно витягують.


Моя помилка 7z на "-m0", але, мабуть, "-mm" робить те ж саме з останніми версіями. Я також зауважив, що в моєму випадку (стискання файлів JPG), використовуючи "-mx9" замість "-mfb = 258 -mpass = 15", результат буде відрізнятися випадковим чином в середньому на ± 15 байт (за винятком випадків, що становлять ± 50 s )
Марк Єронімус

1
@ Zom-B: Ти маєш рацію, це мало бути -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,151% місця. Тож, якщо цей коефіцієнт посилення 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║
╚══════════════╩═══════════╩═════════╩═════════╩═════════╩═════════╝

Навіть на випадкових ПНГ Зопфлі зміг бути на 0,5% кращим, ніж pngout . Зопфлі робить найменший з усіх.


Як я можу використовувати Zopfli для стискання набору файлів, як, наприклад, з оригінальною командою zip?
Панайотис

1
@Panayotis Пошук Google у zipfli zip призводить до github.com/google/zopfli/isissue/29, який розповідає про те, як проект zopfli не буде робити Zip файли безпосередньо, але включає обговорення таких інструментів, як advzip AdvanceCOMP, який може використовувати zopfli як бекенд .
Анон

5

Якщо припустити, що ви перебуваєте в Windows: якщо ви все ще хочете використовувати формат ZIP, я рекомендую використовувати безкоштовну утиліту командного рядка KZIP Кена Сілвермана, яку ви знайдете тут . Скопіюйте його всередину папки, що містить усі файли, необхідні для стиснення, перейдіть до цієї папки за допомогою CMD та запустіть таку команду:

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

Як пропонує Роальд, найкраще включити каталог, де kzip.exeзнаходиться в змінній PATH вашої системи, щоб запобігти його включенню в файл архіву / Zip.

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


5
А як бути з тим, щоб не помістити його в цей каталог, а десь на PATH вашої системи?
RD

1
У мене була така ж вимога - вона повинна підтримуватися стандартною функцією ZIP для Windows. KZIP - це те, що я в кінцевому підсумку використовував, оскільки він працював як чемпіон. Не забудьте пограти з параметрами / s / b / n, щоб добре зрозуміти, що найкраще працює у вашому оточенні.
Goyuix

Звичайно! Змінна PATH. Я відредагував свою відповідь. Дякую Роальд!
Іссек

або просто
приставте

1

Супер простий скрипт для стиснення всіх папок у папці до окремих поштових файлів за допомогою файлу .zip та методу стиснення Deflate64.

@echo off
for /d %%X in (*) do "c:\Program Files\7-Zip\7z.exe" a "%%X.zip" "%%X\" -tzip -mx9 -mm=Deflate64

-1

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

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


3
У мене виникають певні проблеми з LZMA - наприклад, незалежно від того, які параметри я пробую в 7zip, текстовий файл цього zip ( joshz.com/Bad.zip ) не розпаковуватиметься за допомогою вбудованого в декомпресатор Windows (я використовую Windows 7).
Джош Комлі

(zip-файл, до якого я посилався, містить помилковий файл для довідок, але його не стискали LZMA)
Josh Comley

@joshcomley Мені не вдалося знайти список підтримуваних схем стиснення для вбудованого інструменту стиснення папок Windows. Згідно Вікіпедії для LZMA, вона буде підтримана WinZip і багатьма іншими інструментами стиснення на різні платформи, тому я вирішив піти з ним. * .zip - це лише формат контейнера, тому я не знаю, чи існує "офіційне" стиснення, які інструменти підтримуватимуть, або просто загальні (подібні до того, як * .avi може вміщувати майже будь-який тип відео). Якщо вам потрібно переконатися, що він завжди працює, упакуйте його як саморозпаковується.
Дарт Android

-3

Якщо ви шукаєте найкращий компресор для середовищ Windows , я б рекомендував вам спробувати формат * .zip із 7-zip LZMA «методом стиснення» або використовувати 7-Zip * .7z SFX архіви. Архів SFX має накладні витрати близько 130 кб на .7z стислих файлах і їх варто використовувати, коли різниця в розмірах між .7z і .zip велика.

Ще одним хорошим, але рідкісним конкурентом є NSIS, який може використовувати режим стиснення LZMA для створення сильно налаштованих exes. Я знаю, що NSIS - це не компресор, а мова сценаріїв, але мене вразило, що він працює краще, ніж 7-zip SFX.

Тест, який я зробив з 2-х файлів -

  • AutoHotkey-H.exe (946 kb)
  • AutoHotkey.dll (1003 kb)
  • Загальний розмір - 1955 кб

  • 7-Zip .zip - 794 кб
  • 7-Zip .7z SFX - 594 кб
  • Суцільна компресія NSIS LZMA - 552 кб
  • 7-Zip .7z - 461 kb

Оскільки №4 - це не те, що ви хочете, явний переможець - NSIS, але з практичних причин я пропоную перейти з .zip стислим розміром менше 500 кбіт, а якщо більше, перейдіть за допомогою інструменту для виготовлення exe, такого як 7-Zip SFX або NSIS (зокрема 7-zip, оскільки його легко налаштувати).


2
Вимоги у питанні конкретно виключають 7z та інші формати.
Боб

@Bob Він сказав, що компресор, сумісний із Windows та exe (мої №2 та №3), є. 7z - це лише №4, на яке я вказав.
Аві
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.