PPMd
PPMd — это алгоритм сжатия данных без потерь, основанный на методе предсказания по частичному совпадению (Prediction by Partial Matching, PPM). Алгоритм относится к классу статистических методов сжатия, которые моделируют вероятность появления следующего символа в последовательности на основе анализа контекста — уже обработанной части данных. PPMd известен высокой степенью сжатия, особенно на текстовых данных, но требует значительных вычислительных ресурсов и оперативной памяти.
История
Метод PPM был впервые предложен Джоном Клири (John Cleary) и Иэном Виттеном (Ian Witten) в 1984 году. Идея заключалась в использовании контекстного моделирования для предсказания вероятности следующего символа. В 1990-х годах алгоритм был усовершенствован, и появились его варианты, такие как PPMa, PPMb, PPMc и PPMd. Последний, PPMd, был разработан Дмитрием Шкариным (Dmitry Shkarin) в 2002 году. Шкарин оптимизировал структуру данных и алгоритм обновления контекстов, что позволило значительно увеличить скорость сжатия и распаковки, а также улучшить степень сжатия по сравнению с предшественниками. PPMd стал популярным выбором для сжатия текстов, особенно в архиваторах, таких как RAR и 7-Zip.
Принцип работы
PPMd, как и другие PPM-алгоритмы, строит контекстную модель данных. Модель представляет собой дерево контекстов, где каждый узел соответствует определённой последовательности символов (контексту). Для каждого контекста хранится статистика встречаемости следующих за ним символов. При сжатии алгоритм последовательно обрабатывает символы входного потока. Для каждого символа он ищет наиболее длинный контекст, в котором этот символ уже встречался. Если такой контекст найден, вероятность символа вычисляется на основе статистики этого контекста. Если контекст не найден, алгоритм переходит к более короткому контексту (уменьшая порядок модели) и повторяет поиск. В случае, когда символ не встречался ни в одном контексте, используется escape-символ, который сигнализирует о переходе к контексту нулевого порядка (частота символов в целом по файлу). Вероятности, полученные из модели, передаются арифметическому кодеру, который генерирует выходной битовый поток.
Арифметическое кодирование
PPMd использует арифметическое кодирование для представления последовательности символов в виде одного числа из интервала [0, 1). Это позволяет кодировать символы с дробным числом битов, что близко к теоретическому пределу энтропии. Арифметический кодер в PPMd адаптирован для работы с PPM-моделью, что обеспечивает эффективное сжатие.
Параметры и настройки
PPMd имеет несколько ключевых параметров, влияющих на его работу:
- Порядок модели (Order): максимальная длина контекста, используемая для предсказания. Обычно варьируется от 2 до 16. Более высокий порядок позволяет лучше моделировать сложные зависимости, но требует больше памяти и времени. Для текстовых данных оптимальным считается порядок 6-8.
- Размер памяти (Memory): объём оперативной памяти, выделяемый для хранения контекстной модели. PPMd может использовать от нескольких мегабайт до нескольких гигабайт. Больший размер памяти позволяет хранить более детальную модель, что улучшает сжатие, но увеличивает потребление ресурсов.
- Метод обновления (Update method): определяет, как обновляется статистика контекстов после обработки каждого символа. PPMd использует метод «обновления по умолчанию» (default update), который добавляет новый символ в контекст и корректирует вероятности.
Применение
PPMd нашёл применение в различных областях, где требуется высокая степень сжатия без потерь:
- Архивация файлов: PPMd используется в архиваторах, таких как RAR (режим «PPMd»), 7-Zip (режим «PPMd»), а также в специализированных утилитах, например, в сжатии текстовых файлов в формате .ppmd.
- Сжатие текстов: алгоритм особенно эффективен для текстовых данных, таких как книги, статьи, исходные коды программ. Он может сжимать тексты на естественных языках (русском, английском) в 2-3 раза сильнее, чем стандартные алгоритмы вроде Deflate.
- Сжатие структурированных данных: PPMd хорошо работает с данными, имеющими повторяющиеся паттерны, например, с XML, JSON, HTML, а также с базами данных и логами.
- Сжатие в реальном времени: в некоторых реализациях PPMd может использоваться для сжатия потоковых данных, например, в системах телеметрии или передачи данных.
Сравнение с другими алгоритмами
PPMd обычно превосходит по степени сжатия такие алгоритмы, как Deflate (используемый в ZIP, gzip), LZMA (используемый в 7-Zip) и BWT (Burrows-Wheeler Transform, используемый в bzip2), особенно на текстовых данных. Однако он уступает им по скорости сжатия и распаковки, а также по требованиям к памяти. Например, для сжатия текстового файла размером 1 МБ PPMd может потребовать до 256 МБ оперативной памяти, в то время как Deflate обходится несколькими мегабайтами. С другой стороны, PPMd может сжимать тексты на 10-20% сильнее, чем LZMA, и на 30-40% сильнее, чем Deflate.
Реализации
PPMd реализован в нескольких библиотеках и программах:
- libppmd: библиотека на C, реализующая алгоритм PPMd. Используется в 7-Zip и других архиваторах.
- PPMd (в RAR): встроенная реализация в архиваторе WinRAR, доступная через опцию «PPMd» в настройках сжатия.
- PPMd (в 7-Zip): реализация в архиваторе 7-Zip, доступная в формате .7z при выборе метода «PPMd».
- PPMd (в bzip2): некоторые форки bzip2 включают поддержку PPMd.
- PPMd (в Python): библиотека
pyppmdпредоставляет интерфейс для сжатия и распаковки данных с использованием PPMd.
Критика
Основные недостатки PPMd связаны с его вычислительной сложностью и требованиями к памяти. Алгоритм может быть медленным на больших файлах, особенно при высоких порядках модели. Кроме того, PPMd чувствителен к типу данных: на бинарных данных (например, изображения, видео) его эффективность значительно ниже, чем на текстовых. Также алгоритм не поддерживает многопоточность в стандартных реализациях, что ограничивает его производительность на современных многоядерных процессорах.
Источники
- Cleary, J. G., & Witten, I. H. (1984). Data compression using adaptive coding and partial string matching. IEEE Transactions on Communications, 32(4), 396-402.
- Shkarin, D. (2002). PPM: One step to practicality. Proceedings of the Data Compression Conference (DCC), 202-211.
- Salomon, D. (2007). Data Compression: The Complete Reference (4th ed.). Springer.
- Sayood, K. (2017). Introduction to Data Compression (5th ed.). Morgan Kaufmann.
BFOmetr — база данных и аналитика по компаниям России.
На главную BFOmetr →