Какова максимальная степень сжатия gzip?

Ответы:

91

Это очень сильно зависит от сжимаемых данных. Быстрый тест с файлом 1 Гб, заполненным нулями, дает сжатый размер ~ 120 КБ, поэтому ваш файл 10 КБ может потенциально расшириться до ~ 85 МБ.

Если для начала данные имеют низкую избыточность, например, архив содержит файлы изображений в формате, который изначально сжат (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: вложенные почтовые бомбы расширяются до размеров в петабайтном диапазоне. Я не об этом. Посмотрите хотя бы на один слой типичной бомбы на молнии.
Дэвид Шварц
10

Обычно сжатие не превышает 95% (сжатые данные размером 10 КБ распаковываются до ~ 200 КБ), но есть специально созданные файлы, которые расширяются в геометрической прогрессии. Ищите 42.zip, это распаковывает до нескольких петабайт (бессмысленных) данных.

liori
источник
4
Википедия говорит, что 42.zip «содержит пять слоев вложенных zip-файлов в наборах по 16», так что это недопустимый пример декомпрессии (только для рекурсивной декомпрессии).
Tgr
5
Действительно, 42.zip представляет особую опасность для инструментов, которые автоматически рекурсивно сканируют ZIP-файлы, например, антивирусные сканеры.
Томасруттер
4
Это почтовый индекс, а не gzip
BeniBela
8

Цитируется дословно из https://stackoverflow.com/a/16794960/293815

Максимальный коэффициент сжатия формата deflate составляет 1032: 1. Это связано с тем, что самый длинный цикл, который может быть закодирован, составляет 258 байтов. Для каждого такого прогона требуются по меньшей мере два бита (один бит для кода длины и один бит для кода расстояния), следовательно, 4 * 258 = 1032 несжатых байта могут быть закодированы на один сжатый байт.

Вы можете получить большее сжатие, распаковав результат gzip. Обычно это не улучшает сжатие, но для очень длительных запусков это может.

Кстати, подход LZ77, используемый deflate, является более общим, чем кодирование длин серий. Вместо длины используется пара длина / расстояние. Это позволяет копировать строку с некоторого расстояния назад или реплицировать байт, как в длине пробега, на расстояние один, или реплицировать тройки байтов с расстоянием три и т. Д.

ioquatix
источник
6

Степень сжатия любого алгоритма сжатия будет зависеть от сжимаемых данных (помимо длины этих данных).

Вот анализ в MaximumCompression ,
посмотрите на один из примеров, как,

Сводка тестов на сжатие нескольких файлов

Тип файла: несколько типов файлов (всего 46)  
Количество файлов для сжатия в этом тесте: 510  
Общий размер файла (в байтах): 316,355.757 
Средний размер файла (в байтах): 620,305
Самый большой файл (в байтах): 18,403,071
Наименьший файл (в байтах): 3,554
Nik
источник
4

Огромный файл, содержащий только один символ, будет очень хорошо сжиматься.

Компьютерщик
источник
4

10 МБ нулей в файле, сжать с помощью gzip -9 до 10217. Таким образом, максимальное отношение выглядит примерно равным 1000x.

Никос
источник
1

Ответ на ваш вопрос зависит от ввода. Чтобы дать вам представление о том, как осуществляется сжатие, посмотрите эти шесть минут видео.

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

Из этого следует, что степень сжатия зависит от частоты каждого символа, поэтому максимальная скорость генерации отсутствует, она зависит от ввода, для английского текста она составляет около 65 процентов.

brunsgaard
источник
1
Добро пожаловать в Супер пользователя! Пожалуйста, процитируйте основные части ответа по ссылочной ссылке (ссылкам), так как ответ может стать недействительным, если связанные страницы изменятся.
DavidPostill
Было бы точнее сказать «частота каждой строки», а не «частота каждого символа»
JoelFan