Có thể trùng lặp:
Tại sao ZIP nén không nén bất cứ thứ gì?
Tôi đã thử 7zipping một tập tin .exe nhưng nó thực sự trở nên lớn hơn.
Đây có phải là kết quả mong đợi?
Có thể trùng lặp:
Tại sao ZIP nén không nén bất cứ thứ gì?
Tôi đã thử 7zipping một tập tin .exe nhưng nó thực sự trở nên lớn hơn.
Đây có phải là kết quả mong đợi?
Câu trả lời:
Nó đi xuống một khái niệm gọi là entropy . Xem Wikipedia .
Ý tưởng cơ bản là, nếu tồn tại một hoạt động nén luôn có thể làm cho một tệp nhỏ hơn, thì logic ra lệnh rằng hoạt động nén sẽ có thể giảm bất kỳ tệp nào xuống 0 byte và vẫn giữ lại tất cả dữ liệu. Nhưng điều này là vô lý , bởi vì chúng tôi biết rằng 0 byte không thể truyền tải bất kỳ thông tin nào cả. Vì vậy, chúng tôi đã chứng minh rằng không thể tồn tại thuật toán nén luôn làm cho đầu vào của nó nhỏ hơn, bởi vì nếu đó là trường hợp, mọi thông tin có thể được lưu trữ trong 0 byte - nhưng 0 byte ngụ ý không có thông tin, vì vậy bạn có thể ' t đồng thời không có thông tin và tất cả thông tin. Do đó, nó là vô lý.
Do khái niệm lý thuyết này, mọi chương trình nén bạn từng sử dụng sẽ tăng kích thước (hoặc tốt nhất, duy trì cùng kích thước) một số đầu vào. Đó là, đối với bất kỳ thuật toán nén nào bạn thiết kế hoặc sử dụng, sẽ có một số đầu vào nhất định sẽ nhỏ hơn và một số thuật toán sẽ không.
Dữ liệu đã nén nói chung là một ứng cử viên khủng khiếp để nén thêm, bởi vì hầu hết các thuật toán nén không mất dữ liệu đều dựa trên cùng các nguyên tắc lý thuyết. Đó là khả năng nén dữ liệu kém nén hơn nữa; nhưng điều này kém hiệu quả hơn là chỉ đơn giản là nén nó bằng thuật toán có sẵn tốt nhất từ dữ liệu gốc để bắt đầu.
Ví dụ: nếu bạn có tệp văn bản 100 MB và nén nó bằng thuật toán Zip thông thường, nó có thể bị nén xuống còn 50 MB. Nếu sau đó bạn nén tệp Zip bằng LZMA2, bạn có thể giảm xuống còn 40 hoặc 45 MB, vì LZMA có tỷ lệ nén cao hơn đối với hầu hết dữ liệu có thể nén hơn so với Zip. Vì vậy, lý do là nó cũng có thể nén dữ liệu Zip, vì Zip không hoàn toàn hút toàn bộ entropy ra khỏi nó. Nhưng nếu bạn loại bỏ hoàn toàn bộ chứa Zip, bạn có thể có được nó thậm chí còn nhỏ hơn bằng cách nén văn bản thô bằng LZMA2, có khả năng mang lại thứ gì đó theo thứ tự 30 - 35 MB (đây chỉ là "số không khí" để minh họa khái niệm) .
Trong trường hợp nhị phân mà bạn đang cố nén, nó lớn hơn vì định dạng tệp 7-Zip phải tạo cấu trúc bên trong của riêng nó và đóng gói dữ liệu của tệp thực thi đã nén thành định dạng 7-Zip. Điều này chứa những thứ như từ điển, tiêu đề tệp, v.v. Những dữ liệu bổ sung này thường được bù đắp nhiều hơn nhờ tiết kiệm nén dữ liệu, nhưng có vẻ như tệp thực thi mà bạn đang cố nén đã được nén bằng một số dạng LZMA; nếu không, nó có thể sẽ thu nhỏ kích thước của tệp thực thi hoặc tăng rất nhẹ, thay vì tăng thêm 2 MB (rất nhiều).
2^(n+1)-1
thông điệp có thể có kích thước n-bit trở xuống. Thuật toán của chúng tôi phải ánh xạ mỗi một trong số này thành một đầu ra duy nhất . Nếu thậm chí một trong số này được ánh xạ tới một giá trị có ít bit hơn, thì một giá trị khác nhất thiết phải được ánh xạ tới một giá trị có nhiều hơn.
Các thuật toán nén cơ bản được sử dụng trong 7z là lossless . Điều đó có nghĩa là bạn có thể lặp lại nén-giải nén một tệp nhiều lần. Hơn nữa, sau mỗi lần lặp, tệp sẽ giữ nguyên chính xác .
Thật không may, bạn không thể mong đợi một thuật toán nén lossless được áp dụng nhiều lần mà luôn có kết quả dương. Có một ranh giới nghiêm ngặt mà nó không thể nhảy qua. Roughly, ranh giới này phụ thuộc vào mức độ chặt chẽ của một chuỗi đầu vào tập hợp dữ liệu ngẫu nhiên. Trên tất cả, các thuật toán lossless được sử dụng để nén tệp, truyền dữ liệu Internet HTML, sao lưu và các hoạt động khác mong muốn tệp đầu ra được giải nén thành chính xác cùng một tệp đầu vào.
Ngược lại với nén không mất dữ liệu , bạn luôn có thể mong đợi giảm kích thước tệp sau khi nén với các thuật toán nén mất (hoặc mất) . Mặt trái là bạn không thể khôi phục chính xác một tệp gốc sau một lần lặp giải nén nén. Các thuật toán này nổi tiếng nhất đối với việc truyền và lưu trữ âm thanh / video / hình ảnh.
bzip2 , LZMA , LZMA2 và các thuật toán khác được sử dụng bởi định dạng 7z đều không mất dữ liệu . Do đó, sẽ có một giới hạn mà sau đó nó không thể nén được nữa. Trên hết, hình ảnh thực thi (.exe) thường là các tệp được nén cao. 7zip như nhiều công cụ nén khác nhúng một số siêu dữ liệu, trong thực tế có thể làm cho tệp đầu ra lớn hơn.
Trong trường hợp này, bạn sẽ luôn thấy rằng tệp nén nhỏ hơn tệp đầu vào. Xem một bình luận dưới đây tại sao nó không thể.
Hầu hết các thuật toán nén sử dụng cái được gọi là bảng ký hiệu, về cơ bản chỉ là các phần của tệp mà nó sử dụng làm phần tử mà nó CÓ THỂ nén. Điều này, tất nhiên, tạo ra một số chi phí trong tệp nhưng thường dẫn đến một tệp nhỏ hơn nhiều.
Trong các tệp đã được nén, nó vẫn tạo ra một tập hợp các ký hiệu, nhưng có rất ít có thể giảm kích thước trên. Trong trường hợp của bạn, bảng biểu tượng của tệp đã được nén có thể nằm trong vùng lân cận 2 MB hoặc có thể nhiều hơn nếu nó đã quản lý để thực hiện một số thao tác nén.