Tỷ lệ nén tối đa của gzip là gì?


51

Kích thước lớn nhất của một gzip (giả sử 10kb vì lợi ích của một ví dụ) có thể được giải nén là gì?

Câu trả lời:


91

Nó phụ thuộc rất nhiều vào dữ liệu được nén. Thử nghiệm nhanh với tệp 1Gb chứa đầy số không cho kích thước nén ~ 120Kb, vì vậy tệp 10Kb của bạn có thể có khả năng mở rộng thành ~ 85Mbyte.

Ví dụ, nếu dữ liệu có độ dự phòng thấp, kho lưu trữ chứa các tệp hình ảnh ở định dạng được nén nguyên gốc (gif, jpg, png, ...), thì gzip có thể không nén thêm nữa. Đối với các tệp nhị phân như tệp thực thi chương trình, bạn có thể thấy nén tối đa 2: 1, đối với văn bản thuần, HTML hoặc các đánh dấu khác 3: 1 hoặc 4: 1 trở lên là không thể xảy ra. Bạn có thể thấy 10: 1 trong một số trường hợp nhưng ~ 8700: 1 được xem với một tệp chứa đầy một ký hiệu là thứ bạn sẽ không thấy bên ngoài các trường hợp nhân tạo tương tự.

Bạn có thể kiểm tra lượng dữ liệu sẽ dẫn đến việc giải nén tệp gzip, mà không thực sự ghi nội dung không nén của nó vào đĩa, với gunzip -c file.gz | wc --bytes- điều này sẽ giải nén tệp nhưng không lưu trữ kết quả, thay vào đó, chúng wcsẽ đếm số byte khi chúng truyền sau đó loại bỏ chúng. Nếu nội dung nén là một tệp tar chứa nhiều tệp nhỏ, bạn có thể thấy rằng cần nhiều dung lượng đĩa hơn để giải nén toàn bộ kho lưu trữ, nhưng trong hầu hết các trường hợp, số lượng được trả về từ gunzipđầu ra đường ống wcsẽ chính xác như bạn cần.


Tôi đã thấy HTML mở rộng lên gấp 10 lần (tất nhiên x3 và x4 là phổ biến nhất!) .... có lẽ rất nhiều dữ liệu dư thừa cho những dữ liệu đang bùng nổ + 8x. Tôi nghĩ rằng trang được đề cập đó là trang thông tin php.
Zombie

Đánh dấu lặp đi lặp lại, như đã thấy trong đầu ra của phpinfo(), nén rất tốt. Thông tin kỹ thuật trong đầu ra đó chứa nhiều sự lặp lại trực tiếp hơn so với khối ngôn ngữ tự nhiên trung bình cũng vậy, và phân phối bảng chữ cái có lẽ kém trơn tru hơn có thể giúp giai đoạn Huffman có kết quả tốt hơn.
David Spillett

Câu trả lời này không giải thích cho dữ liệu nén độc hại có chủ ý . Người ta có thể tạo một tệp zip độc hại khoảng 10KB có thể mở rộng lên hơn 4GB.
David Schwartz

Bom Zip có quy mô đó dựa vào tài liệu lưu trữ lồng nhau, vì vậy khi một người giải nén tệp bạn sẽ nhận thấy điều gì đó kỳ lạ trước đó rất lâu. Chúng có thể được sử dụng như một cuộc tấn công DoS hiệu quả chống lại máy quét tự động (trên các dịch vụ thư và vv).
David Spillett

1
@DavidSpillett: Bom zip lồng nhau mở rộng thành các kích cỡ trong phạm vi petabyte. Đó không phải là những gì tôi đang nói. Nhìn vào thậm chí chỉ là một lớp duy nhất của một quả bom zip thông thường.
David Schwartz

10

Thông thường, bạn không được nén hơn 95% (để dữ liệu được nén 10kB sẽ giải nén thành ~ 200kB), nhưng có những tệp được chế tạo đặc biệt mở rộng theo cấp số nhân. Hãy tìm kiếm 42.zip, nó giải nén đến vài petabyte dữ liệu (vô nghĩa).


4
Wikipedia cho biết 42.zip là "chứa năm lớp tệp zip lồng nhau trong bộ 16", vì vậy đó không phải là ví dụ hợp lệ cho giải nén (chỉ dành cho giải nén đệ quy).
Tgr

5
Thật vậy, 42.zip đặc biệt nguy hiểm đối với các công cụ tự động quét các tệp zip theo cách đệ quy, ví dụ như trình quét vi-rút.
thomasrutter

4
Đó là zip, không phải gzip
BeniBela

8

Trích dẫn nguyên văn từ https://stackoverflow.com/a/16794960/293815

Tỷ lệ nén tối đa của định dạng khử là 1032: 1. Điều này là do lần chạy dài nhất có thể được mã hóa là 258 byte. Ít nhất hai bit được yêu cầu cho mỗi lần chạy như vậy (một bit cho mã độ dài và một bit cho mã khoảng cách), do đó 4 * 258 = 1032 byte không nén có thể được mã hóa trên một byte nén.

Bạn có thể nhận được nhiều nén hơn bằng cách gzipping kết quả của gzip. Thông thường, điều đó không cải thiện khả năng nén, nhưng trong thời gian dài thì có thể.

Nhân tiện, cách tiếp cận LZ77 được sử dụng bởi deflate là tổng quát hơn so với mã hóa chiều dài chạy. Thay vì chỉ một chiều dài, một cặp chiều dài / khoảng cách được sử dụng. Điều này cho phép sao chép một chuỗi từ một khoảng cách trở lại hoặc sao chép một byte như trong chiều dài chạy cho khoảng cách một hoặc sao chép ba lần byte với khoảng cách ba, v.v.


6

Tỷ lệ nén của bất kỳ thuật toán nén nào sẽ là một hàm của dữ liệu được nén (bên cạnh độ dài của dữ liệu đó).

Đây là một phân tích tại MaximumCompression ,
Hãy xem một trong các mẫu như,

Tóm tắt các bài kiểm tra chuẩn nén nhiều tệp

Loại tệp: Nhiều loại tệp (tổng cộng 46)  
Số tệp cần nén trong thử nghiệm này: 510  
Tổng kích thước tệp (byte): 316.355.757 
Kích thước tệp trung bình (byte): 620,305
Tệp lớn nhất (byte): 18,403,071
Tệp nhỏ nhất (byte): 3,554

4

Một tập tin khổng lồ chỉ chứa một biểu tượng sẽ nén rất tốt.


4

10 MB số không trong tệp, nén bằng gzip -9 đến 10217. Vì vậy, tỷ lệ tối đa có vẻ là khoảng 1000x.


1

Câu trả lời cho câu hỏi của bạn, phụ thuộc vào đầu vào. Để cho bạn biết cách nén được thực hiện, hãy xem video sáu phút này.

https://www.youtube.com/watch?v=ZdooBTdW5bM

Những gì bạn nên nhận được từ nó là tốc độ nén phụ thuộc vào tần số của mỗi ký tự, do đó không có tốc độ tối đa chung, nó phụ thuộc vào đầu vào, đối với văn bản tiếng Anh là khoảng 65 phần trăm.


1
Chào mừng bạn đến với Siêu người dùng! Vui lòng trích dẫn các phần thiết yếu của câu trả lời từ (các) liên kết tham chiếu, vì câu trả lời có thể trở nên không hợp lệ nếu (các) trang được liên kết thay đổi.
DavidPostill

Sẽ chính xác hơn khi nói "tần số của từng chuỗi" thay vì "tần số của từng ký tự"
JoelFan
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.