46

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

7 ответов7

85

Это очень сильно зависит от сжимаемых данных. Быстрый тест с файлом размером 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 , будет таким же точным, как вы. необходимость.

10

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

7

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

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

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

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

5

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

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

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

File type : Multiple file types (46 in total)  
# of files to compress in this test : 510  
Total File Size (bytes) : 316.355.757 
Average File Size (bytes) : 620,305
Largest File (bytes) : 18,403,071
Smallest File (bytes) : 3,554
4

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

4

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

1

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

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

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

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .