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

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). Последовательность операций:

  1. Преобразование Барроуза — Уилера — переставляет символы входной строки так, чтобы одинаковые символы группировались вместе. Это делает данные более предсказуемыми для последующего сжатия.
  2. Move-To-Front (MTF) — кодирует повторяющиеся символы малыми числами, что улучшает эффективность следующего этапа.
  3. Run-Length Encoding (RLE) — упаковывает последовательности одинаковых символов.
  4. Энтропийное кодирование — сжатие с помощью комбинированного алгоритма Хаффмана и арифметического кодирования (начиная с версии 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.
Заметили ошибку или не согласны с информацией в статье? Напишите нам support@bfometr.ru