Tại sao các định dạng lưu trữ tar chuyển sang nén xz để thay thế bzip2 và còn gzip thì sao?


202

Ngày càng có nhiều tartài liệu lưu trữ sử dụng xzđịnh dạng dựa trên LZMA2 để nén thay vì bzip2(bz2)nén truyền thống . Trên thực tế, kernel.org đã đưa ra thông báo " Tạm biệt bzip2 " muộn vào ngày 27 tháng 12 năm 2013 , cho biết các nguồn kernel từ thời điểm này sẽ được phát hành ở cả định dạng tar.gz và tar.xz - và trên trang chính của trang web những gì được cung cấp trực tiếp là trong tar.xz.

Có bất kỳ lý do cụ thể giải thích tại sao điều này xảy ra và sự liên quan của gzipbối cảnh này là gì?

history  gzip  bzip2  xz 

Câu trả lời:


198

Để phân phối tài liệu lưu trữ qua Internet, những điều sau đây thường được ưu tiên:

  1. Tỷ lệ nén (nghĩa là máy nén tạo ra dữ liệu nhỏ như thế nào);
  2. Thời gian giải nén (yêu cầu CPU);
  3. Yêu cầu giải nén bộ nhớ; và
  4. Khả năng tương thích (mức độ lan rộng của chương trình giải nén)

Yêu cầu về bộ nhớ và CPU không phải là rất quan trọng, bởi vì bạn có thể sử dụng một máy lớn nhanh cho điều đó và bạn chỉ phải thực hiện một lần.

So với bzip2, xz có tỷ lệ nén tốt hơn và thời gian giải nén (tốt hơn) thấp hơn. Tuy nhiên, nó ở các cài đặt nén thường được sử dụng, đòi hỏi nhiều bộ nhớ hơn để giải nén [1] và có phần ít phổ biến hơn. Gzip sử dụng ít bộ nhớ hơn một trong hai.

Vì vậy, cả lưu trữ định dạng gzip và xz đều được đăng, cho phép bạn chọn:

  • Cần giải nén trên máy có bộ nhớ rất hạn chế (<32 MB): gzip. Cho, không có nhiều khả năng khi nói về nguồn kernel.
  • Cần giải nén các công cụ tối thiểu có sẵn: gzip
  • Muốn tiết kiệm thời gian tải xuống và / hoặc băng thông: xz

Thực sự không có sự kết hợp thực tế của các yếu tố khiến bạn phải chọn bzip2. Vì vậy, nó đang dần bị loại bỏ.

Tôi đã xem các so sánh nén trong một bài đăng trên blog . Tôi đã không cố gắng sao chép các kết quả và tôi nghi ngờ một số kết quả đã thay đổi (chủ yếu, tôi mong đợi xzđã được cải thiện, vì đây là kết quả mới nhất.)

(Có một số trường hợp cụ thể trong đó việc triển khai bzip2 tốt có thể thích hợp hơn với xz: bzip2 có thể nén một tệp có nhiều chuỗi số 0 và DNA bộ gen tốt hơn xz. sau điểm tham nhũng và nén song song và giải nén [về lý thuyết]. Trước đây, chỉ có bzip2 cung cấp những thứ này. [2] Tuy nhiên không có cái nào trong số này có liên quan đến phân phối kernel)


1: Trong kích thước lưu trữ, xz -3là xung quanh bzip -9. Sau đó xz sử dụng ít bộ nhớ hơn để giải nén. Nhưng xz -9(như, ví dụ, được sử dụng cho tarball nhân Linux) sử dụng nhiều hơn bzip -9. (Và thậm chí xz -0cần nhiều hơn gzip -9).

2: Thay đổi toàn hệ thống F21: lbzip2 làm triển khai bzip2 mặc định


Bất kỳ bình luận nào về chủ đề về khả năng chịu lỗi hoặc là một cái gì đó luôn được thực hiện hoàn toàn bên ngoài các thuật toán nén?

1
Khả năng phục hồi @ illuminÉ không thể được cung cấp mà không hy sinh tỷ lệ nén. Đây là một vấn đề trực giao và trong khi các công cụ như Parchive tồn tại, để phân phối xử lý lỗi của hạt nhân TCP cũng thực hiện công việc đó.
Tobu

2
@ illuminÉ Dung sai lỗi (giả sử bạn có nghĩa là tương tự như par2) thường không phải là mối quan tâm với việc phân phối tài liệu lưu trữ qua Internet. Tải xuống được giả định đủ đáng tin cậy (và bạn chỉ có thể tải xuống lại nếu nó bị hỏng). Băm mật mã và chữ ký thường được sử dụng, và chúng phát hiện tham nhũng cũng như giả mạo. Có những máy nén cho khả năng chịu lỗi lớn hơn, mặc dù với chi phí tỷ lệ nén. Dường như không ai tìm thấy sự đánh đổi xứng đáng cho việc tải xuống HTTP hoặc FTP.
derobert

xz sử dụng bộ nhớ LESS để giải nén.
MichalH

@Mike Nó đã thay đổi kể từ khi tôi viết bài này? Đặc biệt, chú thích một giải thích việc sử dụng bộ nhớ.
derobert

45

Trước hết, câu hỏi này không liên quan trực tiếp đến tar. Tar chỉ tạo một kho lưu trữ không nén, nén sau đó được áp dụng sau này.

Gzip được biết là tương đối nhanh khi so sánh với LZMA2 và bzip2. Nếu vấn đề tốc độ, gzip(đặc biệt là việc thực hiện đa luồng pigz) thường là một sự thỏa hiệp tốt giữa tốc độ nén và tỷ lệ nén. Mặc dù có những lựa chọn thay thế nếu tốc độ là một vấn đề (ví dụ LZ4).

Tuy nhiên, nếu tỷ lệ nén cao là nhịp đập LZMA2 mong muốn bzip2ở hầu hết mọi khía cạnh. Tốc độ nén thường chậm hơn, nhưng nó giải nén nhanh hơn nhiều và cung cấp tỷ lệ nén tốt hơn nhiều với chi phí sử dụng bộ nhớ cao hơn.

Không có nhiều lý do để sử dụng bzip2nữa, ngoại trừ khả năng tương thích ngược. Hơn nữa, LZMA2 được coi là đa luồng trong tâm trí và nhiều triển khai theo mặc định sử dụng CPU đa lõi (tiếc là xztrên Linux chưa làm được điều này). Điều này có ý nghĩa vì tốc độ đồng hồ sẽ không tăng thêm nữa nhưng số lượng lõi sẽ.

Có các bzip2triển khai đa luồng (ví dụ pbzip), nhưng chúng thường không được cài đặt theo mặc định. Cũng lưu ý rằng đa luồng bzip2chỉ thực sự thanh toán trong khi nén trong khi giải nén sử dụng một luồng duy nhất nếu tệp được nén bằng một luồng đơn bzip2, trái ngược với LZMA2. Các bzip2biến thể song song chỉ có thể tận dụng CPU đa lõi nếu tệp được nén bằng bzip2phiên bản song song , thường không phải là trường hợp.


4
Vâng một số tars Grok một zlựa chọn.
tchrist

"tốc độ" tạo ra một câu trả lời sai lầm, bạn nên tham khảo tốc độ nén hoặc tốc độ giải nén. Cả pixz, pbzip2 hoặc pigz đều không được cài đặt theo mặc định (hoặc được sử dụng bởi tar mà không có cờ -I), nhưng pixz và pbzip2 tăng tốc độ nén và giải nén và pigz chỉ để nén.
Tobu

@Tobu xzsẽ được đa luồng theo mặc định để không cần pixzcài đặt trong tương lai. Trên một số nền tảng xzluồng được hỗ trợ. Trong khi đó, bzip2sẽ không bao giờ được đa luồng vì định dạng không được thiết kế với đa luồng trong tâm trí. Hơn nữa, pbzip2chỉ tăng tốc độ giải nén nếu tập tin đã được nén bằng cách sử dụng pbzip2thường không phải là trường hợp.
Marco

1
@Marco Tôi tin rằng lbzip2 cho phép giải nén song song các tệp ngay cả khi chúng được nén với cách triển khai không song song (ví dụ stock bzip2). Đó là lý do tại sao tôi sử dụng lbzip2 trên pbzip2. (Có thể điều này đã phát triển kể từ nhận xét của bạn.)
RaveTheTadpole

19

Câu trả lời ngắn : xz hiệu quả hơn về tỷ lệ nén. Vì vậy, nó tiết kiệm không gian đĩa và tối ưu hóa việc truyền qua mạng.
Bạn có thể xem Điểm chuẩn nhanh này để khám phá sự khác biệt bằng các thử nghiệm thực tế.


Liên kết bị hỏng.
flarn2006

18

LZMA2 là một hệ thống nén khối trong khi gzip thì không. Điều này có nghĩa là LZMA2 cho vay đa luồng. Ngoài ra, nếu tham nhũng xảy ra trong kho lưu trữ, bạn thường có thể khôi phục dữ liệu từ các khối tiếp theo với LZMA2 nhưng bạn không thể thực hiện việc này với gzip. Trong thực tế, bạn mất toàn bộ kho lưu trữ với gzip sau khối bị hỏng. Với kho lưu trữ LZMA2, bạn chỉ mất (các) tệp bị ảnh hưởng bởi (các) khối bị hỏng. Điều này có thể quan trọng trong kho lưu trữ lớn hơn với nhiều tệp.


2
Đây là một sự phân biệt rất hữu ích và quan trọng, thực sự!
leden
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.