Чому формати архіву tar переходять на компресію xz, щоб замінити bzip2, а що з gzip?


202

Все більше 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
@ iluminÉ пружність не може бути забезпечена без шкоди для коефіцієнта стиснення. Це ортогональна проблема, і хоча існують такі інструменти, як Parchive, розподілення помилок TCP ядра виконує цю роботу також.
Тобу

2
@ iluminÉ Толерантність до помилок (якщо ви маєте на увазі щось подібне до par2) зазвичай не стосується розповсюдження архівів через Інтернет. Завантаження вважається достатньо надійним (і ви можете просто перезавантажити, якщо воно було пошкоджено). Криптографічні хеші та підписи часто використовуються, і вони виявляють корупцію, а також підробку. Існують компресори, які дають більшу відмову, хоча і за рахунок коефіцієнта стиснення. Здається, ніхто не знаходить компромісу, який коштує цього для завантаження HTTP або FTP.
дероберт

xz використовує МЕНШЕ пам'яті для декомпресії.
MichalH

@Mike Чи змінилося це з моменту написання цього запису? Зокрема, виноска пояснює використання пам'яті.
дероберт

45

Перш за все, це питання безпосередньо не пов'язане 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. (Можливо, це розвинулося з моменту Вашого коментаря.)
RaveTheTadpole

19

Коротка відповідь : xz є більш ефективним щодо коефіцієнта стиснення. Так це економить місце на диску і оптимізує передачу через мережу.
Ви можете побачити цей Швидкий показник , щоб виявити різницю за допомогою практичних тестів.


Посилання розірвано.
flarn2006

18

LZMA2 - система блокової компресії, тоді як gzip - ні. Це означає, що LZMA2 піддається багатопотоковому. Крім того, якщо в архіві трапляється пошкодження, зазвичай ви можете відновити дані з наступних блоків за допомогою LZMA2, але ви не можете цього зробити за допомогою gzip. На практиці ви втрачаєте весь архів з gzip після зіпсованого блоку. З архівом LZMA2 ви втрачаєте лише ті файли, на які постраждали пошкоджені блоки. Це може бути важливим у великих архівах із кількома файлами.


2
Це дійсно дуже корисна та важлива відмінність!
leden
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.