Không kết hợp các phương pháp nén trong 7z thực sự làm gì?


11

Công cụ dòng lệnh 7z cho phép bạn chỉ định nhiều phương thức nén , ví dụ:

# 7-zip archive type, strongest (9) compression, methods PPMd, BCJ2, LZMA2
$ 7z a -t7z -mx=9 -m0=PPMd -m1=BCJ2 -m2=LZMA2 myarchive.7z somefile.xml

Tất cả các phương thức được sử dụng theo một cách nào đó hoặc ít nhất được chỉ định trong siêu dữ liệu:

$ 7z l -slt myarchive.7z

7-Zip [64] 9.22 beta  Copyright (c) 1999-2011 Igor Pavlov  2011-04-18

Listing archive: myarchive.
7z

--
Path = myarchive.7z
Type = 7z
Method = LZMA2 PPMD BCJ2
[..]

----------
Path = somefile.xml
[..]
Method = PPMD:o32:mem192m BCJ2 LZMA2:48m
Block = 0

không xuất hiện để chạy tệp thông qua cả ba phương pháp, chọn cách tốt nhất. Thay vào đó, nó dường như luôn chọn đầu tiên, vì việc thay đổi thứ tự của phương thức ảnh hưởng đáng kể đến kích thước tệp.

Ngay cả khi tôi thêm nhiều tệp, chẳng hạn như một tệp XML (PPMd mang lại khả năng nén tốt nhất) và một tệp nhị phân (LZMA2), nó vẫn liệt kê tất cả các phương thức cho cả hai tệp và dường như không chuyển đổi linh hoạt trên mỗi tệp.

Trong thực tế, các tài liệu hướng dẫn cụ thể nói rằng "Bạn có thể sử dụng bất kỳ số phương pháp.", Nhưng nó không nói tại sao .

Những gì tôi đang cố gắng đạt được là một tệp lưu trữ "thử nhiều phương pháp, chọn bất kỳ phương pháp nào là tốt nhất". Tất nhiên tôi có thể tự mình đạt được điều này với một chút kịch bản, nhưng có lẽ, các phương pháp nén chuỗi nên làm chính xác điều đó?


Thay đổi thứ tự của các phương thức nén sẽ thay đổi kích thước nén ngay cả khi tất cả các phương thức được áp dụng theo trình tự. Hầu hết nén thường đến từ phương pháp đầu tiên được áp dụng. Kết quả từ đó thường có entropy cao, do đó khó nén hơn nữa. Có những trường hợp ngoại lệ đối với các tranform không dự kiến ​​sẽ tự nén dữ liệu, nhưng mã hóa nó sẽ dễ nén hơn - ví dụ: chuỗi 1, 2, 3, 4, 5 không lặp lại các giá trị, nhưng có sự lặp lại của các khác biệt, vì vậy một biến đổi delta cải thiện khả năng nén. Đó là những gì câu trả lời của Daniel B là về.
Steve314

Tuy nhiên, tôi thực sự không biết 7zip làm gì - chỉ nhận xét về "việc thay đổi thứ tự của phương thức ảnh hưởng đáng kể đến kích thước tệp".
Steve314

Câu trả lời:


5

Nói chung, dữ liệu nén không thể được nén (hơn nữa) một cách hiệu quả. Sau khi phương pháp nén đầu tiên được áp dụng, kích thước tệp không thể giảm đáng kể.

Phần lớn -mN=Xlà để chỉ định các bộ lọc (lấy từ tệp trợ giúp của Windows):

Bộ lọc được hỗ trợ:

Delta Delta lọc ( “Có thể đồng bằng bộ bù đắp bằng byte Ví dụ, để nén 16-bit file stereo WAV, bạn có thể thiết lập. "0 = Delta: 4". Delta Mặc định bù đắp là 1.”)

Bộ chuyển đổi BCJ cho các tệp thực thi x86

Bộ chuyển đổi BCJ2 cho các tệp thực thi x86 (phiên bản 2) (BC BC2 là một trình chuyển đổi Chi nhánh cho các tệp thực thi x86 32 bit (phiên bản 2). Nó chuyển đổi một số hướng dẫn chi nhánh để tăng thêm khả năng nén.

Bộ chuyển đổi ARM cho các tệp thực thi ARM (ít endian)

Bộ chuyển đổi ARMT cho các tệp thực thi ARM Thumb ( endianian )

Bộ chuyển đổi IA64 cho tệp thực thi IA-64

Bộ chuyển đổi PPC cho các tệp thực thi PowerPC (big endian)

Bộ chuyển đổi SPARC cho các tệp thực thi SPARC

Cũng từ tệp trợ giúp, một ví dụ nâng cao tận dụng nhiều luồng đầu ra của bộ lọc BCJ2:

7z a -t7z archive.7z *.exe *.dll -m0=BCJ2 -m1=LZMA:d23 -m2=LZMA:d19 -m3=LZMA:d19      -mb0:1 -mb0s1:2 -mb0s2:3

thêm các tệp * .exe và *.


"Sau khi phương pháp nén đầu tiên được áp dụng, kích thước tệp không thể giảm đáng kể." - Chắc chắn rồi. Tôi hy vọng rằng việc chỉ định nhiều phương thức sẽ làm cho nó thử, mỗi tệp , mỗi phương thức được chỉ định và chọn hiệu quả nhất. Đương nhiên, điều này sẽ làm cho việc nén khá chậm.
Sören Kuklau

2

Có vẻ như bạn có thể áp dụng các bộ lọc theo trình tự.

Bài đăng này từ năm ngoái có một lời giải thích tốt đẹp:

Số sau công tắc -m của 7-zip có nghĩa là gì?

Con số đó cho phép bạn đặt thứ tự của các hoạt động nén nếu bạn đang sử dụng nhiều hơn một lần.

Đây là một ví dụ từ tài liệu:

7z a a.7z *.exe *.dll -m0=BCJ2 -m1=LZMA:d25 -m2=LZMA:d19 -m3=LZMA:d19 -mb0:1 -mb0s1:2 -mb0s2:3

thêm các tệp * .exe và *.

Lần nén đầu tiên là số thấp nhất, bằng không. Trong ví dụ này, zero được đặt thành BCJ2. Sau đó đến một, đó là LZMA. Hai và ba cũng là LZMA, nhưng họ đang sử dụng các tham số d khác nhau.

Tùy chọn -mb được sử dụng để "liên kết" đầu ra từ một lần nén với đầu vào của một lần nén khác. Trong ví dụ này, BCJ2 có một đầu vào và bốn đầu ra. Đầu ra zero sẽ nén số một. Đầu ra một là nén số hai. Đầu ra hai đi đến số ba nén. Đầu ra ba không bị ràng buộc (vì nó không cần phải nén lại).

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.