Почему 7zip-файл больше, чем необработанный файл? [Дубликат]

37

Возможное дублирование:
почему ZIP Compression ничего не сжимает?

Я попробовал 7zip .exe файл, но на самом деле он стал больше.

введите описание изображения здесь

Это ожидаемый результат?

IMB
источник
3
Да, это ожидаемый результат. Зачем? Потому что, когда что-то уже сжато (= используя меньшее возможное пространство), оно не может быть сжато дальше.
woliveirajr
4
Просто чтобы добавить ко всем остальным - так как этот exe-файл определенно является установщиком, большая часть его содержимого, вероятно, представляет собой zip или cab-архив. Вы не получите те же результаты из обычного exe-файла (но большинство обычных exe-файлов не будут иметь 145 мегабайт)
Random832
1
Объяснение только с использованием базовой логики: Сжатие находит для необработанного файла UNIQUE заархивированный файл, а для заархивированного файла UNIQUE raw (несжатый) исходный файл. Представьте, что у вас есть 8-битные файлы и вы хотите сжать их в 5-битные файлы. Есть 256 уникальных 8-битных файлов, но только 32 уникальных 5-битных файла (!), Поэтому некоторые 8-битные файлы должны быть сжаты в один и тот же 5-битный файл (!). А если 2 разных необработанных файла сжаты в один и тот же ZIP-файл, какой из них вы хотите получить после распаковки? Для любого метода архивации, если существуют файлы, которые становятся меньше после архивации, должны существовать файлы, которые становятся больше (!)
Иван Кукир

Ответы:

78

Все сводится к концепции энтропии . Смотрите Википедию .

Основная идея заключается в том, что если бы существовала операция сжатия, которая всегда могла сделать файл меньше, то логика подсказывает, что указанная операция сжатия сможет уменьшить любой файл до 0 байтов и при этом сохранить все данные. Но это абсурд , потому что мы знаем, что 0 байтов не могут передавать какую-либо информацию вообще. Итак, мы только что доказали, что не может существовать алгоритм сжатия, который всегда уменьшает его входные данные, потому что если бы это было так, любая информация могла бы храниться в 0 байтах - но 0 байтов подразумевают отсутствие информации, поэтому вы можете ' т одновременно нет нет информации и всей информации. Следовательно, это абсурд.

Из-за этой теоретической концепции каждая программа сжатия, которую вы когда-либо используете, будет увеличивать размер (или, в лучшем случае, поддерживать тот же размер) некоторого ввода. То есть для любого алгоритма сжатия, который вы разрабатываете или используете, будут определенные входные данные, которые будут меньше, а некоторые нет.

Уже сжатые данные, как правило, являются ужасным кандидатом для дальнейшего сжатия, поскольку большинство алгоритмов сжатия без потерь основаны на тех же теоретических принципах. Это является возможным , чтобы сжать плохо сжатые данные еще дальше; но это менее эффективно, чем просто сжимать его наилучшим доступным алгоритмом из исходных данных для начала.

Например, если у вас есть текстовый файл размером 100 МБ и вы сжимаете его с помощью обычного алгоритма Zip, он может быть сжат до 50 МБ. Если затем сжать Zip-файл с помощью LZMA2, вы можете уменьшить его до 40 или 45 МБ, поскольку LZMA имеет более высокую степень сжатия для большинства сжимаемых данных, чем Zip. Поэтому вполне понятно, что он также может сжимать данные Zip, потому что Zip не полностью высасывает из него всю энтропию. Но если вы полностью исключите контейнер Zip, вы сможете получить его еще меньше, сжимая необработанный текст с помощью LZMA2, потенциально получая что-то порядка 30–35 МБ (это просто «воздушные числа», чтобы проиллюстрировать концепцию) ,

В случае того двоичного файла, который вы пытаетесь сжать, он больше, потому что формат файла 7-Zip должен создать свою собственную внутреннюю структуру и упаковать данные уже сжатого исполняемого файла в формат 7-Zip. Это содержит такие вещи, как словарь, заголовок файла и так далее. Эти дополнительные данные обычно более чем компенсируются экономией на сжатии самих данных, но кажется, что исполняемый файл, который вы пытаетесь сжать, уже сжат с помощью некоторой формы LZMA; в противном случае он, скорее всего, уменьшит размер исполняемого файла или очень немного увеличит его, а не увеличит его на 2 МБ (что очень много).

allquixotic
источник
Кстати, самая важная часть для ответа на этот вопрос в самом конце: «Это содержит такие вещи, как словарь, заголовок файла и т. д. Эти дополнительные данные обычно более чем компенсируются экономией сжатия самих данных, но это Похоже, что исполняемый файл, который вы пытаетесь сжать, уже сжат какой-то формой LZMA "
jhocking
6
@jhocking: Нет, самая важная часть ближе к середине: «Каждая программа сжатия, которую вы когда-либо используете, будет увеличивать размер ... некоторого ввода». В файловом формате 7zip есть словарь / заголовок файла / и т. Д., Но даже если 7zip использовал алгоритм, в котором не было ни одной из этих вещей, мы по-прежнему гарантируем, что некоторые (фактически большинство) входных данных будут иметь выходные данные, которые как-больше-или-больше, чем сами входы. Это основной факт теории информации, и он не имеет ничего общего с заголовками файлов.
BlueRaja - Дэнни Пфлугхофт
2
@Mehrdad Конечно: просто напишите алгоритм «сжатия», который всегда возвращает исходные данные. Там; сделанный. : P ... Кроме того, нет - любой алгоритм сжатия, который вообще является алгоритмом, будет иметь некоторые метаданные, даже если это всего один бит в начале файла, который указывает, сжат ли файл (0 == несжатый, 1 == сжатый). Если вы собираетесь изменить содержимое файла AT ALL , необходимо некоторое метаданные. И если вы изменяете содержимое, вы собираетесь увеличить некоторые входные данные.
allquixotic
1
Однако, если ваш вопрос звучит так: «Существует ли какой-либо алгоритм сжатия, который не увеличивает длину ввода сверх фиксированного количества метаданных», ответ таков: я не знаю, но это должно быть теоретически возможно сделать. Легко, на самом деле. Все , что вам нужно сделать , это разработать формат контейнера , который может либо содержать исходный файл, или поток сжатых данных. Затем, когда вы создаете архив, попробуйте сжать: если сжатый размер больше, чем вход, просто сохраните исходный вход и упакуйте ваши метаданные впереди. Размер файла увеличится, но если метаданные малы (продолжение)
allquixotic
2
@Mehrdad: «Есть ли какой-либо алгоритм сжатия (хотя и плохой), который не увеличивает длину какого-либо ввода? » - ответ - нет. Есть 2^(n+1)-1возможные сообщения размера N-биты или меньше. Наш алгоритм должен отобразить каждый из них на уникальный результат. Если хотя бы один из них сопоставлен со значением с меньшим количеством битов, другое значение обязательно должно быть сопоставлено со значением с большим количеством.
BlueRaja - Дэнни Пфлюгофт
7

Базовые алгоритмы сжатия, используемые в 7z, без потерь . Это означает, что вы можете многократно сжимать-распаковывать файл много раз. Кроме того, после каждой итерации файл останется точно таким же.

К сожалению, вы не можете ожидать, что алгоритм сжатия без потерь будет применяться много раз с всегда положительным результатом. Существует строгая граница, которую он не может перепрыгнуть. Грубо говоря, эта граница зависит от того, насколько близко входная последовательность объединяет случайные данные. Прежде всего, алгоритмы без потерь используются для сжатия файлов, передачи данных HTML в Интернете, резервного копирования и других операций, которые ожидают, что выходной файл будет распакован точно в тот же исходный входной файл.

В отличие от сжатия без потерь, вы всегда можете ожидать уменьшения размера файла после сжатия с помощью алгоритмов сжатия с потерями (или с потерями) . Недостатком является то, что вы не можете точно восстановить исходный файл после одной итерации сжатия-распаковки. Эти алгоритмы наиболее известны для передачи и хранения аудио / видео / изображений.

bzip2 , LZMA , LZMA2 и другие алгоритмы, используемые в формате 7z , без потерь . Поэтому будет предел, после которого он больше не сможет сжиматься. Кроме того, исполняемые образы (.exe) обычно представляют собой сильно сжатые файлы. 7zip, как и многие другие инструменты сжатия, встраивает некоторые метаданные, которые фактически могут увеличить размер выходного файла.

Дразнилка мозга: что, если бы у нас был алгоритм без потерь, который всегда может уменьшить размер файла?

В этом случае вы всегда увидите, что сжатый файл меньше входного файла. Смотрите комментарий ниже, почему это невозможно.

алексей
источник
5
Доказательство осквернением. Гипотеза: Предположим, что всегда можно сжать файл с алгоритмом без потерь. Шаг 1. Одиночное сжатие уменьшает размер выходного файла как минимум на один бит. Если так, то после ряда итераций мы получим файл, который имеет только два бита. Шаг 2 Следующая итерация создает файл размером 1 бит. Шаг 3 Но алгоритмы сжатия без потерь, что означает, что допустима только одна допустимая декомпрессия. Очевидно, что вы не можете восстановить 2 исходных бита из 1 сжатого бита - вам придется сделать предположение. Последний пункт нарушает гипотезу.
Алексей
Вы не можете гарантировать алгоритм, который уменьшает размер файла, но вы можете гарантировать алгоритм, который не увеличит размер, не применяя в этих случаях «сжатие». Однако для того, чтобы действительно не увеличить размер файла, вы должны указать это вне диапазона (например, в имени файла).
Jeteon
@jeteon Я не уверен, что ты пытаешься сказать.
Алексей
Я просто добавил, что, поскольку у вас всегда есть возможность не сжимать входные данные, у вас может быть программа сжатия, которая вообще не будет сжимать файл. По сути, если вы определите, что сжатая версия больше, чем несжатая, вы просто оставляете ее. Затем вам также придется как-то указать, что это так, не прибавляя к размеру вывода, чтобы декомпрессор знал, что файл не был сжат. Единственный способ сделать это без увеличения размера файла, это сделать что-то вроде изменения имени файла.
Jeteon
@jeteon О, я вижу. Да, имеет смысл.
Алексей
6

Если исходный исполняемый файл уже был сжат (или содержал сильно сжатые данные или несжимаемые данные), то сжатие его увеличит размер.

PhonicUK
источник
2

Большинство алгоритмов сжатия использовать Что называется таблица символов, поясню только peices файла он использует в качестве элементов он МОЖЕТ сжимают. Это, конечно, создает некоторые накладные расходы в файле, но обычно приводит к гораздо меньшему файлу.

В уже сжатых файлах он по-прежнему создает набор символов, но есть очень мало, что может уменьшить размер. В вашем случае таблица символов уже сжатого файла, вероятно, находится в районе 2 МБ или больше, если ей удалось выполнить некоторое сжатие.

Чад Харрисон
источник
0

Идея сжатия:

программное обеспечение для сжатия создает список файлов и удаляет дублирующийся контент.

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

fromnaboo
источник