Почему Zip способен сжимать отдельные файлы лучше, чем несколько файлов с одинаковым содержимым?
Возможность сжимать наши файлы так, чтобы им было легче делиться и / или транспортировать их, может значительно упростить нашу электронную жизнь, но иногда мы можем увидеть странные или неожиданные результаты определения размеров после того, как мы сжимаем их. Это почему? В сегодняшнем посте SuperUser Q & A есть ответы на запутанные вопросы читателя..
Сегодняшняя сессия вопросов и ответов пришла к нам благодаря SuperUser - подразделению Stack Exchange, группе веб-сайтов вопросов и ответов, управляемой сообществом..
Фото любезно предоставлено Жан-Этьеном Мин-Дюи Пуаррьером (Flickr).
Вопрос
SuperUser Reader SixtyFootersdude хочет знать, почему Zip способен сжимать отдельные файлы лучше, чем несколько файлов с одинаковым типом содержимого:
Предположим, у меня есть 10000 XML-файлов и я хочу отправить их другу. Перед отправкой я бы хотел их сжать.
Способ 1: не сжимайте их
Результаты:
Метод 2: Zip каждый файл отдельно и отправьте ему 10000 сжатых файлов XML
Команда:
Результаты:
Способ 3: создать один Zip-файл, содержащий все 10000 XML-файлов
Команда:
Результаты:
Способ 4: объединить файлы в один файл и заархивировать его
Команда:
Результаты:
Вопросы
- Почему я получаю такие значительно лучшие результаты, когда просто архивирую один файл?
- Я ожидал получить радикально лучшие результаты, используя метод 3, а не метод 2, но у меня нет. Почему это?
- Это поведение специфично для почтового индекса? Если бы я попытался использовать Gzip, я получил бы другие результаты?
Дополнительная информация
Метаданные
Один из приведенных ответов предполагает, что различие заключается в системных метаданных, которые хранятся в zip-файле. Я не верю, что это может быть так. Чтобы проверить это, я сделал следующее:
Полученный zip-файл имеет размер 1,4 МБ. Это означает, что все еще остается приблизительно десять МБ необъяснимого пространства.
Почему zip способен сжимать отдельные файлы лучше, чем несколько файлов с одинаковым типом содержимого?
Ответ
Авторы SuperUser Алан Шутко и Аганью имеют ответ для нас. Прежде всего, Алан Шутко:
Сжатие Zip основано на повторяющихся шаблонах в сжимаемых данных, и сжатие тем лучше, чем дольше файл, так как можно найти и использовать все больше и больше шаблонов.
Упрощенно, если вы сжимаете один файл, словарь, который отображает (короткие) коды в (более длинные) шаблоны, обязательно содержится в каждом результирующем zip-файле; если вы заархивируете один длинный файл, словарь будет «повторно использован» и станет еще более эффективным для всего контента.
Если ваши файлы даже немного похожи (как текст всегда), повторное использование «словаря» становится очень эффективным, и в результате получается гораздо меньший общий ZIP-файл.
Далее следует ответ Аганью:
В zip каждый файл сжимается отдельно. Противоположность сплошное сжатие, то есть файлы сжимаются вместе. 7-zip и Rar по умолчанию используют сплошное сжатие. Gzip и Bzip2 не могут сжимать несколько файлов, поэтому сначала используется Tar, который имеет тот же эффект, что и сплошное сжатие.
Поскольку XML-файлы имеют схожую структуру (и, вероятно, схожий контент), если файлы сжимаются вместе, то сжатие будет выше.
Например, если файл содержит строку «
”И компрессор уже обнаружил эту строку в другом файле, он заменит ее небольшим указателем на предыдущее совпадение. Если компрессор не использует сплошное сжатие, первое вхождение строки в файле будет записано как буквальный, который больше.
Есть что добавить к объяснению? Отключить звук в комментариях. Хотите узнать больше ответов от других технически подкованных пользователей Stack Exchange? Ознакомьтесь с полным обсуждением здесь.