Открыть сервис

LZMA

LZMA (от англ. Lempel-Ziv-Markov chain algorithm) — это алгоритм сжатия данных без потерь, разработанный Игорем Павловым и впервые опубликованный в 1998 году. Алгоритм лежит в основе формата архивов 7z, используемого архиватором 7-Zip. LZMA характеризуется высокой степенью сжатия, сравнимой с лучшими арифметическими кодировщиками, при относительно умеренных требованиях к оперативной памяти для декомпрессии.

История

Разработка LZMA началась в конце 1990-х годов российским программистом Игорем Павловым. Первая реализация была включена в состав архиватора 7-Zip (версия 2.30 Beta, 1999 год). Алгоритм был создан как альтернатива распространённым на тот момент методам сжатия, таким как Deflate (используется в ZIP и gzip) и BZip2. Целью было достижение максимально возможной степени сжатия для широкого спектра типов данных, особенно для исполняемых файлов и текстов.

В 2001 году исходный код LZMA был опубликован под лицензией LGPL, что способствовало его широкому распространению. В 2007 году алгоритм был включён в стандарт 7z (формат архива). Позднее, в 2009 году, была выпущена модификация LZMA2, которая улучшила поддержку многопоточности и добавила возможность сжатия данных с переменным размером словаря.

Принцип работы

LZMA является гибридным алгоритмом, сочетающим два основных подхода:

Ключевой элемент — арифметическое кодирование (точнее, его вариант — интервальное кодирование), которое используется для финального сжатия битового потока. В отличие от алгоритма Хаффмана, арифметическое кодирование позволяет кодировать символы с дробным количеством бит, что даёт выигрыш в степени сжатия на 5–10 % для случайных данных.

Схема работы

  1. Поиск совпадений: Алгоритм просматривает входной поток байтов и ищет в скользящем окне (словаре) максимально длинные последовательности, совпадающие с текущей позицией.
  2. Кодирование совпадений: Для каждого найденного совпадения кодируются три параметра:
  1. Моделирование контекста: Для кодирования расстояний и длин используется цепь Маркова. Вероятность появления конкретного значения зависит от предыдущих кодированных значений (контекста). Например, если недавно встречались короткие совпадения, вероятность появления длинного совпадения снижается.
  2. Арифметическое кодирование: Вероятностные оценки из марковской модели подаются на вход арифметического кодера, который генерирует выходной битовый поток.

Характеристики

Параметры сжатия

Основные параметры, влияющие на работу LZMA:

Сравнение с другими алгоритмами

АлгоритмСтепень сжатия (типичная)Скорость сжатияСкорость распаковкиТребования к памяти (сжатие)
LZMAВысокая (на 10–20 % лучше Deflate)НизкаяСредняяВысокие (до 1 ГБ)
Deflate (ZIP)СредняяВысокаяВысокаяНизкие (до 64 КБ)
BZip2Выше Deflate, ниже LZMAСредняяСредняяСредние (до 256 КБ)
LZMA2Выше LZMA (за счёт многопоточности)СредняяСредняяВысокие (до 1 ГБ)

Применение

LZMA широко используется в различных областях:

LZMA2

LZMA2 — это улучшенная версия алгоритма, выпущенная в 2009 году. Основные отличия:

LZMA2 является стандартом по умолчанию для формата 7z в архиваторе 7-Zip начиная с версии 9.04.

Критика и ограничения

Интересные факты

Источники

BFOmetr — база данных и аналитика по компаниям России.

На главную BFOmetr →