Багатоядерні засоби стиснення


61

Які засоби стиснення доступні в Ubuntu, які можуть отримати користь від багатоядерного процесора.


Як раз для запису, альтернативою може бути створення незалежних архівів паралельно. Отже, замість створення myfiles.8core.xz, ви створюєте myfiles1.xz для myfiles8.xz паралельно. Для цього знадобиться диспетчерський агент. Обидва підходи мають додаткові плюси і мінуси.
Acumenus

2
Спробував розпакувати файл 7 Гб за допомогою лише bzip2, щоб дізнатися, що він використовує не всі мої 8 ядер. Почитайте про це і вирішили спробувати pbzip2. Все ще працює лише на одному ядрі. Тоді я помітив коментарі, у яких говорилося, що pbzip2 може лише повністю паралелізувати декомпресію файлів, які він стискав сам. Ті ж коментарі пропонують, що lbzip2 може повністю паралелізувати будь-який файл bz2, що справді було правдою - майже повністю використовував (80-90% процесора) всіх моїх ядер, і він декомпресувався швидше.
Еді Біс

Відповіді:


34

Є два основних інструменти. lbzip2і pbzip2. Вони по суті відрізняються реалізацією компресорів bzip2. Я порівнював їх (вихід - примірний варіант, але ви повинні мати можливість запускати команди)

cd /dev/shm  # we do all of this in RAM!
dd if=/dev/urandom of=bigfile bs=1024 count=102400

$ lbzip2 -zk bigfile 
Time: 0m3.596s
Size: 105335428 

$ pbzip2 -zk bigfile
Time: 0m5.738s6
Size: 10532460

lbzip2виявляється переможцем у випадкових даних. Це трохи менше стискається, але набагато швидше. YMMV.


5
схоже на те, що цифра відсутня в розмірі pbzip2
Wayne Walker

4
/dev/urandomне є великим вибором даних для інструментів стиснення бенчмаркінгу, оскільки випадкові дані, за визначенням, не стискаються. Це частково пояснює, чому в обох випадках вихідний файл ~ 450MiB більший за вхідний.
ali_m

1
Вибачте, я справді педантичний, але справді випадкові дані можуть бути надзвичайно стислими. Ви можете попросити ідеальний RNG за 32 біти і отримати 00000000000000000000000000000000. Ось так працює випадково;) Те, про що ви говорите, - це практичні середні показники. Навряд чи ви генеруєте 100 МБ файл просто нулів. І я згоден з духом того, що ви говорите, я просто не згоден з "за визначенням", тому що це не визначення (тому що це неточне).
Олі

2
Коли ми судимо про ефективність різних методів стиснення, нас насправді цікавить очікуваний розмір виводу для майбутніх прикладів того типу даних, який ми хочемо стиснути. Якщо ці дані справді випадкові, то вони не містять статистичної закономірності для стиснення для експлуатації, тому для послідовностей N випадкових байтів найкращим, на що ми могли сподіватися, є очікувана довжина виходу N байт. Для деяких прикладів ми можемо зробити трохи краще, для інших ми можемо зробити трохи гірше (на практиці ми майже завжди робимо гірше), але очікувана тривалість виходу залишається такою ж.
ali_m

5
Я маю на увазі «випадковий» у значенні Колмогорова , який дослівно визначається як нестислимість. Не існує універсального еталону для стиснення, оскільки різні алгоритми краще працюють для різних типів даних. Хорошим початком може бути просто передати текст деяким текстом, наприклад, wget http://mattmahoney.net/dc/enwik8.zipсхопити 96 МБ (стиснутого 21 МБ) тексту з Вікіпедії. Більш детальний набір орієнтирів дивіться тут .
ali_m

72

Ну, ключове слово було паралельне . Після пошуку всіх інструментів стиснення, які також були паралельними, я виявив наступне:

PXZ - Паралельний XZ - це утиліта стиснення, яка використовує перевагу виконання компресії LZMA різних частин вхідного файлу на декількох ядрах і процесорах одночасно. Основна його мета - використовувати всі ресурси для прискорення часу стиснення з мінімальним можливим впливом на коефіцієнт стиснення.

sudo apt-get install pxz

PLZIP - Lzip - компресор даних без втрат на основі алгоритму LZMA, що забезпечує дуже безпечну перевірку цілісності та інтерфейс користувача, подібний до gzip або bzip2. Lzip декомпресується майже так само швидко, як gzip і стискає краще, ніж bzip2, що робить його добре придатним для розповсюдження програмного забезпечення та архівування даних.

Plzip - це масово паралельна (багатопотокова) версія lzip з використанням формату файлу lzip; файли, створені plzip, повністю сумісні з lzip.

Plzip призначений для швидшого стиснення / декомпресії великих файлів на багатопроцесорних машинах, що робить його особливо придатним для розповсюдження великих програмних файлів та великого масштабування архівів даних. У файлах, достатньо великих, plzip може використовувати сотні процесорів.

sudo apt-get install plzip

PIGZ - pigz, який розшифровується як паралельне впровадження GZip, є повністю функціональною заміною gzip, яка використовує переваги декількох процесорів і декількох ядер при стисненні даних.

sudo apt-get install pigz

PBZIP2 - pbzip2 - це паралельна реалізація компресора файлів сортування файлів bzip2, яка використовує pthreads і досягає майже лінійного прискорення на машинах SMP. Вихід цієї версії повністю сумісний з bzip2 v1.0.2 (тобто: все, що стискається з pbzip2, може бути декомпресоване bzip2).

sudo apt-get install pbzip2

LRZIP - багатопотокова програма стиснення, яка може досягти дуже високих коефіцієнтів стиснення та швидкості при використанні з великими файлами. Він використовує комбіновані алгоритми стиснення zpaq та lzma для максимальної компресії, lzo для максимальної швидкості та зменшення надмірності надмірності дальнього відстані rzip. Він призначений для збільшення масштабів із збільшенням розміру оперативної пам’яті, в подальшому покращуючи стиснення. Вибір оптимізації розміру або швидкості дозволяє отримати кращу компресію, ніж навіть lzma, або швидкість, ніж gzip, але з рівнями стиснення розміром bzip2.

sudo apt-get install lrzip

Невеликий показник стиснення (використовуючи створений тест Oli):

Оригінальний розмір файлу - 100 МБ
PBZIP2 - 101 МБ (1% більший)
PXZ - 101 МБ (1% більший)
PLZIP - 102 МБ (1% більший)
LRZIP - 101 МБ (1% більший)
PIGZ - 101 МБ (1% більший) )

Невеликий показник стиснення (Використання текстового файлу):

ОРИГІНАЛЬНИЙ РОЗМІР ФАЙЛУ - 70 КБ Текстовий файл
PBZIP2 - 16,1 КБ (23%)
PXZ - 15,4 КБ (22%)
PLZIP - 15,5 КБ (22,1%)
LRZIP - 15,3 КБ (21,8%)
PIGZ - 17,4 КБ (24,8%)


Приклади були б чудовими.
earthmeLon

@earthmeLon Прочитайте відповідь Олі, яка згадує, як створити прикладний файл. Потім перейдіть до команд, які я використав.
Луїс Альварадо

Я сподіваюся, що результати цих даних є сумісними. наприклад, вихід з, наприклад, lrzipможе бути нестисненим, використовуючи pbzip2, наприклад.
Vineet Menon

10

Крім того, приємне резюме вище (спасибі Луїс), в ці дні люди можуть також захотіти розглянути питання PIXZ, який відповідно до цього читає (Джерело: https://github.com/vasi/pixz - я ще не перевірив претензії сам ) має деякі переваги перед PXZ.

[Compared to PIXZ, PXZ has these advantages and disadvantages:]

    * Simpler code
    * Uses OpenMP instead of pthreads
    * Uses streams instead of blocks, not indexable
    * Uses temp files and doesn't combine them until the whole file is compressed, high disk/memory usage

Іншими словами, PIXZ, мабуть, більш ефективний у пам’яті та на диску, і має додаткову функцію індексації, яка прискорює декомпресію окремих компонентів стислих файлів tar.


Однак, наскільки я розумію, що pixzархіви не сумісні зі стандартним xzформатом, як це pxzбуло б.
Mxx

5
@Mxx: Формати файлів сумісні. pixzможе декомпресувати xzархіви і xzможе розпакувати pixzархіви. Однак параметри командного рядка увімкнено xzі pixzвідрізняються.
Сніжок

Файли, що індексуються, - це великий виграш pixz.
ostrokach

8

Оновлення:

XZ Utils підтримує багатопотокове стиснення, починаючи з v5.2.0, спочатку було помилково зафіксовано як багатопотокове декомпресію.

Наприклад: tar -cf - source | xz --threads=0 > destination.tar.xz


Ви також можете запустити, export XZ_DEFAULTS="-T 0" а потім просто скористатися звичайним дзвінким тарифом, тобто tar cJf target.tar.xz source.
scai

4

lzop також може бути життєздатним варіантом, хоча він є однопоточним.

Він використовує дуже швидкий алгоритм стиснення lempel-ziv-oberhumer , який в 5-6 разів швидший, ніж gzip в моєму спостереженні.

Примітка. Хоча вона ще не є багатопотоковою, вона, мабуть, перевершить pigz у 1-4 основних системах. Тому я вирішив опублікувати це, навіть якщо це не відповідає безпосередньо на ваше запитання. Спробуйте, це може вирішити вашу проблему з вузьким процесором, використовуючи лише один процесор і трохи стиснути. Я часто вважав це кращим рішенням, ніж, наприклад, pigz.


Хіба це не просто краще при розпакуванні? Стиснення займає приблизно стільки ж (або гірше), ніж gzip
Lennart Rolland

Я також можу засвідчити, що lzop дуже швидкий. Proxmox за замовчуванням використовує lzop для резервного копіювання віртуальних машин.
Lonnie Best

1
lz4 ще швидший (і має багатопоточну версію).
Девід Балажич


3

Це насправді не відповідь, але я вважаю, що це досить релевантно, щоб поділитися моїми орієнтирами, порівнюючи швидкість gzipта pigzреальний HW у реальному сценарії життя. Як pigzі багатопотокова еволюція, яку я особисто вирішив використовувати відтепер.

Метадані:

  • Використовуване обладнання: Intel(R) Core(TM) i7-7700HQ CPU @ 2.80GHz(4c / 8t) + Nvme SSD
  • Розподіл GNU / Linux: Xubuntu 17.10 (artful)
  • gzip версія: 1.6
  • pigz версія: 2.4
  • Файл, що стискається, - це дамп 9,25 GiB SQL

gzip швидкий

time gzip -1kN ./db_dump.sql

real    1m22,271s
user    1m17,738s
sys     0m3,330s

gzip найкращий

time gzip -9kN ./db_dump.sql 

real    10m6,709s
user    10m2,710s
sys     0m3,828s

pigz швидкий

time pigz -1kMN ./db_dump.sql 

real    0m26,610s
user    1m55,389s
sys     0m6,175s

pigzнайкращий (ні zopfli)

time pigz -9kMN ./db_dump.sql 

real    1m54,383s
user    14m30,435s
sys     0m5,562s

pigz+ zopfliалгоритм

time pigz -11kMN ./db_dump.sql 

real    171m33,501s
user    1321m36,144s
sys     0m29,780s

В якості нижнього рядка я б не рекомендував zopfliалгоритм, оскільки для стиснення знадобилося величезна кількість часу, не витраченого на дисковий простір.

Отримані розміри файлів:

  • кращий s: 1309М
  • швидкий s: 1680М
  • zopfli : 1180М

2

Zstandard підтримує багатопотоковість з v1.2.0 ¹. Це дуже швидкий компресор і декомпресор, призначений замінити gzip, а також може стискати настільки ж ефективно - якщо не краще - як LZMA2 / XZ на його найвищих рівнях.

Щоб отримати ці переваги, ви повинні використовувати хитрую чи новішу версію, або скласти останню версію з джерела. На щастя, це не тягне за собою багато залежностей.

  1. Була також сторона pzstd в v1.1.0 zstd.
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.