Как сжимать файлы и почему форматы ZIP экономят трафик

3

Если вы часто скачиваете программное обеспечение или передаете большие документы, вы наверняка сталкивались с файлами .zip. Это одно из тех цифровых удобств, которые работают настолько хорошо, что мы редко задумываемся о том, как они устроены. Основная идея проста: взять объемный файл, уменьшить его размер и быстрее передать через интернет. Или просто сэкономить место на жестком диске.

Но здесь есть небольшой парадокс. Как можно удалить часть данных, а затем волшебным образом восстановить их все позже без потери даже одного бита?

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

Сжатие файла: краткое руководство

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

Вот простой процесс.

1. Выберите целевые файлы

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

2. Используйте встроенные инструменты

Вероятно, у вас уже есть необходимое программное обеспечение.

В Windows процесс предельно прост. Щелкните правой кнопкой мыши по выбранным файлам. Перейдите в меню «Отправить» (Send to). Выберите «Сжатая ZIP-папка» (Compressed (zipped) folder). Windows сделает все остальное.

У пользователей Mac есть аналогичная быстрая команда. Щелкните правой кнопкой мыши (или Control+клик) по файлам. Выберите «Сжать» (Compress). Система автоматически создаст zip-архив.

Если ваша операционная система не поддерживает эту функцию или вам нужны расширенные возможности, потребуется стороннее программное обеспечение. Такие инструменты, как 7-Zip или WinRAR, предлагают более тонкий контроль над уровнями сжатия. Но для повседневного использования встроенных инструментов достаточно.

3. Создайте архив

Как только вы запускаете команду, программа начинает свою работу. Она сканирует файлы. Применяет выбранный алгоритм. Создает новый zip-файл в той же директории, что и оригиналы.

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

4. Работа с результатом

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

Имейте в виду компромиссы. Для документов, кода и текста сжатие практически без потерь. Вы получаете обратно ровно то, что положили. Для изображений и видео дело обстоит иначе. Некоторые методы сжатия ухудшают качество ради достижения меньшего размера. Это называется сжатием с потерями (lossy compression). Сжатие текста обычно происходит без потерь.

Как на самом деле работает сжатие файлов

Компьютерные файлы notoriously повторяются (характеризуются высокой степенью повторяемости). Они содержат одну и ту же информацию, идущую снова и снова. Программы для сжатия процветают на этой избыточности.

Вместо того чтобы записывать слово «the» триста раз, алгоритм сжатия записывает «the» один раз. Затем он создает указатель ссылки. Каждый последующий раз, когда он встречает «the», он ссылается на первый экземпляр. Это drastически уменьшает общее количество битов и байтов.

Чтобы понять это, давайте посмотрим на язык.

Рассмотрим инаугурационную речь Джона Ф. Кеннеди 1961 года. Знаменитая фраза:

«Ask not what your country can do for you — ask what you can do for your country.»

Давайте подсчитаем единицы. Цитата состоит из 17 слов. Она содержит 61 букву. Есть 16 пробелов. Один дефис. Одна точка. Если мы присвоим одну единицу памяти каждому символу, пробелу или знаку препинания, общий размер файла составит 79 единиц.

Теперь давайте найдем избыточность. Для простоты мы игнорируем регистр букв.

  • «ask» встречается дважды.
  • «what» встречается дважды.
  • «your» встречается дважды.
  • «country» встречается дважды.
  • «can» встречается дважды.
  • «do» встречается дважды.
  • «for» встречается дважды.
  • «you» встречается дважды.

Примерно половина фразы является избыточной. Девять уникальных слов — ask, not, what, your, country, can, do, for, you — содержат почти всю необходимую информацию. Чтобы восстановить вторую половину, алгоритм просто ссылается на слова в первой половине. Он заполняет пробелы и знаки препинания, используя простые правила.

В этом суть сжатия без потерь (lossless compression). Оно не удаляет информацию. Оно удаляет повторения.

Далее мы подробнее рассмотрим алгоритмы, которые ищут эти паттерны.

Скрытая цена сжатия словаря

Большинство инструментов сжатия используют вариации адаптивного словарного алгоритма LZ. Он назван в честь создателей Лемпеля и Зива, а часть «словарь» — это механизм каталогизации повторяющихся данных. Система организации этих записей не сложна. Это может быть простой нумерованный список.

Возьмите знаменитую фразу Кеннеди. Программа сжатия сканирует текст на наличие повторяющихся слов и присваивает им индексы. Затем она заменяет слова на присвоенные им номера.

Если словарь выглядит так:

  • ask
  • what
  • your
  • country
  • can
  • for
  • you

Фраза «Ask not what your country can do for you; ask what you can do for your country» преобразуется в код. Она становится:

1 not 2 3 4 5 6 7 8 — 1 2 8 5 6 7 3 4

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

Но насколько это на самом деле экономит место?

Числовая строка короче полной цитаты. Но есть нюанс. Вам необходимо хранить сам словарь вместе со сжатыми данными.

В реальных условиях расчет требований к файлам является запутанным. Для данного разбора предположим, что каждый символ и пробел равны одной единице памяти. Полная фраза занимает 79 единиц. Сжатое предложение использует 37 единиц. Словарь также занимает 37 единиц.

Общий размер файла составляет 74 единицы. Снижение минимально.

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

За пределами простого совпадения слов

Предыдущие шаги опирались на поиск полных, повторяющихся слов. Мы рассматривали текст как последовательность дискретных единиц. Алгоритму сжатия не важны слова. Важны паттерны.

Цель проста: уменьшить размер файла.

Для этого программное обеспечение ищет избыточность. Оно не спрашивает: «Это слово?». Оно спрашивает: «Встречалась ли мне эта последовательность раньше?». И оно безжалостно. Если паттерн встречается только один раз, он удаляется. Если более короткий паттерн встречается чаще, чем более длинный, то более длинный может быть разбит на части.

Это «адаптивное» ядро алгоритмов на базе LZ. Словарь эволюционирует. Он меняется. Он оптимизируется в реальном времени.

Как работает выбор паттернов

Возьмем знаменитую фразу Джона Кеннеди.

«Ask not what your country can do for you, ask not what you can do for your country.»

Человек видит слова. Компрессор видит символы.

Первой повторяющейся последовательностью может быть что-то крошечное. «t» за которым следует пробел. Оно появляется в словах «not» и «what». Программа фиксирует это. Записывает. Затем переходит дальше.

Почему? Потому что в этом коротком фрагменте «t » не повторяется достаточно часто, чтобы оправдать затраты на хранение собственного идентификатора в словаре. Оно перезаписывается или игнорируется.

Далее «ou» появляется в словах «your» и «country». Полезно? Возможно. В полной книге «ou» — это золотая жила. Здесь? Алгоритм находит что-то лучшее.

«your» и «country» появляются вместе как «your country». Повторяется дважды. Это более сильный сигнал, чем «ou». Запись словаря для «ou» отбрасывается. «your country» занимает ее место.

Но постойте.

Посмотрите на «can do for». За ним следуют «your» и «you». Последовательность «can do for you» повторяется.

Что эффективнее?
«your country» = 13 символов (включая пробел).
«can do for you» = 15 символов.

Алгоритм предпочитает более длинное совпадение, если оно экономит больше бит на каждом экземпляре. Но «can do for you» включает «you», тогда как «your country» включает «your».

Если программа приоритизирует максимальную замену символов, она может разбить «your country» на части. Она оставляет «r country» как суффикс и создает основную запись для «can do for you». Это позволяет компрессору ссылаться на основную часть фразы одним кодом, обрабатывая небольшую вариацию («your» против «you») с помощью вторичных ссылок.

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

Коэффициент сжатия

Используя наши выведенные паттерны:

  • ask__
  • what__
  • you
  • r__country
  • cando__for__you

Исходное предложение превращается в серию указателей:

1 not__ 2 3 4 5 __ — __ 1 2 3 5 4

Использование памяти меняется кардинально.

Исходный текст: 79 единиц.
Сжатые данные: 18 единиц.
Накладные расходы словаря: 41 единица.
Итого: 59 единиц.

Мы сэкономили 20 единиц. Это примерно 25% сокращение. Немало для нескольких строк речи. И это не обязательно самый эффективный возможный результат. Вы, вероятно, могли бы найти более плотную компоновку. Но суть в том, что поиск правильных паттернов важнее, чем поиск любых паттернов.

Почему текст сжимается лучше, чем графика

Так почему одни файлы уменьшаются на 50% и более, а другие едва меняются?

Избыточность.

Естественные языки обладают высокой избыточностью. Буквы группируются определенным образом. «Th», «ing», «tion». Слова повторяются постоянно. Текстовые файлы плотны этими предсказуемыми структурами. Компрессоры процветают здесь.

Программный код аналогичен. Ограниченный набор ключевых слов и команд повторяется бесконечно. if, while, return. Паттерны жесткие. Сжатие работает хорошо.

Графика? Аудио?

Не совсем.

Изображение или файл MP3 содержат уникальные данные. У каждого пикселя есть конкретное значение. Каждый аудиосэмпл уникален. Повторяющихся последовательностей мало. Энтропия высока. Алгоритм не может найти достаточно перекрывающихся паттернов для создания полезного словаря.

Именно поэтому без потерь (lossless) сжатие не работает для медиафайлов. Нужны другие техники. Подробнее об этом позже.

Размер файла и выбор алгоритма

Улучшается ли сжатие с увеличением размера файлов?

В целом, да.

Если бы мы сжали всю речь Кеннеди, экономия была бы большей. Почему? Потому что одни и те же паттерны повторяются чаще. Записи словаря используются тысячи раз. Накладные расходы на словарь становятся незначительными по сравнению с экономией.

Маленькие файлы? Накладные расходы на словарь съедают прибыль.

Выбор алгоритма также играет огромную роль.

Не все варианты LZ созданы равными. Некоторые настроены для текста. Некоторые для данных. Некоторые используют иерархические словари — словари внутри словарей — для выявления сложных, вложенных паттернов в больших файлах. Они могут «заикаться» на небольших входных данных.

Программисты постоянно настраивают эти системы. Цель всегда одна: лучшие коэффициенты сжатия, более высокая скорость. Но универсального решения не существует.

Лучший компрессор для вашего текста может быть худшим для вашей базы данных.

Речь идет о сжатии без потерь. Это единственный способ гарантировать, что вы получите исходный файл обратно. Каждый бит остается нетронутым. Вы разбиваете файл на более мелкие части для хранения или передачи, а затем собираете его обратно в точности таким, каким он был. Данные не теряются.

Сжатие с потерями идет другим путем. Оно не пытается сохранить всё. Вместо этого оно отбрасывает «ненужную» информацию. Цель проста: уменьшить размер файла. Вы встретите его повсюду. Это стандарт для растровых изображений.

Растровые изображения раздуты. Они занимают много места. Отсканированная фотография — идеальный пример.

Алгоритмы сжатия без потерь здесь терпят неудачу. Да, большие участки выглядят идентично. Небо синее. Но если присмотреться, каждый пиксель немного отличается. Значения цвета меняются. Чтобы уменьшить размер файла без потери разрешения, нужно изменить эти значения.

Программа выбирает один оттенок синего. Она присваивает это единственное значение каждому пикселю в небе. Она переписывает файл, чтобы он ссылался на эту ссылку. Результат? Размер файла значительно уменьшается. Вы не заметите разницы.

Но есть подвох. Вы никогда не сможете получить исходный файл обратно.

Как только вы сожмете его, вы остаетесь с интерпретацией реальности, предложенной программой сжатия. Исходные данные исчезают. Вы не можете использовать сжатие с потерями для вещей, требующих точного воспроизведения. Программные приложения? Нет. Базы данных? Нет. Инаугурационные речи президента? Категорически нет.

«При сжатии с потерями вы не можете получить исходный файл обратно после его сжатия. Вы остаетесь с переосмыслением оригинала программой сжатия.»

Мы обновили эту статью с использованием технологий искусственного интеллекта, а затем убедились, что она проверена фактам и отредактирована редактором HowStuffWorks.

Часто задаваемые вопросы о сжатии файлов

Что делает сжатие файла?
Оно уменьшает размер файла. Меньшие файлы означают более быструю передачу. Вы отправляете и получаете данные быстрее.

Каковы основные типы схем сжатия файлов?
Их два. Сжатие без потерь и с потерями. Сжатие без потерь разбивает файл и восстанавливает его позже. Сжатие с потерями удаляет биты. Оно навсегда уменьшает размер файла. Вы не можете обратить сжатие с потерями.

Какое сжатие используют zip-файлы?
Zip-файлы полагаются на сжатие данных без потерь. Они обрабатывают несколько каталогов. Они используют такие алгоритмы, как DEFLATE. Данные выходят точно такими же, какими и входили.

Уменьшает ли сжатие файлов качество?
Да. После сжатия изображения на компьютере или в камере качество часто страдает. Резкость падает. Контрастность исчезает. Мелкие детали цвета исчезают. Изображение выглядит хуже. Это компромисс.