bzip2

Материал из Википедии — свободной энциклопедии
Перейти к: навигация, поиск
bzip2

Bzip2-logo.png

Расширение

.bz2

MIME-тип

application/x-bzip

Сигнатура

BZh

Последний выпуск

1.0.6 (20 сентября 2010)

Тип формата

Сжатие данных

Открытый формат?

Да: Лицензия BSD

Сайт

bzip.org

bzip2
Bzip2-logo.png
Тип

Сжатие данных

Операционная система

Кроссплатформенное ПО

Последняя версия

1.0.6 (20 сентября 2010)

Лицензия

Лицензия BSD[1]

Сайт

bzip.org

bzip2 — бесплатная свободная утилита командной строки с открытым исходным кодом для сжатия данных, реализация алгоритма Барроуза — Уилера.

Разработана и впервые опубликована Джулианом Сюардом (англ. Julian Seward) в июле 1996 года (версия 0.15). Стабильность и популярность компрессора росли в течение нескольких лет, и версия 1.0 была опубликована в конце 2000 года.

Эффективность[править | править вики-текст]

В соответствии с традициями UNIX, bzip2 единовременно может выполнять только одну операцию: либо сжатие, либо распаковку и только для одного файла. При сжатии bzip2 добавляет к имени файла расширение «.bz2». Для упаковки нескольких файлов их сперва архивируют в один файл утилитой tar, а затем сжимают при помощи bzip2. Такие архивы обычно имеют расширение «.tar.bz2».

bzip2 сжимает большинство файлов эффективнее, но медленнее, чем более традиционные утилиты gzip или zip. В этом отношении он похож на другие современные алгоритмы сжатия.

bzip2 выполняет сжатие данных с существенной нагрузкой на CPU (что обусловлено его математическим аппаратом), поэтому его не рекомендуют использовать на рабочих серверах. Процесс bzip2, выполняющий, например, сжатие резервных копий файлов, будет работать достаточно продолжительное время (данные размером 10 Gb упаковываются примерно 3‑4 часа). Центральный процессор будет занят в основном выполнением процесса bzip2 (архивацией данных) и не сможет оперативно обслуживать другие процессы системы, что может являться причиной отказа в обслуживании, например, веб-сервера. bzip2 применяют, если нет ограничений на время сжатия и на нагрузку на CPU, например, для разовой упаковки большого объёма данных.

В некоторых случаях bzip2 уступает по эффективности сжатия архиваторам 7-Zip (метод сжатия LZMA) и rar. Согласно исследованию[источник не указан 34 дня] автора bzip2, метод сжатия bzip2 уступает по эффективности сжатия на 10‑15% наилучшим методам, известным на данный момент (PPM)[2], но при этом в 2 раза быстрее при сжатии и в 6 раз быстрее при распаковке.

Описание алгоритма[править | править вики-текст]

Метод сжатия bzip2 работает следующим образом:

Размер блока можно выбрать при помощи аргументов командной строки («-1» для 100 k, «-2» для 200 k, ..., «-9» для 900 k), и он помечается в сжатом тексте произвольно выбранной последовательностью битов представления числа π.

Предшественник bzip2, программа bzip, вместо кодирования Хаффмана использовала арифметическое кодирование. Из‑за патентных ограничений от этого алгоритма отказались.

Использование[править | править вики-текст]

bzip2 можно использовать как в комбинации с tar, так и отдельно.

Примеры использования bzip2.

# Команда для сжатия файла «file»
bzip2 file
# или
bzip2 --compress file
 
# Команда для распаковки файла «file.bz2»
bzip2 -d file.bz2
# или
bzip2 --decompress file.bz2
# или
bunzip2 file.bz2
# bunzip2 - копия bzip2 или ссылка на bzip2

Аргументы командной строки bzip2 в основном такие же, как и у утилиты gzip.

# Команда для распаковки архива tar, сжатого bzip2
bzip2 -cd file.tar.bz2 | tar -xvf -
# или
bzip2 --stdout --decompress file.tar.bz2 \
| tar --extract --verbose --file -
 
# Команда для создания архива tar, сжатого bzip2
tar -cvf - files | bzip2 -9 > file.tar.bz2
# или
tar --create --verbose --file - files \
| bzip2 -9 > file.tar.bz2

Версия GNU tar поддерживает флаг «-j» («--bzip2»), который позволяет создавать и распаковывать файлы «tar.bz2» без использования перенаправлений ввода-вывода (англ. pipeline). Пример:

# Упаковка данных в архив tar и сжатие bzip2 при помощи GNU tar
tar -cvjf file.tar.bz2 list_of_files
# или
tar --create --verbose --bzip2 --file file.tar.bz2 list_of_files
 
# Распаковка архива tar, сжатого bzip2 при помощи GNU tar
tar -xvjf file.tar.bz2
# или
tar --extract --verbose --bzip2 --file file.tar.bz2

Современные версии GNU tar могут автоматически определить метод сжатия данных, и поэтому флаг «-j» («--bzip2») можно не использовать. Пример:

tar -xvf file.tar.bz2
# или
tar --extract --verbose --file file.tar.bz2

Кроме того, существует набор утилит для выполнения поиска, вывода, восстановления и сравнения данных в формате bzip2:

  • bzcat — распаковка данных и вывод на терминал;
  • bzmore, bzless — распаковка данных и постраничный вывод на терминал;
  • bzcmp — распаковка двух файлов, сравнение содержимого и сообщение результата: «равно» или «не равно»;
  • bzdiff — распаковка двух файлов, сравнение содержимого и вывод различий;
  • bzgrep, bzegrep, bzfgrep — распаковка данных и поиск в распакованном;
  • bzip2recover — распаковка любых блоков, которые только можно распаковать.

Формат файла[править | править вики-текст]

Архив «.bz2» содержит поток (англ. stream) сжатых данных. Слово «поток» употребляется, так как данные нельзя разделить логически и блоки данных сжимаются независимо друг от друга. Сжатые данные состоят из следующих полей:

  • заголовок размером 4 байта;
  • ноль или более блоков сжатых даннных различного размера;
  • маркер, обозначающий конец сжатых данных и контрольная сумма (CRC) размером 32 бита, вычисленная для всего потока;
  • несколько неиспользуемых бит для дополнения размера потока до целого количества байт.
Название поля Размер поля в битах Описание
.magic 16 BZ — константа, сигнатура, магическое число.
.version 8 Байт, кодирующий номер версии.
0 
Версия 1 (bzip1). Deprecated.
h 
Версия 2 (bzip2). «h» от англ. Huffman coding.
.hundred_k_blocksize 8 Размер блока несжатых данных в сотнях kB.
1 
Одна сотня kB (100 kB).
2 
Две сотник kB (200 kB).
... 
И так далее
9 
Девять сотен kB (900 kB).
.crc 32 Контрольная сумма, рассчитанная для текущего блока.
.randomised 1
0 
normal
1 
randomised (deprecated)
.origPtr 24 starting pointer into BWT for after untransform
.huffman_used_map 16 bitmap, of ranges of 16 bytes, «имеется»/«отсутствует»
.huffman_used_bitmaps 0..256 bitmap, of symbols used, «имеется»/«отсутствует» (кратно 16)
.huffman_groups 3 Число от 2 до 6, количество используемых таблиц Хаффмана.
.selectors_used 15 Число, показывающее сколько раз выполнялась смена таблицы Хаффмана (каждые 50 байт).
*.selector_list 1..6 zero-terminated bit runs (0..62) of MTF'ed Huffman table (*selectors_used)
.start_huffman_length 5 0..20 starting bit length for Huffman deltas
*.delta_bit_length 1..40
0 
next symbol
1 
alter length

{ 1=>decrement length; 0=>increment length } (*(symbols+2)*groups)

.contents 2..∞ Huffman encoded data stream. Продолжается до конца блока. Максимальная длина равна 7 372 800 бит.
.eos_magic 48 0x177245385090 — константа, квадратный корень из числа π (sqrt(pi)) в двоично-десятичном коде (BCD).
.crc 32 Контрольная сумма, рассчитанная для всего потока.
.padding 0..7 Неиспользуемые биты (от 0 до 7). Назначение: увеличение размера архива до размера, кратного одному байту (8 битам) (выравнивание данных).

Максимальный размер не сжатого блока равен 900 kB. Если блок состоит из одного повторяющегося символа, после кодирования RLE блок займёт около 46 MB (45 899 236 байт), а после выполнения всех операций размер файла .bz2 составит 46 байт. Если повторяющийся символ будет иметь код 251, размер файла .bz2 составит 40 байт, а коэффициент сжатия (англ. compression ratio) будет равен 1 147 480,9:1.

См. также[править | править вики-текст]

Примечания[править | править вики-текст]

  1. bzip2 : Home. Julian Seward. — «Why would I want to use it? [..] Because it's open-source (BSD-style license), and, as far as I know, patent-free.»  Проверено 27 сентября 2008. Архивировано из первоисточника 15 февраля 2012.
  2. На данный момент наиболее эффективно сжимают различные реализации метода PAQ. Однако, использование данного метода крайне затруднено по причине низкой производительности (сжатие требует больших временных затрат).

Ссылки[править | править вики-текст]