Домашняя » как » Почему Zip способен сжимать отдельные файлы лучше, чем несколько файлов с одинаковым содержимым?

    Почему 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? Ознакомьтесь с полным обсуждением здесь.