Sử dụng đa lõi để nén / giải nén tar + gzip / bzip


225

Tôi thường nén bằng cách sử dụng tar zcvfvà giải nén bằng cách sử dụng tar zxvf(sử dụng gzip do thói quen).

Gần đây tôi đã nhận được một CPU lõi tứ với siêu phân luồng, vì vậy tôi có 8 lõi logic và tôi nhận thấy rằng nhiều lõi không được sử dụng trong quá trình nén / giải nén.

Có cách nào tôi có thể sử dụng các lõi không sử dụng để làm cho nó nhanh hơn không?


Giải pháp được đề xuất bởi Xiong Chiamiov ở trên hoạt động rất đẹp. Tôi vừa sao lưu máy tính xách tay của mình bằng .tar.bz2 và phải mất 132 phút chỉ sử dụng một luồng cpu. Sau đó, tôi đã biên dịch và cài đặt tar từ nguồn: gnu.org/software/tar Tôi đã bao gồm các tùy chọn được đề cập trong bước cấu hình: ./configure --with-gzip = pigz --with-bzip2 = lbzip2 --with-lzip = plzip Tôi chạy lại bản sao lưu và chỉ mất 32 phút. Đó là tốt hơn so với cải thiện 4X! Tôi đã xem màn hình hệ thống và nó giữ tất cả 4 cpus (8 luồng) phẳng 100% toàn bộ thời gian. THAT là giải pháp tốt nhất.
Warren Severin

Câu trả lời:


309

Bạn có thể sử dụng pigz thay vì gzip, nén gzip trên nhiều lõi. Thay vì sử dụng tùy chọn -z, bạn sẽ chuyển nó qua pigz:

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

Theo mặc định, pigz sử dụng số lượng lõi có sẵn hoặc tám nếu nó không thể truy vấn đó. Bạn có thể yêu cầu nhiều hơn với -pn, ví dụ -p 32. pigz có các tùy chọn tương tự như gzip, vì vậy bạn có thể yêu cầu nén tốt hơn với -9. Ví dụ

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

3
Làm thế nào để bạn sử dụng pigz để giải nén trong cùng một thời trang? Hay nó chỉ hoạt động để nén?
dùng788171

42
pigz không sử dụng nhiều lõi để giải nén, nhưng chỉ với sự cải thiện hạn chế so với một lõi đơn. Các định dạng giảm phát không cho vay để giải nén song song. Phần giải nén phải được thực hiện ser seri. Các lõi khác để giải nén pigz được sử dụng để đọc, viết và tính toán CRC. Khi nén Mặt khác, pigz được gần một yếu tố của n thiện với n lõi.
Đánh dấu Adler

7
Dấu gạch nối ở đây là thiết bị xuất chuẩn (xem trang này ).
Garrett

3
Đúng. Tương thích 100% theo cả hai hướng.
Đánh dấu Adler

4
Thực sự không có thời gian CPU dành cho tarring, vì vậy nó sẽ không giúp được gì nhiều. Định dạng tar chỉ là một bản sao của tệp đầu vào với các khối tiêu đề ở giữa các tệp.
Mark Adler

324

Bạn cũng có thể sử dụng cờ tar "--use-compression-program =" để cho tar biết chương trình nén nào sẽ sử dụng.

Ví dụ sử dụng:

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

21
Đây là một chút kiến ​​thức tuyệt vời và xứng đáng nhận được nhiều sự ủng hộ hơn. Tôi không biết tùy chọn này thậm chí còn tồn tại và tôi đã đọc trang người đàn ông vài lần trong nhiều năm.
Randall Hunt

2
@ValerioSchiavoni: Không phải ở đây, tôi tải đầy đủ trên cả 4 lõi (Ubuntu 15.04 'Sống động').
bovender

8
Tôi thích tar - dir_to_zip | pv | pigz > tar.filepv giúp tôi ước tính, bạn có thể bỏ qua nó. Nhưng vẫn dễ viết và nhớ hơn.
Offenso

@ NathanS.Watson-Haigh Có bạn. Chỉ cần đính kèm tên chương trình và các đối số trong dấu ngoặc kép. man tarnói như vậy, cũng như điều này .
Marc.2377

1
Năm 2020, zstdlà công cụ nhanh nhất để làm điều này. Tăng tốc đáng chú ý trong khi nén và giải nén. Sử dụng tar -cf --use-compress-program=zstdmtđể làm như vậy với đa luồng.
jadelord

112

Cách tiếp cận phổ biến

Có tùy chọn cho tarchương trình:

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

Bạn có thể sử dụng phiên bản đa luồng của tiện ích lưu trữ hoặc máy nén.

Hầu hết các trình lưu trữ đa luồng phổ biến là pigz (thay vì gzip) và pbzip2 (thay vì bzip2). Ví dụ:

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

Archiver phải chấp nhận -d. Nếu tiện ích thay thế của bạn không có tham số này và / hoặc bạn cần chỉ định các tham số bổ sung, thì hãy sử dụng đường ống (thêm tham số nếu cần):

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

Đầu vào và đầu ra của singlethread và multithread tương thích. Bạn có thể nén bằng phiên bản đa luồng và giải nén bằng phiên bản singlethread và ngược lại.

p7zip

Để nén p7zip, bạn cần một tập lệnh shell nhỏ như sau:

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

Lưu nó dưới dạng 7zhelper.sh. Dưới đây là ví dụ về cách sử dụng:

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

xz

Về hỗ trợ XZ đa luồng. Nếu bạn đang chạy phiên bản 5.2.0 trở lên của XZ Utils, bạn có thể sử dụng nhiều lõi để nén bằng cách đặt -Thoặc --threadsđến một giá trị phù hợp thông qua biến môi trường XZ_DEFAULTS (ví dụ XZ_DEFAULTS="-T 0").

Đây là một mảnh của người đàn ông cho phiên bản 5.1.0alpha:

Nén và giải nén đa luồng chưa được triển khai, vì vậy tùy chọn này hiện không có hiệu lực.

Tuy nhiên, điều này sẽ không hoạt động để giải nén các tệp chưa được nén khi bật luồng. Từ người đàn ông cho phiên bản 5.2.2:

Giải nén theo luồng chưa được thực hiện. Nó sẽ chỉ hoạt động trên các tệp chứa nhiều khối có thông tin kích thước trong các tiêu đề khối. Tất cả các tệp được nén ở chế độ đa luồng đều đáp ứng điều kiện này, nhưng các tệp được nén ở chế độ một luồng không ngay cả khi --block-size = size được sử dụng.

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

1
Đây thực sự là câu trả lời tốt nhất. Tôi chắc chắn sẽ xây dựng lại tar của tôi!

1
Tôi chỉ tìm thấy pbzip2mpibzip2 . mpibzip2 trông rất hứa hẹn cho các cụm hoặc nếu bạn có một máy tính xách tay và máy tính để bàn đa lõi chẳng hạn.

Đây là một câu trả lời tuyệt vời và công phu. Có thể tốt khi đề cập rằng nén đa luồng (ví dụ với pigz) chỉ được bật khi nó đọc từ tệp. Xử lý STDIN trên thực tế có thể chậm hơn.
oᴉɹǝɥɔ

3
Cộng 1 cho xztùy chọn. Đó là cách tiếp cận đơn giản nhất, nhưng hiệu quả.
selurvedu

2
export XZ_DEFAULTS="-T 0"trước khi gọi tarvới tùy chọn -Jcho nén xz hoạt động như một nét duyên dáng.
scai

13

Bạn có thể sử dụng phím tắt -Icho --use-compress-programchuyển đổi tar và gọi pbzip2để nén bzip2 trên nhiều lõi:

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

Một TL tốt đẹp cho câu trả lời của @ MaximSuslov .
einpoklum

Điều này trả về tar: home/cc/ziptest: Cannot stat: No such file or directory tar: Exiting with failure status due to previous errors`
Arash

1

Nếu bạn muốn linh hoạt hơn với tên tệp và tùy chọn nén, bạn có thể sử dụng:

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

Bước 1: find

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

Lệnh này sẽ tìm các tệp bạn muốn lưu trữ, trong trường hợp này /my/path/*.sql/my/path/*.log. Thêm nhiều -o -name "pattern"như bạn muốn.

-execsẽ thực thi lệnh tiếp theo bằng các kết quả của find:tar

Bước 2: tar

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

--transformlà một tham số thay thế chuỗi đơn giản. Nó sẽ loại bỏ đường dẫn của các tệp từ kho lưu trữ để gốc của tarball trở thành thư mục hiện tại khi giải nén. Lưu ý rằng bạn không thể sử dụng -Ctùy chọn để thay đổi thư mục vì bạn sẽ mất lợi ích của find: tất cả các tệp của thư mục sẽ được bao gồm.

-Pyêu tarcầu sử dụng các đường dẫn tuyệt đối, do đó, nó không kích hoạt cảnh báo "Loại bỏ` / 'hàng đầu khỏi tên thành viên ". Dẫn đầu '/' bằng cách --transformnào cũng được xóa .

-cf -nói tarđể sử dụng tên tarball, chúng tôi sẽ chỉ định sau

{} +sử dụng mọi tệp findđược tìm thấy trước đó

Bước 3: pigz

pigz -9 -p 4

Sử dụng nhiều tham số như bạn muốn. Trong trường hợp -9này là mức nén và -p 4là số lõi dành riêng cho nén. Nếu bạn chạy nó trên một máy chủ web tải nặng, có lẽ bạn không muốn sử dụng tất cả các lõi có sẵn.

Bước 4: lưu trữ tên

> myarchive.tar.gz

Cuối cùng.


0

Một công cụ nén (de) tương đối mới hơn mà bạn có thể muốn xem xét là zst Chuẩn . Nó thực hiện một công việc tuyệt vời là sử dụng các lõi dự phòng và nó đã tạo ra một số sự đánh đổi lớn khi nói đến tỷ lệ nén so với (de) thời gian nén. Nó cũng có khả năng điều chỉnh cao tùy thuộc vào nhu cầu tỷ lệ nén của bạn.

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.