Який максимальний коефіцієнт стиснення gzip?


51

Який найбільший розмір gzip (скажімо, 10 кб для прикладу) може бути декомпресований?

Відповіді:


91

Це дуже залежить від стиснення даних. Швидкий тест з 1Gb-файлом, заповненим нулями, дає стислий розмір ~ 120Kb, тому ваш 10Kb-файл може потенційно розширитися до ~ 85Mbytes.

Якщо дані мають низьку надмірність, для початку, наприклад, в архіві містяться файли зображень у форматі, який стискається власне (gif, jpg, png, ...), то gzip може взагалі не додавати подальшого стиснення. Для бінарних файлів, таких як виконавчі програми, ви можете бачити стиснення до 2: 1, для простого тексту, HTML або інших розміток 3: 1 або 4: 1 або більше - малоймовірно. Ви можете побачити 10: 1 у деяких випадках, але ~ 8700: 1, який бачите у файлі, заповненому одним символом, - це те, чого ви не збираєтеся бачити за аналогічними штучними обставинами.

Ви можете перевірити, скільки даних призведе до розпакування файлу gzip, фактично не записуючи його нестиснений вміст на диск, gunzip -c file.gz | wc --bytes- це розпакує файл, але не збереже результати, замість цього передавши їх, до wcяких буде підраховано кількість байтів, які вони проходять. потім відкиньте їх. Якщо стиснутий вміст - це файл tar, що містить багато безлічі невеликих файлів, ви можете виявити, що для розпакування повного архіву потрібно помітно більше місця на диску, але в більшості випадків кількість, повернута з gunzipвиводу з конвеєра wc, буде такою ж точною, як вам потрібно.


Я бачив, як HTML розширюється до 10x (звичайно, x3 і x4 був найпоширенішим!) .... можливо, багато зайвих даних для тих, хто вибухав + 8x. Я думаю, що сторінка, про яку йдеться, була сторінкою з інформацією про php.
Зомбі

Повторна розмітка, як видно на виході phpinfo(), стискається дуже добре. Технічна інформація в цьому висновку містить більше прямого повторення, ніж середній шматок природної мови, і розподіл алфавітів, ймовірно, менш плавний, що могло б допомогти етапу Хаффмана отримати кращі результати.
Девід Спіллетт

Ця відповідь не враховує навмисно шкідливі стислі дані. Можна створити шкідливий zip-файл близько 10 КБ, який може розширитися до трохи більше 4 ГБ.
Девід Шварц

Zip-бомби такого масштабу покладаються на вкладені архіви, тому, як людина, розпаковуючи файл, ви задовго помітили щось дивне. Вони можуть бути використані як ефективна атака DoS проти автоматизованих сканерів (на поштові послуги тощо).
Девід Спіллетт

1
@DavidSpillett: Вкладені zip-бомби розширюються в розміри в діапазоні петабайт. Це не те, про що я говорю. Подивіться навіть лише на один шар типової zip-бомби.
Девід Шварц

10

Зазвичай ви не отримуєте більш ніж 95% стиснення (так що 10 кБ gzipped дані декомпресуються до ~ 200 кБ), але є спеціально створені файли, які розширюються експоненціально. Шукайте 42.zip, він розкладається на кілька петабайт (безглуздих) даних.


4
Вікіпедія говорить, що 42.zip "містить п'ять шарів вкладених zip-файлів у наборах 16", так що це не є дійсним прикладом для декомпресії (лише для рекурсивної декомпресії).
Тгр

5
Дійсно, 42.zip - це конкретна небезпека для інструментів, які автоматично сканують поштові файли рекурсивно, наприклад сканери вірусів.
thomasrutter

4
Тобто zip, а не gzip
BeniBela

8

Дослівно цитується з https://stackoverflow.com/a/16794960/293815

Максимальний коефіцієнт стиснення формату дефляції становить 1032: 1. Це тому, що найдовший пробіг, який можна закодувати, - 258 байт. Для кожного такого запуску потрібно щонайменше два біти (один біт для коду довжини і один біт для коду відстані), отже, 4 * 258 = 1032 нестиснених байтів можуть бути закодовані на один стислий байт.

Ви можете отримати більше стиснення, gzipping результат gzip. Зазвичай це не покращує стиснення, але дуже довго працює.

До речі, підхід LZ77, використовуваний при дефляті, є більш загальним, ніж кодування довжиною пробігу. Замість просто довжини використовується пара довжини / відстані. Це дозволяє копіювати рядок з деякої відстані назад або реплікувати байт, як у довжині виконання, на відстань до однієї, або копіювати трійку байтів на відстань три і т.д.


6

Коефіцієнт стиснення будь-якого алгоритму стиснення буде функцією даних, що стискаються (крім довжини цих даних).

Ось аналіз на MaximumCompression ,
Подивіться на одному із зразків , таких як,

Короткий виклад тестів на стиснення декількох файлів

Тип файлу: декілька типів файлів (всього 46)  
Кількість файлів для стиснення в цьому тесті: 510  
Загальний розмір файлу (байти): 316.355.757 
Середній розмір файлу (байти): 620,305
Найбільший файл (байти): 18 403,071
Найменший файл (байти): 3,554

4

Величезний файл, що містить лише один символ, дуже добре стисне.


4

10 Мб нулів у файлі, стискайте з gzip -9 до 10217. Отже, максимальне співвідношення виглядає приблизно в 1000 разів.


1

Відповідь на ваше запитання залежить від введення. Щоб дати вам уявлення про те, як робиться стиснення, перегляньте ці шість хвилин відео.

https://www.youtube.com/watch?v=ZdooBTdW5bM

Що ви повинні отримати від цього, це те, що швидкість стиснення залежить від частоти кожного символу, таким чином, немає максимальної швидкості генералу, це залежить від введення, для англійського тексту це близько 65 відсотків.


1
Ласкаво просимо до Супер Користувача! Будь ласка, цитуйте основні частини відповіді із посилальних посилань (ив), оскільки відповідь може стати недійсною, якщо змінена пов’язана сторінка.
DavidPostill

Точніше було б сказати "частота кожного рядка", а не "частота кожного символу"
JoelFan
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.