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

118473
Zombies

На какой самый большой размер можно распаковать gzip (скажем, 10 КБ для примера)?

45

7 ответов на вопрос

85
David Spillett

Это очень сильно зависит от сжимаемых данных. Быстрый тест с файлом 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. Zombies 14 лет назад 0
Повторяющаяся разметка, как видно из вывода `phpinfo ()`, сжимается очень хорошо. Техническая информация в этих выходных данных содержит более прямое повторение, чем средняя часть естественного языка, и распределение алфавита, вероятно, менее плавное, что может помочь стадии Хаффмана получить лучшие результаты. David Spillett 14 лет назад 0
Этот ответ не учитывает [преднамеренно вредоносные] (http://en.wikipedia.org/wiki/Zip_bomb) сжатые данные. Можно создать вредоносный zip-файл размером около 10 КБ, который может быть расширен до 4 ГБ. David Schwartz 11 лет назад 0
Тем не менее, Zip-бомбы такого масштаба полагаются на вложенные архивы, поэтому, как человек, распаковывающий файл, вскоре вы заметите нечто странное. Они могут быть использованы в качестве эффективной DoS-атаки против автоматических сканеров (на почтовые сервисы и т. Д.). David Spillett 11 лет назад 0
@DavidSpillett: вложенные почтовые бомбы расширяются до размеров в петабайтном диапазоне. Я не об этом. Посмотрите хотя бы на один слой типичной бомбы на молнии. David Schwartz 11 лет назад 1
Я обнаружил, что файл 1 ГБ, полный нулей, дает сжатый файл размером 1042079 байт, что намного больше, чем ~ 120 КБ. GZIP 1.3.12 используется. WKPlus 7 лет назад 0
@WKPlus - я не могу воспроизвести результат ни с помощью сжатия по умолчанию gzip, ни с помощью «--best», ни с помощью других реализаций, таких как 7zip, во всех случаях получая чуть более 1 Мб или меньше. Даже с другими форматами, такими как 7z, я могу получить только ~ 150Kb. Даже разные входные размеры, такие как 100M, не дают одинакового результата. К сожалению, у меня нет заметки о том, что я использовал тогда, чтобы увидеть, откуда возникло несоответствие. Я полностью пересмотрю ответ, когда у меня будет немного больше времени завтра. David Spillett 7 лет назад 0
10
liori

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

Википедия [говорит] (http://en.wikipedia.org/wiki/Zip_bomb) 42.zip «содержит пять слоев вложенных zip-файлов в наборах по 16», так что это недопустимый пример для декомпрессии (только для рекурсивного декомпрессия). Tgr 11 лет назад 4
Действительно, 42.zip представляет особую опасность для инструментов, которые автоматически рекурсивно сканируют zip-файлы, например, антивирусные сканеры. thomasrutter 10 лет назад 4
Это почтовый индекс, а не GZIP BeniBela 7 лет назад 3
6
ioquatix

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

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

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

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

5
nik

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

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

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

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

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

3
nikos

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

1
brunsgaard

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

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

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

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

Похожие вопросы