Почему форматы архивов tar переходят на сжатие xz вместо bzip2, а как насчет gzip?


203

Все больше tarархивов используют xzформат, основанный на LZMA2, для сжатия вместо традиционного bzip2(bz2)сжатия. На самом деле kernel.org сделал позднее объявление « До свидания, bzip2 » , 27 декабря 2013 года , указав, что исходные коды ядра с этого момента будут выпущены в формате tar.gz и tar.xz - и на главной странице сайта. то, что прямо предлагается, находится в tar.xz.

Есть ли конкретные причины, объясняющие, почему это происходит, и какова актуальность gzipв этом контексте?

history  gzip  bzip2  xz 

Ответы:


198

Для распространения архивов через Интернет, как правило, приоритетными являются следующие вещи:

  1. Степень сжатия (т. Е. Насколько маленький компрессор создает данные);
  2. Время декомпрессии (требования к процессору);
  3. Требования к памяти для декомпрессии; а также
  4. Совместимость (насколько широко распространена программа декомпрессии)

Требования к памяти и процессору для сжатия не очень важны, потому что вы можете использовать для этого большую быструю машину, и вам нужно сделать это только один раз.

По сравнению с bzip2, xz имеет лучшую степень сжатия и меньшее (лучшее) время декомпрессии. Однако для этого - при обычно используемых настройках сжатия - требуется больше памяти для распаковки [1], и он несколько менее распространен. Gzip использует меньше памяти, чем любой.

Итак, оба архива в формате gzip и xz размещены, что позволяет вам выбрать:

  • Необходимо распаковать на машине с очень ограниченной памятью (<32 МБ): gzip. Учитывая, не очень вероятно, когда речь идет об источниках ядра.
  • Нужно распаковать минимум доступных инструментов: gzip
  • Хотите сэкономить время загрузки и / или пропускную способность: xz

На самом деле не существует реалистичной комбинации факторов, которая заставила бы вас выбрать bzip2. Так что это постепенно прекращается.

Я посмотрел на сравнения сжатия в блоге . Я не пытался повторить результаты, и я подозреваю, что некоторые из них изменились (в основном, я ожидаю, xzчто улучшились, так как он самый новый).

(Существуют некоторые конкретные сценарии, в которых хорошая реализация bzip2 может быть предпочтительнее xz: bzip2 может сжимать файл с большим количеством нулей и последовательностей ДНК генома лучше, чем xz. Более новые версии xz теперь имеют (необязательный) режим блокировки, который позволяет восстанавливать данные после точки повреждения и параллельного сжатия и [в теории] декомпрессии. Ранее, только bzip2 предлагал это. [2] Однако ни один из них не имеет отношения к распределению ядра)


1: в размере архива, xz -3вокруг bzip -9. Затем xz использует меньше памяти для распаковки. Но xz -9(как, например, используемый для тарболлов ядра Linux) использует гораздо больше, чем bzip -9. (И даже xz -0нужно больше чем gzip -9).

2: Изменение всей системы F21: lbzip2 как реализация bzip2 по умолчанию


Любой комментарий на тему отказоустойчивости или это то, что всегда реализуется полностью вне алгоритмов сжатия?

1
Упругость @ lightsÉ не может быть обеспечена без ущерба для степени сжатия. Это ортогональная проблема, и хотя существуют такие инструменты, как Parchive, для распространения обработки ошибок в ядре TCP делает то же самое.
Тобу

2
@ lightsÉ Отказоустойчивость (если вы подразумеваете что-то похожее на par2) обычно не связана с распространением архивов через Интернет. Предполагается, что загрузка достаточно надежна (и вы можете просто загрузить ее заново, если она была повреждена). Криптографические хеши и подписи часто используются, и они обнаруживают как коррупцию, так и подделку. Есть компрессоры, которые обеспечивают большую отказоустойчивость, хотя и за счет степени сжатия. Похоже, что никто не найдет компромиссное решение для загрузки по HTTP или FTP.
Дероберт

XZ использует меньше памяти для распаковки.
MichalH

@ Майк Это изменилось с тех пор, как я написал это? В частности, сноска 1 объясняет использование памяти.
Дероберт

46

Прежде всего, этот вопрос не имеет прямого отношения к tar. Tar просто создает несжатый архив, затем сжатие применяется позже.

Известно, что Gzip относительно быстр по сравнению с LZMA2 и bzip2. Если скорость имеет значение, gzip(особенно многопоточная реализация pigz) часто является хорошим компромиссом между скоростью сжатия и степенью сжатия. Хотя есть альтернативы, если скорость является проблемой (например, LZ4).

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

Существует не так много причин для использования bzip2, кроме обратной совместимости. Кроме того, LZMA2 был разработан с учетом многопоточности, и во многих реализациях по умолчанию используются многоядерные процессоры (к сожалению, xzв Linux этого пока нет). Это имеет смысл, поскольку тактовые частоты больше не будут увеличиваться, но количество ядер будет увеличиваться.

Существуют многопоточные bzip2реализации (например pbzip), но они часто не устанавливаются по умолчанию. Также обратите внимание, что многопоточность bzip2действительно окупается только при сжатии, тогда как декомпрессия использует один поток, если файл был сжат с использованием одного потока bzip2, в отличие от LZMA2. Параллельные bzip2варианты могут использовать многоядерные ЦП только в том случае, если файл был сжат с использованием параллельной bzip2версии, что часто не так.


4
Ну, некоторые гудроны делают zвыбор.
tchrist

«скорость» делает запутанный ответ, вы должны обратиться к скорости сжатия или скорости декомпрессии. Ни по умолчанию ни pixz, ни pbzip2, ни pigz не установлены (или не используются tar без флага -I), но pixz и pbzip2 ускоряют сжатие и распаковку, а pigz только для сжатия.
Тобу

@Tobu xzбудет многопоточным по умолчанию, поэтому pixzв будущем установка не потребуется. На некоторых платформах xzпотоки уже поддерживаются. Принимая во внимание, bzip2что вряд ли когда-либо будет многопоточным, так как формат не был разработан с учетом многопоточности. Кроме того, pbzip2ускоряет распаковку , только если файл был сжат с использованием, pbzip2что часто не так.
Марко

1
@Marco Я считаю, что lbzip2 допускает параллельную распаковку файлов, даже если они были сжаты с непараллельной реализацией (например, стоковая bzip2). Вот почему я использую lbzip2 вместо pbzip2. (Возможно, это
изменилось

20

Краткий ответ : xz более эффективен с точки зрения степени сжатия. Таким образом, это экономит дисковое пространство и оптимизирует передачу по сети.
Вы можете увидеть этот Quick Benchmark, чтобы обнаружить разницу с помощью практических тестов.


Ссылка не работает.
flarn2006

19

LZMA2 - это система сжатия блоков, а gzip - нет. Это означает, что LZMA2 поддается многопоточности. Кроме того, если в архиве происходит повреждение, вы можете восстановить данные из последующих блоков с помощью LZMA2, но вы не можете сделать это с помощью gzip. На практике вы теряете весь архив с помощью gzip после поврежденного блока. С архивом LZMA2 вы потеряете только те файлы, на которые влияют поврежденные блоки. Это может быть важно в больших архивах с несколькими файлами.


2
Это действительно очень полезное и важное различие!
leden
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.