libppmd
libppmd — это программная библиотека на языке C, реализующая алгоритмы сжатия данных на основе контекстного моделирования с предсказанием по частичному совпадению (PPM — Prediction by Partial Matching). Библиотека предоставляет функции для сжатия и распаковки данных с использованием метода PPMd, разработанного российским программистом Дмитрием Шкариным. libppmd применяется в основном в составе архиваторов и программ для работы со сжатыми данными, где требуется высокая степень сжатия текстовой и слабоструктурированной информации.
История
Алгоритмы семейства PPM были разработаны в 1980-х годах как развитие идей энтропийного кодирования и контекстного моделирования. В 1990-х годах Дмитрий Шкарин создал одну из наиболее эффективных реализаций — PPMd, которая легла в основу многих архиваторов, включая RAR и 7-Zip. Библиотека libppmd была выделена из исходного кода архиватора RAR (разработчик — компания Eugene Roshal) для использования в сторонних проектах. Она представляет собой стабильную, независимую реализацию алгоритма PPMd, оптимизированную для встраивания в различное программное обеспечение.
Первые версии libppmd появились в начале 2000-х годов. Библиотека распространяется под лицензией, совместимой с GNU LGPL, что позволяет использовать её как в открытых, так и в коммерческих проектах. Впоследствии libppmd была включена в состав многих открытых проектов, таких как файловый менеджер Far Manager, а также в библиотеки сжатия, используемые в операционных системах семейства Linux.
Алгоритм работы
Основы PPM-моделирования
Алгоритм PPM основан на предсказании следующего символа в последовательности на основе контекста — фиксированного числа предыдущих символов (порядка модели). Модель хранит статистику встречаемости символов для каждого возможного контекста. При сжатии алгоритм выбирает наиболее вероятный символ и кодирует его с помощью арифметического кодирования. Если символ не встречался в данном контексте, происходит переход к контексту меньшего порядка (механизм «escape»). В случае, когда символ не найден ни в одном контексте, используется контекст нулевого порядка, где все символы считаются равновероятными.
Особенности реализации PPMd
Реализация PPMd, используемая в libppmd, включает несколько ключевых оптимизаций:
- Адаптивное обновление модели: после кодирования каждого символа статистика модели обновляется, что позволяет адаптироваться к изменяющимся характеристикам данных.
- Управление памятью: библиотека использует динамическое выделение памяти для хранения контекстной модели, что позволяет обрабатывать данные произвольного размера без фиксированных ограничений.
- Оптимизация escape-механизма: применяется метод «метод PPMd» (вариант PPM с методом escape, основанным на оценке вероятности появления новых символов), что повышает точность предсказания.
Параметры сжатия
libppmd позволяет задавать несколько параметров, влияющих на эффективность и скорость сжатия:
- Порядок модели (Order): от 2 до 16 (обычно 6-8 для текстов). Более высокий порядок увеличивает степень сжатия, но требует больше памяти и времени.
- Размер памяти (Memory): от 1 МБ до 256 МБ. Больший объём памяти позволяет хранить более детальную модель, что улучшает сжатие на больших объёмах данных.
- Режим сжатия: может быть выбран один из нескольких режимов, оптимизированных для разных типов данных (текст, исполняемые файлы, изображения).
Применение
В архиваторах
Основное применение libppmd — в составе архиваторов, где она используется как один из методов сжатия. Наиболее известные программы, использующие libppmd:
- RAR (разработчик — Eugene Roshal) — использует PPMd как один из алгоритмов сжатия для текстовых и слабоструктурированных данных.
- 7-Zip (разработчик — Игорь Павлов) — поддерживает PPMd через реализацию libppmd, доступную в составе пакета LZMA SDK.
- WinRAR (разработчик — компания Eugene Roshal) — включает PPMd как опциональный метод сжатия для пользовательских профилей.
В программном обеспечении для обработки данных
Библиотека используется в проектах, требующих эффективного сжатия текстовой информации:
- Файловые менеджеры (Far Manager, Total Commander) — для сжатия и распаковки архивов.
- Системы резервного копирования — для уменьшения объёма хранимых данных.
- Научные и инженерные приложения — для сжатия больших текстовых массивов (логи, дампы, результаты моделирования).
В операционных системах
libppmd входит в состав многих дистрибутивов Linux как часть пакетов, обеспечивающих поддержку архивов RAR и 7-Zip. В Windows библиотека может быть включена в состав сторонних утилит или использоваться через интерфейс DLL.
Сравнение с другими методами сжатия
Преимущества
- Высокая степень сжатия текстовых данных: на типичных текстовых файлах (например, HTML, XML, исходные коды) PPMd часто превосходит алгоритмы LZ77 (Deflate, LZMA) на 10-30% по степени сжатия.
- Адаптивность: алгоритм быстро подстраивается под структуру данных, что позволяет эффективно сжимать смешанные потоки.
- Открытость реализации: libppmd распространяется с открытым исходным кодом, что позволяет использовать её в любых проектах без лицензионных ограничений.
Недостатки
- Высокое потребление памяти: для достижения высокой степени сжатия требуется значительный объём оперативной памяти (до 256 МБ и более).
- Низкая скорость сжатия: по сравнению с алгоритмами LZ77, PPMd работает медленнее, особенно на больших файлах.
- Чувствительность к типу данных: на бинарных данных (исполняемые файлы, мультимедиа) эффективность PPMd значительно ниже, чем у специализированных алгоритмов (например, LZMA или BWT).
Технические детали
Интерфейс библиотеки
libppmd предоставляет простой API на языке C, включающий функции:
PPMd_Compress()— сжатие блока данных.PPMd_Decompress()— распаковка блока данных.PPMd_Init()— инициализация модели с заданными параметрами.PPMd_Free()— освобождение выделенной памяти.
Данные передаются в виде буферов, что позволяет использовать библиотеку в потоковых приложениях.
Формат сжатых данных
libppmd не определяет собственный формат архива. Она используется как часть более крупных систем, где сжатые данные упаковываются в контейнеры (например, RAR, 7z). Внутри контейнера данные могут быть разделены на блоки, каждый из которых сжимается независимо, что позволяет реализовать произвольный доступ к частям архива.
Интересные факты
- Алгоритм PPMd был разработан Дмитрием Шкариным в 1998 году и первоначально использовался в архиваторе RAR версии 2.0.
- libppmd является одной из немногих библиотек, реализующих PPM-сжатие на языке C с открытым исходным кодом.
- В тестах на сжатие текстовых файлов (например, корпус Calgary Corpus) PPMd показывает результаты, сопоставимые с современными нейросетевыми методами сжатия, но при значительно меньших вычислительных затратах.
- Библиотека используется в проекте «libarchive» — популярной кроссплатформенной библиотеке для работы с архивами.
Источники
- Документация к библиотеке libppmd (исходный код, файл README).
- Описание алгоритма PPMd в книге: Salomon D. Data Compression: The Complete Reference. — Springer, 2007.
- Исходный код архиватора RAR (версия 2.0 и выше) — комментарии к реализации PPMd.
- Техническая документация к LZMA SDK (раздел о методах сжатия).
- Статья «PPM Compression» на сайте «Data Compression Reference».
BFOmetr — база данных и аналитика по компаниям России.
На главную BFOmetr →