Cách tốt nhất để sử dụng song song bzip2 và gzip là gì?


41

Bzip2 và gzip chỉ sử dụng một lõi, mặc dù nhiều máy tính có nhiều hơn một lõi. Nhưng có những chương trình như lbzip2, pbzip2 và pigz, sử dụng tất cả các lõi có sẵn và hứa sẽ tương thích với bzip2 và gzip.

Vì vậy, cách tốt nhất để sử dụng các chương trình này theo mặc định, để tar cfa file.tar.bz2 directorysử dụng lbzip2 / pbzip2 thay vì bzip2? Tất nhiên tôi không muốn phá vỡ bất cứ điều gì.


2
Vì tò mò với tất cả: Liệu gzip / bzip song song có thực sự nhanh hơn nối tiếp không? Tôi sẽ hình dung rằng tốc độ viết hdd và các hạn chế khác là một vấn đề.
con-f-use

@ con-f-use Không trừ khi bạn có SSD về mặt lý thuyết, nó có thể nhanh hơn khi tổng kích thước của kho lưu trữ tăng lên.
Marco Ceppi

1
Trên hệ thống có 16 cpus, việc chuyển đổi từ gzip sang pigz đã giảm thời gian xuống tar 1.2TB và chuyển qua mạng và kiểm tra kết quả từ 18 giờ sao lưu và 14 giờ thử nghiệm thành 4 giờ sao lưu và 2 giờ thử nghiệm. Có rất nhiều nút thắt tiềm năng, tốc độ ổ đĩa, tốc độ mạng, sức mạnh xử lý, tuy nhiên trong trường hợp này, điều này chắc chắn là cpu bị ràng buộc nhiều hơn giới hạn IO. Đây là một hệ thống cao cấp, kết quả của bạn có thể thay đổi. Không phải là vấn đề, nhưng đây là trên RHEL6
cs_alumnus

Câu trả lời:


32

Bạn có thể symlink bzip2, bunzip2 và bzcat đến lbzip2 và gzip, gunzip, gzcat và zcat đến 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

Tôi đã chọn lbzip2 thay vì pbzip2 vì /usr/share/doc/lbzip2/README.gz trông "đẹp hơn" so với /usr/share/doc/pbzip2/README.gz. Ngoài ra, hướng dẫn sử dụng tar nói về lbzip2 .

Biên tập:

pigz-2.1.6, được bao gồm trong Precolin Pangolin, từ chối giải nén các tệp có hậu tố không xác định (ví dụ: initramfs - *. img). Điều này được cố định trong pigz-2.2.4, tàu có Quantal. Vì vậy, bạn có thể muốn đợi cho đến khi Quantal, cài đặt gói Quantal theo cách thủ công hoặc chưa liên kết gunzip / gzcat / zcat.


7
Điều này hoạt động tốt bởi vì / usr / local / bin / đến trước / bin / trong hầu hết mọi người $ PATH. Nếu một cái gì đó gọi / bin / gunzip trực tiếp hoặc ai đó có / bin đầu tiên trong $ PATH của họ, họ sẽ không sử dụng pigz. Để làm việc này cho họ cũng như bạn có thể sử dụng dpk-redirect và làm một cái gì đó như thế này cho tất cả các nhị phân sudo dpkg-divert --divert /bin/gunzip.orig --rename /bin/gunzip; sudo ln -s /usr/bin/pigz /bin/gunzipnhưng có khả năng pigz không tương thích 100% với tất cả các cờ gzip, vì vậy hãy cẩn thận.
Đánh dấu McKinstry

31

Ý tưởng symlink thực sự tốt.
Một giải pháp làm việc khác là bí danh tar:

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

hoặc tương ứng

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

Nó tạo ra một loại mặc định khác.


thêm lợi ích: bạn có thể sử dụng bí danh như 'partar' nếu bạn muốn duy trì chức năng ban đầu (vì một số lý do) .. đáng buồn là 'ptar' được thực hiện bằng cách thực hiện perl
jena

13

Câu trả lời symlink thực sự không chính xác. Nó sẽ thay thế gzip mặc định (hoặc bzip2) bằng pigz (hoặc pbzip2) cho toàn bộ hệ thống. Mặc dù các triển khai song song tương tự đáng kể với các phiên bản quy trình đơn, sự khác biệt tinh tế trong các tùy chọn dòng lệnh có thể phá vỡ các quy trình hệ thống cốt lõi, những người phụ thuộc vào những khác biệt đó.

Tùy chọn "--use-nén-chương trình" là một lựa chọn tốt hơn nhiều. Tùy chọn thứ hai (giống như bí danh) sẽ là đặt biến môi trường TAR_OPTIONS được hỗ trợ bởi GNU tar:

$ export TAR_OPTIONS = "- use-nén-chương trình = pbzip2"
$ tar czf myfile.tar.bz2 mysubdir /

6
Tôi đã sử dụng các liên kết tượng trưng từ năm 2011 và không thấy bất kỳ sự cố nào (ngoài trường hợp được đề cập trong chỉnh sửa). Và nếu những khác biệt tinh tế như vậy không được tìm thấy và báo cáo, chúng ta sẽ bị mắc kẹt với các phiên bản không song song mãi mãi. Nếu bạn sử dụng TAR_OPTIONS = "- use-compression-program = pbzip2" thì có vẻ như bạn không thể phân biệt được giữa bzip2 và gzip.
elmicha

Điều này đã không làm việc cho tôi.
Derek Perkins

3

Một tùy chọn hấp dẫn là biên dịch lại tar để sử dụng đa luồng theo mặc định. Sao chép từ câu trả lời stackoverflow này

Biên dịch lại với sự thay thế

Nếu bạn xây dựng tar từ các nguồn, thì bạn có thể biên dịch lại với các tham số

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

Sau khi biên dịch lại tar với các tùy chọn này, bạn có thể kiểm tra đầu ra của trợ giúp của 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

Sử dụng trong ~ / .bash_aliases của bạn:

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

1
Điều này sẽ chỉ hoạt động khi gọi chương trình gzip(hoặc gunzip) trực tiếp trên dòng lệnh của shell. Các chương trình khác (như tar) sẽ không bị ảnh hưởng bởi điều đó.
Christian Hudon
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.