Apa cara terbaik untuk menggunakan bzip2 dan gzip paralel secara default?

41

Bzip2 dan gzip hanya menggunakan satu inti, meskipun banyak komputer memiliki lebih dari satu inti. Tetapi ada program seperti lbzip2, pbzip2 dan pigz, yang menggunakan semua core yang tersedia dan berjanji untuk kompatibel dengan bzip2 dan gzip.

Jadi apa cara terbaik untuk menggunakan program-program ini secara default, sehingga tar cfa file.tar.bz2 directorymenggunakan lbzip2 / pbzip2 daripada bzip2? Tentu saja saya tidak ingin merusak apa pun.

elmicha
sumber
2
Karena penasaran dengan semua: Apakah paralel gzip / bzip benar-benar lebih cepat daripada serial? Saya akan membayangkan bahwa kecepatan penulisan hdd dan pengekangan lainnya lebih merupakan masalah.
con-f-use
@ con-f-use Tidak, kecuali jika Anda memiliki SSD secara teori, itu bisa lebih cepat karena ukuran total arsip meningkat.
Marco Ceppi
1
Pada sistem dengan 16 cpus, beralih dari gzip ke pigz mengurangi waktu menjadi tar 1.2TB dan mentransfernya melalui jaringan dan menguji hasilnya dari 18 jam cadangan dan 14 jam pengujian menjadi 4 jam cadangan dan 2 jam pengujian. Ada banyak potensi kemacetan, kecepatan disk, kecepatan jaringan, kekuatan pemrosesan namun dalam hal ini pasti cpu terikat lebih dari IO terikat. Ini adalah sistem kelas atas, hasil Anda dapat bervariasi. Bukan berarti itu penting, tetapi ini ada di RHEL6
cs_alumnus

Jawaban:

32

Anda dapat symlink bzip2, bunzip2 dan bzcat ke lbzip2, dan gzip, gunzip, gzcat, dan zcat ke 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

Saya memilih lbzip2 daripada pbzip2 karena /usr/share/doc/lbzip2/README.gz terlihat "lebih baik" daripada /usr/share/doc/pbzip2/README.gz. Juga, manual tar berbicara tentang lbzip2 .

Edit:

pigz-2.1.6, yang termasuk dalam Precise Pangolin, menolak untuk mendekompresi file dengan sufiks yang tidak diketahui (mis. initramfs - *. img). Ini diperbaiki dalam pigz-2.2.4, yang dikirimkan dengan Quantal. Jadi, Anda mungkin ingin menunggu sampai Quantal, menginstal paket Quantal secara manual, atau belum menautkan gunzip / gzcat / zcat.

elmicha
sumber
7
Ini berfungsi baik karena / usr / local / bin / hadir sebelum / bin / di $ PATH kebanyakan orang. Jika sesuatu memanggil / bin / gunzip secara langsung atau seseorang memiliki / bin terlebih dahulu di $ PATH mereka, mereka tidak akan menggunakan pigz. Untuk membuat ini bekerja untuk mereka juga, Anda bisa menggunakan dpk-alihkan dan melakukan sesuatu seperti ini untuk semua binari sudo dpkg-divert --divert /bin/gunzip.orig --rename /bin/gunzip; sudo ln -s /usr/bin/pigz /bin/gunziptetapi ada kemungkinan bahwa pigz tidak 100% kompatibel dengan semua flag gzip jadi hati-hati.
Mark McKinstry
31

Ide symlink sangat baik.
Solusi lain yang berhasil adalah alias tar:

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

atau masing-masing

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

Ini menciptakan jenis default lain.

Bastian Ebeling
sumber
manfaat tambahan: Anda dapat menggunakan alias seperti 'partar' jika Anda ingin mempertahankan fungsionalitas asli (untuk beberapa alasan) .. sayangnya 'ptar' diambil oleh implementasi perl
jena
13

Jawaban symlink benar-benar salah. Ini akan menggantikan gzip (atau bzip2) default dengan pigz (atau pbzip2) untuk seluruh sistem. Sementara implementasi paralel sangat mirip dengan versi proses tunggal, perbedaan halus dalam opsi baris perintah dapat merusak proses sistem inti yang bergantung pada perbedaan tersebut.

Opsi "--use-kompres-program" adalah pilihan yang jauh lebih baik. Opsi kedua (mirip alias) adalah mengatur variabel lingkungan TAR_OPTIONS yang didukung oleh tar GNU:

$ export TAR_OPTIONS = "- use-compress-program = pbzip2"
$ tar czf myfile.tar.bz2 mysubdir /
pengguna154053
sumber
6
Saya telah menggunakan symlink sejak 2011 sekarang dan tidak melihat kerusakan apa pun (terlepas dari kasus yang disebutkan dalam edit). Dan jika perbedaan halus seperti itu tidak ditemukan dan dilaporkan, kita akan terjebak dengan versi non-paralel selamanya. Jika Anda menggunakan TAR_OPTIONS = "- use-kompres-program = pbzip2" sepertinya Anda tidak dapat membedakan antara bzip2 dan gzip.
elmicha
Ini tidak berhasil untuk saya.
Derek Perkins
3

Salah satu opsi yang menarik adalah mengkompilasi ulang tar untuk menggunakan multithreaded secara default. Disalin dari jawaban stackoverflow ini

Kompilasi ulang dengan penggantian

Jika Anda membuat tar dari sumber, maka Anda dapat mengkompilasi ulang dengan parameter

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

Setelah mengkompilasi ulang tar dengan opsi ini, Anda dapat memeriksa output dari bantuan 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
Tom Koch
sumber
-2

Gunakan di ~ / .bash_aliases Anda:

alias gzip="pigz"
alias gunzip="unpigz"
bar foo
sumber
1
Ini hanya akan berfungsi ketika memanggil program gzip(atau gunzip) langsung pada command-line shell. Program lain (seperti tar) tidak akan terpengaruh oleh itu.
Christian Hudon