Використання багатоядерного для стиснення / декомпресії tar / gzip / bzip


225

Я звичайно стискаю, використовуючи tar zcvfта декомпресуючи, використовуючи tar zxvf(використовуючи gzip за звичкою).

Нещодавно я отримав чотирьохядерний процесор з гіперточенням, тому у мене є 8 логічних ядер, і я помічаю, що багато ядер не використовуються під час стиснення / декомпресії.

Чи є якийсь спосіб я використати невикористані ядра, щоб зробити це швидше?


Рішення, запропоноване Xiong Chiamiov вище, прекрасно працює. Я щойно створив резервну копію свого ноутбука за допомогою .tar.bz2, і це зайняло 132 хвилини, використовуючи лише один процесор. Потім я компілював і встановлював tar з джерела: gnu.org/software/tar Я включив параметри, згадані на кроці налаштування: ./configure --with-gzip = pigz --with-bzip2 = lbzip2 --with-lzip = plzip Я запустив резервну копію знову, і це зайняло всього 32 хвилини. Це краще, ніж покращення в 4 рази! Я спостерігав за монітором системи, і весь цей термін утримував всі 4 cpus (8 потоків) на рівні 100% весь час. ТАКЕ найкраще рішення.
Воррен Северин

Відповіді:


309

Ви можете використовувати pigz замість gzip, який робить компресію gzip на декількох ядрах. Замість використання опції -z ви передаваєте її через pigz:

tar cf - paths-to-archive | pigz > archive.tar.gz

За замовчуванням pigz використовує кількість доступних ядер, або вісім, якщо він не може цього запитувати. Ви можете попросити більше з -pn, наприклад -p 32. pigz має ті ж варіанти, що і gzip, тому ви можете запитати кращу компресію з -9. Напр

tar cf - paths-to-archive | pigz -9 -p 32 > archive.tar.gz

3
Як ви використовуєте pigz для того, щоб декомпресувати таким же чином? Або це працює лише для стиснення?
user788171

42
pigz дійсно використовує кілька ядер для декомпресії, але лише з обмеженим вдосконаленням над одним ядром. Формат дефляції не піддається паралельній декомпресії. Декомпресійну частину потрібно робити послідовно. Інші сердечники для декомпресії поросят використовуються для читання, запису та обчислення CRC. Під час стискання з іншого боку, pigz наближається до фактора n поліпшення з n ядрами.
Марк Адлер

7
Дефіс тут - stdout (див. Цю сторінку ).
Гаррет

3
Так. 100% сумісний в обох напрямках.
Марк Адлер

4
Насправді немає часу на витрачання процесора на відстеження, тому це не дуже допоможе. Формат смоли - це лише копія вхідного файлу із заголовками між файлами.
Марк Адлер

324

Ви також можете використовувати прапор смоли "--use -press-program =", щоб вказати tar, яку програму стиснення використовувати.

Наприклад, використовуйте:

tar -c --use-compress-program=pigz -f tar.file dir_to_zip 

21
Це дивовижний маленький самородок знань і заслуговує на більшу кількість нагород. Я не мав уявлення, що такий варіант навіть існує, і я читав сторінку чоловіка кілька разів за ці роки.
Полювання на Рендалла

2
@ValerioSchiavoni: Не тут, я отримую повне навантаження на всі 4 ядра (Ubuntu 15.04 'Vivid').
bovender

8
Я вважаю за краще, щоб tar - dir_to_zip | pv | pigz > tar.fileПВ допомагає мені оцінити, ви можете пропустити його. Але все ж простіше писати і запам’ятовувати.
Оффенсо

@ NathanS.Watson-Haigh Так. Просто додайте назву програми та аргументи до лапок. man tarговорить так, як це робить .
Марк.2377

1
У 2020 році zstdце найшвидший інструмент для цього. Помітне прискорення під час стискання та віджимання. Використовуйте tar -cf --use-compress-program=zstdmtце для багатопотокової резьби.
нефрит

112

Загальний підхід

Є можливість для tarпрограми:

-I, --use-compress-program PROG
      filter through PROG (must accept -d)

Можна використовувати багатопоточну версію архіватора або утиліту компресора.

Найбільш популярні багатопотокові архіватори - pigz (замість gzip) та pbzip2 (замість bzip2). Наприклад:

$ tar -I pbzip2 -cf OUTPUT_FILE.tar.bz2 paths_to_archive
$ tar --use-compress-program=pigz -cf OUTPUT_FILE.tar.gz paths_to_archive

Архівник повинен прийняти -d. Якщо у вашій утиліті заміни немає цього параметра та / або вам потрібно вказати додаткові параметри, тоді використовуйте труби (при необхідності додайте параметри):

$ tar cf - paths_to_archive | pbzip2 > OUTPUT_FILE.tar.gz
$ tar cf - paths_to_archive | pigz > OUTPUT_FILE.tar.gz

Вхід і вихід однониткових і багатопотокових сумісні. Ви можете стискати, використовуючи багатопотокову версію та розпаковувати, використовуючи версію з однопотоковою стрічкою та навпаки.

p7zip

Для стиснення p7zip вам потрібен невеликий скрипт оболонки, наприклад:

#!/bin/sh
case $1 in
  -d) 7za -txz -si -so e;;
   *) 7za -txz -si -so a .;;
esac 2>/dev/null

Збережіть це як 7zhelper.sh. Ось приклад використання:

$ tar -I 7zhelper.sh -cf OUTPUT_FILE.tar.7z paths_to_archive
$ tar -I 7zhelper.sh -xf OUTPUT_FILE.tar.7z

xz

Що стосується багатопотокової підтримки XZ. Якщо ви працюєте з версією XZ Utils версії 5.2.0 або вище, ви можете використовувати кілька ядер для стиснення, встановивши -Tабо --threadsдо відповідного значення за допомогою змінної середовища XZ_DEFAULTS (наприклад XZ_DEFAULTS="-T 0").

Це фрагмент людини для версії 5.1.0 alpha:

Багатопотокове стиснення та декомпресія ще не реалізовані, тому ця можливість наразі не має ефекту.

Однак це не допоможе для декомпресії файлів, які також не були стиснуті з увімкненою нарізкою. Від людини до версії 5.2.2:

Декомпресія нитки ще не здійснена. Він буде працювати лише над файлами, які містять кілька блоків з інформацією про розмір у заголовках блоків. Усі файли, стиснуті в багатопотоковому режимі, відповідають цій умові, але файли, стиснуті в однопотоковому режимі, навіть не використовуються --block-size = size.

Перекомпіляція із заміною

Якщо ви будуєте дьоготь з джерел, тоді ви можете перекомпілювати параметри

--with-gzip=pigz
--with-bzip2=lbzip2
--with-lzip=plzip

Після перекомпіляції tar за допомогою цих параметрів ви можете перевірити вихід довідки tar:

$ tar --help | grep "lbzip2\|plzip\|pigz"
  -j, --bzip2                filter the archive through lbzip2
      --lzip                 filter the archive through plzip
  -z, --gzip, --gunzip, --ungzip   filter the archive through pigz

1
Це справді найкраща відповідь. Я обов’язково відновлю свій дьоготь!

1
Я щойно знайшов pbzip2 та mpibzip2 . mpibzip2 виглядає дуже перспективно для кластерів або якщо у вас є, наприклад, ноутбук та багатоядерний настільний комп'ютер.

Це чудова і ретельна відповідь. Можливо, добре згадати, що багатопотокове стиснення (наприклад, з pigz) увімкнено лише тоді, коли воно читається з файлу. Обробка STDIN насправді може бути повільнішою.
квітня

3
Плюс 1 за xzваріант. Це найпростіший, але ефективний підхід.
selurvedu

2
export XZ_DEFAULTS="-T 0"перед викликом tarз опцією -Jдля компресії xz працює як шарм.
scai

13

Ви можете використовувати ярлик -Iдля --use-compress-programперемикання смоли та викликати pbzip2стиснення bzip2 на декількох ядрах:

tar -I pbzip2 -cf OUTPUT_FILE.tar.bz2 DIRECTORY_TO_COMPRESS/

Хороший TL; DR для @ MaximSuslov в відповідь .
einpoklum

Це повертається tar: home/cc/ziptest: Cannot stat: No such file or directory tar: Exiting with failure status due to previous errors`
Arash

1

Якщо ви хочете отримати більшу гнучкість з назви файлів і параметрами стиснення, ви можете використовувати:

find /my/path/ -type f -name "*.sql" -o -name "*.log" -exec \
tar -P --transform='s@/my/path/@@g' -cf - {} + | \
pigz -9 -p 4 > myarchive.tar.gz

Крок 1: find

find /my/path/ -type f -name "*.sql" -o -name "*.log" -exec

Ця команда шукатиме файли, які ви хочете заархівувати, у цьому випадку /my/path/*.sqlта /my/path/*.log. Додайте скільки -o -name "pattern"завгодно.

-execвиконає наступну команду, використовуючи результати find:tar

Крок 2: tar

tar -P --transform='s@/my/path/@@g' -cf - {} +

--transform- простий параметр заміни рядків. Він буде викреслювати шлях файлів з архіву, щоб корінь tarball став поточним каталогом при вилученні. Зауважте, що ви не можете використовувати -Cопцію для зміни каталогу, оскільки ви втратите переваги find: всі файли каталогу будуть включені.

-Pвказує tarвикористовувати абсолютні шляхи, тому не викликає попередження "Видалення провідних` / "з імен учасників". Ведучий '/' з видалити --transformбудь-яким чином.

-cf -говорить tarвикористовувати ім'я тарбола, яке ми вкажемо пізніше

{} +використовує всі файли, які були findзнайдені раніше

Крок 3: pigz

pigz -9 -p 4

Використовуйте скільки завгодно параметрів. У цьому випадку -9рівень стиснення і -p 4це кількість ядер, присвячених стисненню. Якщо ви запускаєте це на великому завантаженому веб-сервері, ви, ймовірно, не хочете використовувати всі доступні ядра.

Крок 4: ім'я архіву

> myarchive.tar.gz

Нарешті.


0

Порівняно новіший (де) інструмент стиснення, який ви хочете розглянути, - це zstandard . Це прекрасна робота з використання запасних сердечників, і вона зробила великі компроміси, коли йдеться про коефіцієнт стиснення проти (де) часу стиснення. Він також може налаштовуватися в залежності від потреб у вашому співвідношенні стиснення.

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