Який найкращий спосіб використовувати паралельні bzip2 та gzip за замовчуванням?


41

Bzip2 і gzip використовують лише одне ядро, хоча багато комп'ютерів мають більше одного ядра. Але є такі програми, як lbzip2, pbzip2 та pigz, які використовують усі наявні ядра та обіцяють бути сумісними з bzip2 та gzip.

Тож який найкращий спосіб використовувати ці програми за замовчуванням, щоб він tar cfa file.tar.bz2 directoryвикористовував lbzip2 / pbzip2 замість bzip2? Звичайно, я не хочу нічого ламати.


2
З цікавості до всіх: чи паралельний gzip / bzip дійсно швидший, ніж серійний? Я б зауважив, що швидкість запису HDD та інші обмеження є більшою проблемою.
con-f-use

@ con-f-use Якщо ви теоретично не маєте SSD, це може бути швидшим, оскільки загальний розмір архіву збільшується.
Марко Чеппі

1
У системі з 16 cpus, перехід від gzip до pigz скоротив час на tar 1,2,2 ТБ та передачу його по мережі та тестування результату від 18 годин резервного копіювання та 14 годин тесту до 4 годин резервного копіювання та 2 години тестування. Існує велика кількість потенційних вузьких місць, швидкість диска, швидкість мережі, потужність обробки, однак у цьому випадку це, безумовно, пов'язано з процесором більше, ніж пов'язано з IO. Це система високого класу, результати можуть відрізнятися. Не те, що це має значення, але це було на RHEL6
cs_alumnus

Відповіді:


32

Ви можете символізувати bzip2, bunzip2 і bzcat до lbzip2, а gzip, gunzip, gzcat і zcat до pigz:

sudo apt-get install lbzip2 pigz
cd /usr/local/bin
ln -s /usr/bin/lbzip2 bzip2
ln -s /usr/bin/lbzip2 bunzip2
ln -s /usr/bin/lbzip2 bzcat
ln -s /usr/bin/pigz gzip
ln -s /usr/bin/pigz gunzip
ln -s /usr/bin/pigz gzcat
ln -s /usr/bin/pigz zcat

Я вибрав lbzip2 замість pbzip2, тому що /usr/share/doc/lbzip2/README.gz виглядає "приємніше", ніж /usr/share/doc/pbzip2/README.gz. Також посібник з дьогтем розповідає про lbzip2 .

Редагувати:

pigz-2.1.6, що входить до Precision Pangolin, відмовляється розпаковувати файли з невідомими суфіксами (наприклад, initramfs - *. img). Це зафіксовано в pigz-2.2.4, який поставляється з Quantal. Тому ви можете зачекати, поки Quantal, встановіть пакет Quantal вручну або ще не зв’язуйте gunzip / gzcat / zcat.


7
Це добре, тому що / usr / local / bin / приходить раніше / bin / у $ PATH більшості людей. Якщо щось дзвонить / bin / gunzip безпосередньо або хтось має / bin першим у своєму $ PATH, вони не використовуватимуть pigz. Щоб зробити цю роботу для них, ви також можете використовувати dpk-divert і зробити щось подібне для всіх бінарних файлів, sudo dpkg-divert --divert /bin/gunzip.orig --rename /bin/gunzip; sudo ln -s /usr/bin/pigz /bin/gunzipале існує ймовірність, що pigz не на 100% сумісний з усіма прапорцями gzip, тому будьте обережні.
Марк МакКінстрі

31

Ідея symlink справді чудова.
Ще одне робоче рішення - псевдонім tar:

alias tar='tar --use-compress-program=pbzip2'

або відповідно

alias tar='tar --use-compress-program=pigz'

Це створює інший вид дефолту.


додаткова вигода: ви можете використовувати псевдонім на зразок 'partar', якщо хочете зберегти оригінальний функціонал (чомусь) .. на жаль 'ptar' взятий реалізацією perl
jena

13

Відповідь на симпосилання справді неправильна. Він замінить стандартний gzip (або bzip2) на pigz (або pbzip2) для всієї системи. Незважаючи на те, що паралельні реалізації надзвичайно схожі на версії єдиних процесів, тонкі відмінності у параметрах командного рядка можуть порушити основні системні процеси, які залежать від цих відмінностей.

Варіант "--use -press-program" - набагато кращий вибір. Другим варіантом (приблизно як псевдонім) було б встановити змінну середовища TAR_OPTIONS, підтримувану tar GNU:

$ export TAR_OPTIONS = "- використання-компрес-програма = pbzip2"
$ tar czf myfile.tar.bz2 mysubdir /

6
Я використовую символьні посилання з 2011 року зараз і не бачив жодних злому (крім випадків, зазначених у редакції). І якщо про такі тонкі відмінності не знайдемо і не повідомимо, ми будемо застрягати з непаралельними версіями назавжди. Якщо ви використовуєте TAR_OPTIONS = "- use -press-program = pbzip2", схоже, ви не можете розмежовувати bzip2 від gzip.
elmicha

Це не спрацювало для мене.
Дерек Перкінс

3

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

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

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

--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

-2

Використовуйте у своїх ~ / .bash_aliases:

alias gzip="pigz"
alias gunzip="unpigz"

1
Це буде працювати лише при виклику gzip(або gunzip) програми безпосередньо в командному рядку оболонки. На tarце не впливатимуть інші програми (наприклад ).
Крістіан Гудон
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.