Sự khác biệt giữa các hệ thống nén nén khác nhau là gì?


9

Tôi đã luôn sử dụng TAR và ZIP để nén, nhưng gần đây tôi đã nghe nói về *.Zthuật toán nén. Điều này đưa ra một câu hỏi cho tôi:

Với tất cả các hệ thống nén này, cái nào là tốt nhất cho sử dụng chung và nén?

Chạy một vài thử nghiệm, tôi đã phát hiện ra rằng tar, như tôi đã khám phá, KHÔNG thực sự nén (trừ khi được chỉ định rõ ràng). Có nghĩa là, nó là gì tốt so với các phương pháp nén khác?

Tôi đã nhận thức được rằng bưu điện là hệ thống nén hầu hết sử dụng rộng rãi, nhưng tôi nên sử dụng nó thay vì *.Z, *.7z, .tar, hay .tar.<insert ending here>?

Tóm tắt bài viết:

  1. Tôi có nên sử dụng *.tar, *.Z, *.7z, .tar, hoặc .tar.<insert ending here>cho nén tốt nhất?
  2. Nếu đồng bằng *.tarkhông nén, tại sao chúng ta sử dụng nó?

EDIT: Không phải tất cả các thuật toán đều cho phép lưu trữ các quyền của Linux (từ những gì tôi đã học). Cái nào làm được, và có một số loại hack (hoặc script) mà tôi có thể sử dụng để lưu trữ quyền?


Không cần phải nói những thứ đó, chỉ cần chọn một trong những bình chọn hàng đầu hoặc một trong những thứ mà bạn thấy hữu ích nhất :)
Seth

Câu trả lời:


17

tarlà viết tắt của băng lưu trữ. Tất cả những gì nó làm là đóng gói các tệp và siêu dữ liệu của chúng (quyền, quyền sở hữu, v.v.) vào một luồng byte có thể được lưu trữ trên ổ đĩa băng (hoặc tệp) và được khôi phục sau đó. Nén là một vấn đề hoàn toàn riêng biệt mà bạn đã từng phải dẫn đầu ra thông qua một tiện ích bên ngoài để nén nếu muốn điều đó. GNU tar đủ đẹp để thêm các công tắc để bảo nó tự động lọc đầu ra thông qua tiện ích thích hợp làm lối tắt.

Zip và 7z kết hợp việc lưu trữ và nén lại với nhau thành định dạng vùng chứa riêng và chúng có nghĩa là đóng gói các tệp trên hệ thống DOS / Windows, vì vậy chúng không lưu trữ quyền và quyền sở hữu unix. Do đó, nếu bạn muốn lưu trữ các quyền để sao lưu thích hợp, bạn cần phải sử dụng tar. Nếu bạn có kế hoạch trao đổi các tệp với người dùng Windows, thì zip hoặc 7z là tốt. Các thuật toán nén thực tế zip và sử dụng 7zip có thể được sử dụng với tar, bằng cách uzing gziplzmatương ứng.

lzma (còn gọi là. * .xz) có một trong những tỷ lệ nén tốt nhất và khá nhanh trong việc giải nén, khiến nó trở thành lựa chọn hàng đầu hiện nay. Tuy nhiên, nó đòi hỏi rất nhiều thời gian ram và cpu để nén. Khả gzipnăng nén nhanh hơn một chút khi nén, vì vậy có thể được sử dụng nếu bạn không muốn dành nhiều thời gian cpu đó. Nó cũng có một biến thể thậm chí nhanh hơn gọi là lzop. bzip2vẫn còn khá phổ biến vì nó đã thay thế phần lớn gzip trong một thời gian trước khi 7zip / lzma xuất hiện, vì nó có tỷ lệ nén tốt hơn, nhưng ngày nay không được ưa chuộng vì 7z / lzma nhanh hơn khi giải nén và có tỷ lệ nén tốt hơn. Các compresstiện ích, mà thông thường các file tên * .Z, là cổ kính và lãng quên từ lâu.

Một trong những khác biệt quan trọng khác giữa zip và tar là zip nén dữ liệu thành các phần nhỏ, trong khi đó khi bạn nén một tệp tar, bạn nén toàn bộ dữ liệu cùng một lúc. Cái sau cho tỷ lệ nén tốt hơn, nhưng để trích xuất một tệp duy nhất ở cuối kho lưu trữ, bạn phải giải nén toàn bộ để có được nó. Do đó, định dạng zip tốt hơn trong việc trích xuất một hoặc hai tệp từ một kho lưu trữ lớn. 7z và darcho phép bạn chọn nén toàn bộ (được gọi là chế độ "rắn") hoặc khối nhỏ để dễ dàng trích xuất từng phần.


Nhưng, chỉ TAR hỗ trợ siêu dữ liệu? Hoặc gzip / bzip2 hiện cũng hỗ trợ siêu dữ liệu
Kaz Wolfe

@pacificfils, các tiện ích nén chỉ nén một tệp duy nhất, không có siêu dữ liệu.
psusi

Có thể một tar một thư mục và sau đó đặt nó trong một zip và bảo vệ quyền mặc dù?
Kaz Wolfe

@pacificfils, vâng, nhưng sẽ hơi ngớ ngẩn vì bạn sẽ từ bỏ lợi ích của zip và tỷ lệ nén tốt hơn gzip.
psusi

@pacificfils tar cfpsẽ bảo vệ quyền. Một tệp tar không được nén, do đó, zip (7-zip), gzip2, gzip, lzo, v.v ... tất cả sẽ nén một tệp tar tốt (nói chung, một tệp tar nén không có khả năng nén được).
Elliott Frisch

9

Các chi tiết của các thuật toán không có chủ đề ở đây 1 vì chúng không theo bất kỳ cách cụ thể nào đối với Linux, chứ đừng nói đến Ubuntu. Tuy nhiên, bạn sẽ tìm thấy một số thông tin tốt đẹp ở đây .

Bây giờ tar, như bạn đã nói, tarkhông phải và chưa bao giờ là một chương trình nén. Thay vào đó, nó là một người lưu trữ ; Mục đích chính của nó là tạo ra một tệp lớn trong số rất nhiều tệp nhỏ. Trong lịch sử, điều này là để tạo điều kiện cho việc lưu trữ trên các ổ đĩa băng, do đó có tên: Băng ARchive.

Ngày nay, lý do chính để sử dụng tarlà để giảm số lượng tệp trên hệ thống của bạn. Mỗi tập tin trên một hệ thống tập tin Unix chiếm một inode , các tập tin nhiều hơn bạn có, các inodes ít sẵn và khi bạn chạy ra khỏi inodes, bạn có thể không còn tạo tập tin mới. Nói một cách đơn giản, cùng một lượng dữ liệu được lưu trữ như hàng ngàn tệp sẽ chiếm nhiều ổ cứng của bạn hơn các tệp tương tự trong một kho lưu trữ tar.

Để minh họa, vì điều này đã được tranh luận trong các nhận xét, trên /phân vùng 68G của tôi , tôi có số lượng các nút và tổng số được sử dụng sau đây (lưu ý rằng số lượng inode phụ thuộc vào loại hệ thống tệp và kích thước của phân vùng):

Inode count:              393216
Free inodes:              171421

Nếu bây giờ tôi tiến hành cố gắng tạo nhiều tệp hơn số tôi có inodes:

$ touch {1..171422}
touch: cannot touch ‘171388’: No space left on device
touch: cannot touch ‘171389’: No space left on device
touch: cannot touch ‘171390’: No space left on device
touch: cannot touch ‘171391’: No space left on device
touch: cannot touch ‘171392’: No space left on device
touch: cannot touch ‘171393’: No space left on device
touch: cannot touch ‘171394’: No space left on device
touch: cannot touch ‘171395’: No space left on device
touch: cannot touch ‘171396’: No space left on device
touch: cannot touch ‘171397’: No space left on device

Không có không gian? Nhưng tôi có vô số không gian:

$ df -h
Filesystem      Size  Used Avail Use% Mounted on
/dev/sda1       5,8G  4,3G  1,2G  79% /

Như bạn có thể thấy ở trên, việc tạo ra vài trăm nghìn tệp trống sẽ nhanh chóng làm cạn kiệt các nút của tôi và tôi không còn có thể tạo các tệp mới. Nếu tôi làm tarđiều này, tôi sẽ có thể bắt đầu tạo lại các tập tin.

Có ít tệp hơn cũng giúp tăng tốc đáng kể I / O của hệ thống tệp, đặc biệt là trên các hệ thống tệp được gắn NFS. Tôi luôn tar các thư mục công việc cũ của mình khi một dự án kết thúc vì tôi có ít tệp hơn, các chương trình nhanh hơn findsẽ hoạt động.

Có một câu trả lời tuyệt vời về Super User đi sâu vào chi tiết hơn, nhưng ngoài những lý do cơ bản khác, tại sao tarngày nay vẫn còn phổ biến là:

  1. Hiệu quả: sử dụng tarđể chuyển qua chương trình nén như thế nào gziplà hiệu quả hơn vì nó tránh được việc tạo các tệp trung gian.

  2. tar đi kèm với tất cả các loại chuông và còi, các tính năng đã được thiết kế trong lịch sử lâu đời của nó khiến nó đặc biệt hữu ích cho các bản sao lưu * nix (nghĩ quyền, quyền sở hữu tệp, khả năng chuyển dữ liệu thẳng đến STDOUT và qua liên kết SSH ... )

  3. Quán tính Chúng ta đã quen tar. Sẽ an toàn khi cho rằng nó sẽ khả dụng trên bất kỳ * nix nào bạn có thể sử dụng, điều này làm cho nó rất dễ mang theo và tiện dụng cho các tarball mã nguồn.


1 Điều này hoàn toàn đúng và không liên quan gì đến thực tế là tôi không biết đủ về họ để giải thích :)


3
Máy tính của tôi đã có (trong quá khứ) lên tới 10.000.000 tệp và điều đó không thực sự quá điên rồ. Tôi không bao giờ sử dụng tarđể "giảm số lượng tệp" vì hầu hết các hệ thống tệp thực sự không quan tâm và dù sao nó cũng không thực sự tối ưu vì tarkhông hỗ trợ truy cập ngẫu nhiên vào các tệp dễ dàng. Thay vào đó, công dụng chính (đối với tôi và tôi nghĩ đối với hầu hết mọi người) là chia sẻ tệp (ví dụ mã nguồn) với người khác một cách đơn giản.
nneonneo

@nneonneo bạn có bao giờ phải làm việc với hàng triệu tập tin trong một đơn thư mục? Tôi có và tin tôi rằng nó không dễ dàng. Ngoài những vấn đề rõ ràng với ARG_MAX, điều này có thể khiến việc xử lý các tệp của bạn trở nên rắc rối và thực sự có thể mang lại một mạng được thiết lập (rất tệ) nơi các tệp được lưu trữ trong một máy chủ trung tâm và chia sẻ với NFS đến đầu gối của nó. Đối với việc giảm tổng số tệp, bạn sẽ cần nhiều tệp hơn mức cần chú ý nhưng trong thiết lập nhiều người dùng, số lượng nút thực sự có thể trở nên hạn chế.
terdon

@nneonneo để đưa ra một ví dụ cụ thể hơn, tune2fs -ltrên phân vùng giữ $ HOME của tôi cho tôi biết tôi có 19.300.352 inodes. Tôi sẽ không thể tạo nhiều tệp hơn thế. Như bạn đã nói, 10 ^ 6 không điên, thậm chí không ở trong phạm vi cao hơn. Tùy thuộc vào những gì bạn đang làm, bạn có thể có nhu cầu cách nhiều hơn thế.
terdon

@nneonneo xem câu trả lời được cập nhật cho một ví dụ trong thế giới thực về cách bạn có thể dễ dàng hết inodes.
terdon

Máy chủ của tôi đang sử dụng chỉ hơn 1 triệu inodes và đó chỉ là do tôi có một tấn email (rất nhiều danh sách gửi thư lưu lượng truy cập cao trong nhiều năm) và lưu trữ ở định dạng Maildir. Tôi không biết bạn có thể làm gì để sử dụng tới 19 triệu nút. Bạn sẽ phải tạo một tệp mới mỗi giây, 24 giờ một ngày, trong hơn 7 tháng.
psusi

4

Có hai nhiệm vụ riêng biệt nhưng có liên quan. Đóng gói một cây tệp (bao gồm tên tệp, cấu trúc thư mục, quyền hệ thống tệp, quyền sở hữu và bất kỳ siêu dữ liệu nào khác) vào một luồng byte được gọi là lưu trữ . Loại bỏ sự dư thừa trong một luồng byte để tạo ra một luồng byte nhỏ hơn được gọi là nén .

Trên Unix, hai hoạt động được tách ra, với các công cụ riêng biệt cho từng hoạt động. Trên hầu hết các nền tảng khác (hiện tại và lịch sử), các công cụ kết hợp thực hiện cả lưu trữ và nén.

(gzip và các chương trình khác bắt chước giao diện của gzip thường có tùy chọn lưu tên tệp gốc trong đầu ra được nén, nhưng điều này, cùng với CRC hoặc kiểm tra khác để phát hiện tham nhũng, là siêu dữ liệu duy nhất họ có thể lưu trữ.)

Có những lợi thế để tách nén khỏi lưu trữ. Lưu trữ là dành riêng cho nền tảng (siêu dữ liệu hệ thống tập tin cần bảo quản rất khác nhau), nhưng việc triển khai rất đơn giản, chủ yếu là ràng buộc I / O và thay đổi rất ít theo thời gian. Nén là độc lập với nền tảng, nhưng việc triển khai bị ràng buộc bởi CPU và các thuật toán không ngừng cải tiến để tận dụng các tài nguyên gia tăng mà phần cứng hiện đại có thể mang lại để giải quyết vấn đề.

Trình lưu trữ Unix phổ biến nhất là tar, mặc dù có tồn tại những cái khác như cpioar. (Gói Debian là artài liệu lưu trữ, trong khi cpiothường được sử dụng cho ramdisks inital.) tarHoặc thường được kết hợp với các công cụ nén như compress(.Z), gzip(.gz), bzip2(.bz2) và xz(.xz), từ cũ nhất đến trẻ nhất , và không phải ngẫu nhiên từ tồi tệ nhất đến nén tốt nhất.

Tạo một tarkho lưu trữ và nén nó là các bước riêng biệt: máy nén không biết gì về tarđịnh dạng tệp. Điều này có nghĩa là trích xuất một tệp từ tarkho lưu trữ nén yêu cầu giải nén tất cả các tệp trước đó. Điều này thường được gọi là một kho lưu trữ "rắn".

Tương tự, vì tar là định dạng "phát trực tuyến" - được yêu cầu để nó hữu ích trong một đường ống - không có chỉ mục toàn cầu trong kho lưu trữ tar và việc liệt kê nội dung của kho lưu trữ tar cũng tốn kém như trích xuất nó.

Ngược lại, Zip và RAR và 7-zip (trình lưu trữ phổ biến nhất trên nền tảng Windows hiện đại) thường nén riêng từng tệp và nén siêu dữ liệu nhẹ nếu có. Điều này cho phép liệt kê các tệp trong một tệp lưu trữ và trích xuất các tệp riêng lẻ, nhưng có nghĩa là sự dư thừa giữa nhiều tệp trong cùng một tệp lưu trữ không thể được khai thác để tăng khả năng nén. Mặc dù việc nén tệp chung đã nén không làm giảm kích thước tệp hơn nữa, đôi khi bạn có thể thấy tệp zip trong tệp zip: lần nén đầu tiên đã biến rất nhiều tệp nhỏ thành một tệp lớn (có thể bị nén) nén sau đó nén như một thực thể duy nhất.

Có sự thụ phấn chéo giữa các nền tảng và triết lý khác nhau: gzipvề cơ bản ziplà máy nén mà không có bộ lưu trữ của nó, và xzvề cơ bản 7-ziplà máy nén mà không có bộ lưu trữ.

Có khác, máy nén chuyên dụng. Các biến thể PPM và sự kế thừa của chúng ZPAQđược tối ưu hóa để nén tối đa mà không liên quan đến tiêu thụ tài nguyên. Chúng có thể dễ dàng nhai nhiều CPU và RAM như bạn có thể sử dụng và giải nén cũng giống như nén (ngược lại, hầu hết các công cụ nén được sử dụng rộng rãi đều không đối xứng : giải nén rẻ hơn so với nén).

Ở đầu bên kia của quang phổ, lzo, snappyLZ4là máy nén "ánh sáng" được thiết kế cho tốc độ tối đa và tối thiểu tiêu thụ tài nguyên, với chi phí nén. Chúng được sử dụng rộng rãi trong các hệ thống tập tin và các kho đối tượng khác, nhưng ít hơn là các công cụ độc lập.


Vậy bạn nên chọn cái nào?

Lưu trữ:

Vì bạn đang sử dụng Ubuntu, không có lý do thực sự nào để sử dụng bất cứ thứ gì ngoài tarviệc lưu trữ, trừ khi bạn đang cố gắng tạo các tệp dễ đọc ở nơi khác.

ziprất khó để đánh bại sự phổ biến, nhưng nó không phải là trung tâm của Unix và sẽ không giữ thông tin quyền và hệ thống tập tin của bạn, và tính năng nén trong hệ thống của nó là cổ xưa. 7-zip và RAR (và ZPAQ) có tính năng nén hiện đại hơn nhưng không được sử dụng để lưu trữ các hệ thống tệp Unix (mặc dù không có gì ngăn bạn sử dụng chúng như máy nén); RAR cũng là độc quyền.

Nén:

Để nén tối đa, bạn có thể xem điểm chuẩn, chẳng hạn như điểm cực lớn tại http://mattmahoney.net/dc/text.html . Điều này sẽ cho bạn một ý tưởng tốt hơn về sự đánh đổi liên quan.

Bạn có thể không muốn nén tối đa, mặc dù. Nó quá đắt.

xzlà công cụ nén đa năng phổ biến nhất trên các hệ thống Unix hiện đại. Tôi tin rằng 7-zip cũng có thể đọc các tệp xz, vì chúng có liên quan chặt chẽ với nhau.

Cuối cùng: nếu bạn đang lưu trữ dữ liệu cho bất kỳ thứ gì ngoài lưu trữ ngắn hạn, bạn nên chọn một nguồn mở và tốt nhất là phổ biến rộng rãi, để giảm thiểu đau đầu sau này.


1

lzo, gz, b2, lzma (.lzma2 =.xz)là các trình nén "stream": chúng nén một luồng tạm biệt mà không biết và không quan tâm đến các tệp, thư mục và siêu dữ liệu như quyền. Bạn phải sử dụng một trình lưu trữ như tar để gói tất cả dữ liệu đó vào một luồng byte (tệp tar) và nén dữ liệu đó bằng máy nén. Nếu đó là dữ liệu của một tệp mà bạn quan tâm, bạn cũng có thể cung cấp tệp đó một mình cho một trong những máy nén này.

Tar, cpio and paxlà những người lưu trữ: họ lấy một loạt các tệp và thư mục và mã hóa dữ liệu và siêu dữ liệu trong một tệp duy nhất. tar là phổ biến nhất và tương thích nhất mặc dù giá trị kỹ thuật giữa ba người là đủ tối thiểu để có những cuộc chiến tôn giáo về nó trong buổi bình minh của thời gian.

7z và zip là máy nén VÀ arcihvers: Sau đó lưu trữ tất cả dữ liệu và dữ liệu meta và nén nó. Tuy nhiên, AFAICT, không ai trong số họ lưu quyền unix.

Zip sử dụng thuật toán tương tự như gzip có tên DEFLATE. 7z sử dụng thuật toán lzma

để đọc một tệp từ tar.gz hoặc tương tự, bạn sẽ cần giải nén toàn bộ luồng gz cho đến khi đủ tệp tar được hiển thị để bạn có thể giải nén nó. Zip cho phép bạn nén và kéo từng tệp riêng lẻ. 7z có thể có một trong hai hành vi.

Tỷ lệ và tốc độ nén: gzip và lzo có tốc độ nén và giải nén rất nhanh nhưng tỷ lệ nén thấp. Nó cũng không mất nhiều bộ nhớ để nén. gzip chậm hơn một chút và cho tỷ lệ nén tốt hơn một chút so với lzo.

Nó rất nhanh, có thể nhanh hơn để đọc tệp nén gz hoặc lzo từ đĩa và giải nén nó một cách nhanh chóng thay vì đọc tệp không nén trực tiếp từ đĩa.

LZMA (xz) cho khả năng nén tuyệt vời trên dữ liệu chung nhưng mất rất nhiều thời gian để nén và giải nén cùng với việc lấy một lượng bộ nhớ đáng kể để nén.

bz2 từng là thuật toán nén cao được lựa chọn nhưng không được ưa chuộng vì nó chậm hơn lzma và mất nhiều thời gian hơn để nén và giải nén. Tuy nhiên, đối với một số loại dữ liệu nhất định (chuỗi dna, các tệp có số lượng chạy rất lớn của cùng một byte, v.v.) bzip2 có thể đánh bại mọi thứ khác. Ví dụ, tôi đã từng phải nén một tệp 4GB 1 và b2 giảm i xuống còn 10 kb trong khi lzma mất khoảng 10 MB MB nếu tôi nhớ chính xác.


Thật ra lzma khá nhanh trong việc giải nén.
psusi

0

Đối với các tệp đặc biệt lớn, bạn có thể sử dụng rzip. Đầu tiên, nó xem xét dữ liệu dư thừa bên trong các khối lớn 900 MB, mã hóa các khối này và sau đó trao dữ liệu cho bzip2 (không thực sự, nhưng các thuật toán tương tự được sử dụng).

Hiệu ứng? Nhanh hơn nhiều so với xz, lzmahoặc bzip2theo kinh nghiệm của tôi, tỷ lệ nén của nó là đối thủ của nó lzma. Đó là một con heo RAM, mặc dù.

http://en.wikipedia.org/wiki/Rzip

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.