Принцип работы сжатия данных
Любой файл на компьютере состоит из последовательности байтов. В обычном тексте, несжатых картинках или таблицах одни и те же цепочки символов повторяются постоянно. Архиватор находит эти повторы и заменяет их короткими ссылками либо специальными кодовыми словами.
Для работы с файлами на компьютере применяют сжатие без потерь. Это строгий метод кодирования, при котором после распаковки файл восстанавливается бит в бит до первоначального состояния. Программа ничего не выбрасывает и не упрощает, в отличие от алгоритмов сжатия музыки или видео в интернете.
Большинство современных архиваторов опираются на два базовых алгоритма, разработанных математиками ещё во второй половине двадцатого века. Первый алгоритм создали израильские учёные Авраам Лемпель и Якоб Зив в 1977 году, назвав его LZ77. Второй алгоритм придумал американский исследователь Дэвид Хаффман в 1952 году.
Словарный метод LZ77
Алгоритм LZ77 использует скользящее окно памяти. Программа читает поток данных слева направо и проверяет, встречалась ли текущая последовательность байтов раньше. Если архиватор видит знакомую цепочку, он записывает вместо неё пару чисел. Первое число показывает, на сколько знаков нужно отступить назад, а второе число указывает длину повторяющегося фрагмента.
Кодирование по частоте Хаффмана
В обычной кодировке каждый символ текста весит одинаково, чаще всего один или два байта. Буква «о» в русском языке встречается на каждой строчке, а буква «ф» попадается крайне редко, но места в памяти они занимают поровну. Алгоритм Хаффмана подсчитывает частоту появления каждого знака во всём файле. Самым частым буквам алгоритм назначает короткие битовые цепочки из двух-трёх бит, а редким буквам выдаёт длинные цепочки. За счёт частых символов суммарный объём файла ощутимо сокращается.
Степень сжатия и почему разные файлы сжимаются по-разному
Эффективность работы программы оценивают через степень сжатия. Это отношение объёма упакованного архива к исходному размеру файлов, выраженное в процентах или коэффициентах. Если папка объёмом 100 мегабайт сжалась в архив размером 25 мегабайт, коэффициент сжатия составил четыре к одному, а размер архива составил 25% от оригинала.
Результат упаковки зависит от внутренней структуры файла. Чем больше в нём предсказуемых повторов и пустот, тем сильнее уменьшается архив.
- Текстовые документы форматов TXT, CSV, HTML и файлы исходного кода программ сжимаются великолепно, уменьшаясь в три или четыре раза благодаря частым словам и пробелам.
- Базы данных и несжатые растровые изображения формата BMP уменьшаются в пять-десять раз, поскольку содержат огромные массивы одинаковых пикселей и нулей.
- Исполняемые файлы программ EXE и динамические библиотеки DLL сжимаются средне, обычно экономя от 30% до 50% объёма.
- Архивы, фотографии JPEG, видеоролики MP4 и музыка MP3 почти не уменьшаются в размерах при повторном архивировании.
Сравнение популярных форматов архивов
Сегодня для повседневных задач используют три главных формата. Они отличаются скоростью работы, степенью уплотнения информации и совместимостью с различными операционными системами.
Формат ZIP
Формат ZIP создал программист Фил Кац в 1989 году. Это главный мировой стандарт сжатия, понимаемый любой системой без установки сторонних программ. Windows, macOS, Android и дистрибутивы Linux умеют открывать ZIP-папки встроенными средствами. Формат сжимает каждый файл внутри архива отдельно, поэтому повреждение одного документа не мешает распаковать остальные. Степень уплотнения у ZIP средняя, зато скорость упаковки и распаковки остаётся высокой.
Формат RAR
Формат RAR разработал российский программист Евгений Рошал в 1993 году. Название расшифровывается как Roshal Archive. Формат сжимает данные плотнее классического ZIP благодаря продвинутым алгоритмам и умению склеивать множество мелких файлов в непрерывный поток данных. RAR поддерживает разделение архива на тома нужного размера и позволяет добавлять информацию для восстановления, которая спасает архив при повреждении битов на флешке или диске.
Формат 7z
Формат 7z появился в 1999 году вместе с бесплатной программой с открытым исходным кодом 7-Zip, созданной программистом Игорем Павловым. В основе формата лежит алгоритм LZMA. Формат 7z обеспечивает максимальное сжатие среди популярных программ, превосходя ZIP и нередко обгоняя RAR на больших массивах исходного кода и однотипных документов. Программа требует больше оперативной памяти при максимальных настройках, но распространяется полностью свободно.
Частые вопросы
Зачем упаковывать файлы в архив, если они почти не сжимаются?
Архиваторы выполняют две задачи: сжатие и объединение. Если нужно отправить по почте папку с сотней фотографий, архиватор соберёт их в один компактный контейнер без сжатия. Пересылать и скачивать один цельный файл гораздо удобнее, чем загружать сотню картинок по отдельности.
Можно ли сжать файл несколько раз подряд для уменьшения размера?
Второй проход архиватором не уменьшит размер. Первый архив уже убрал все явные закономерности и повторы, превратив данные в поток псевдослучайных байтов. Повторная упаковка оставит размер прежним либо добавит лишние служебные байты заголовков.
Что такое самораспаковывающийся архив?
Это файл с расширением EXE, внутри которого упакованы файлы вместе с маленькой встроенной программой-распаковщиком. Получатель может открыть такой архив двойным кликом на компьютере без установленных программ вроде WinRAR или 7-Zip.
Безопасно ли ставить пароль на архив?
Современные архиваторы поддерживают надёжное шифрование по стандарту AES с ключом 256 бит. Если придумать сложный пароль из букв, цифр и знаков, вскрыть такой архив перебором за разумное время практически невозможно.