BZip2
bzip2 — это свободная утилита для сжатия данных, работающая в командной строке, и одноимённый формат сжатия, основанный на алгоритме Барроуза — Уилера (Burrows–Wheeler transform). Отличается более высокой степенью сжатия по сравнению с традиционными методами (например, gzip и deflate), но за счёт более медленной работы. Широко применяется для сжатия файлов в операционных системах на базе Unix и Linux, а также в составе архиваторов высокого уровня и для распространения исходных кодов программного обеспечения.
История
Разработка bzip2 началась как продолжение проекта bzip, созданного Джулианом Сьюардом (Julian Seward) в 1996 году. Первая публичная версия bzip2 (0.1) была выпущена в июне 1996 года, а стабильная версия 1.0 — в 2000 году. Изначально bzip использовал сжатие на основе алгоритма LZW, но вскоре был заменён на преобразование Барроуза — Уилера (BWT) с марковским кодированием (MTF), что дало существенный выигрыш.
С 2000 года bzip2 стал стандартным средством сжатия во многих дистрибутивах Linux и BSD. Инструмент вошёл в состав GNU project, хотя и не являлся частью ядра GNU. В 2008 году вышла версия 1.0.5 с рядом исправлений и оптимизаций. Активная разработка вела́сь до 2019 года; после этого проект поддерживался сообществом через патчи.
С 2000-х годов bzip2 постепенно вытесняется более современными алгоритмами (например, xz, zstd), однако остаётся популярным для задач, где важна совместимость с историческими данными или архивами.
Алгоритм сжатия
В отличие от gzip, использующего алгоритм Deflate (LZ77 + Хаффман), bzip2 основан на преобразовании Барроуза — Уилера (BWT). Последовательность операций:
- Преобразование Барроуза — Уилера — переставляет символы входной строки так, чтобы одинаковые символы группировались вместе. Это делает данные более предсказуемыми для последующего сжатия.
- Move-To-Front (MTF) — кодирует повторяющиеся символы малыми числами, что улучшает эффективность следующего этапа.
- Run-Length Encoding (RLE) — упаковывает последовательности одинаковых символов.
- Энтропийное кодирование — сжатие с помощью комбинированного алгоритма Хаффмана и арифметического кодирования (начиная с версии 1.0.2 — только Хаффман).
Основное преимущество BWT+MTF — высокая степень сжатия для текстовых данных, особенно для естественных языков и кода. Однако процесс требует значительных вычислительных ресурсов (как CPU, так и памяти) по сравнению с gzip.
Программная реализация
Утилита bzip2 работает в командной строке и предоставляет следующие ключевые опции:
-c— вывод сжатых данных в стандартный поток вывода (stdout);-d— распаковка (декомпрессия);-k— сохранить исходный файл (по умолчанию заменяется на сжатый);-v— подробный вывод (verbose);-1..-9— уровень сжатия (от быстрого/слабого до медленного/сильного);-s— использование меньшего объёма оперативной памяти за счёт снижения степени сжатия.
Файлы, сжатые bzip2, обычно имеют расширение .bz2. Утилита может работать как фильтр (через stdin/stdout), что позволяет объединять её с другими инструментами (например, tar, gzip).
Применение
Архивация
bzip2 чаще всего применяется для сжатия файлов перед длительным хранением или передачей по сети. В связке с tar (команда tar -c -I bzip2 -f archive.tar.bz2) создаются архивы .tar.bz2, которые до недавнего времени были распространены в Linux.
Распространение программного обеспечения
До появления форматов .tar.xz и .deb/.rpm с встроенным сжатием, многие проекты поставляли исходные коды в архивах .tar.bz2 — например, ядро Linux, GCC, Python. До сих пор ряд старых репозиториев или зеркал содержат такие архивы.
Обработка логов
Из-за высокой степени сжатия текста bzip2 иногда используется для сжатия журналов (логов) в серверных дистрибутивах — например, утилита logrotate может сжимать старые логи с помощью bzip2.
Сравнение с другими алгоритмами
| Алгоритм | Степень сжатия | Скорость сжатия | Скорость распаковки | Потребление памяти |
|---|---|---|---|---|
| gzip (Deflate) | Средняя | Высокая | Высокая | Малое |
| bzip2 | Высокая | Средняя | Средняя | Среднее |
| xz (LZMA2) | Очень высокая | Низкая | Средняя | Большое |
| zstd | Высокая | Очень высокая | Высокая | Среднее |
Bzip2 обычно обеспечивает степень сжатия на 15–25 % лучше gzip, но уступает 10–20 % xz. Скорость распаковки bzip2 в 2–3 раза ниже, чем у gzip, и в 1,5–2 раза выше, чем у xz. Потребление памяти при сжатии составляет около 4,5 МБ для стандартного (200-килобайтного) блока, при распаковке — около 3 МБ.
Критика
- Скорость: Bzip2 существенно медленнее при распаковке, чем современные алгоритмы (zstd, lz4), что делает его непригодным для задач, где требуется быстрая декомпрессия (например, для потоковой передачи данных).
- Обновление формата: Формат bzip2 статичен (с версии 1.0.2 не изменялся) и не поддерживает многопоточность, не позволяет сжимать большие файлы с параллельной обработкой без внешних костылей (например, pbzip2).
- Конкуренция: Современные алгоритмы (zstd, Brotli) превосходят bzip2 по скорости на 2–3 порядка при сопоставимой степени сжатия.
- Отсутствие целостности: В стандартном bzip2 нет встроенной проверки целостности архива (CRC32 опционален). Это может привести к незаметному повреждению данных.
Несмотря на критику, bzip2 остаётся одним из самых надёжных и распространённых инструментов для сжатия текстовых данных, особенно в унаследованных системах и для длительного хранения.
Лицензия и распространение
bzip2 распространяется на условиях лицензии BSD (BSD-2-Clause), что позволяет свободное использование, модификацию и распространение как в свободном, так и в проприетарном ПО. Исходный код доступен на официальном сайте проекта и в репозиториях большинства дистрибутивов Linux.
Интересные факты
- Название bzip2 восходит к сокращению от “Burrows-Wheeler zip” и цифры 2, указывающей на вторую версию алгоритма (первая версия, bzip, использовала LZW).
- Алгоритм bzip2 лежит в основе сжатия в архиваторах 7z (в режиме BZip2) и RAR (в версии 4.0+).
- Существует многопоточная версия pbzip2, позволяющая распараллеливать сжатие на многоядерных процессорах, но не меняющая сам формат.
- Bzip2 активно использовался в проекте SETI@home для сжатия передаваемых данных.
Источники
- Julian Seward. bzip2: a program and library for data compression. 1996–2019.
- Debian/Ubuntu man-страница bzip2 (версии 1.0.8).
- Статья “Comparison of compression algorithms” на сайте lz77.info.
- Исходный код bzip2 (репозиторий на sourceware.org).
- Handbook of Data Compression / David Salomon, Giovanni Motta. 5th ed., Springer, 2010.
BFOmetr — база данных и аналитика по компаниям России.
На главную BFOmetr →