Apa yang sebenarnya menggabungkan metode kompresi dalam 7z?

11

Alat baris perintah 7z memungkinkan Anda menentukan beberapa metode kompresi , misalnya:

# 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

Semua metode digunakan dengan cara tertentu, atau setidaknya ditentukan dalam metadata:

$ 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

Itu tidak muncul untuk menjalankan file melalui semua tiga metode, memilih yang terbaik. Sebaliknya, itu tampaknya selalu memilih yang pertama, karena mengubah urutan metode mempengaruhi ukuran file secara signifikan.

Sekalipun saya menambahkan banyak file, seperti satu file XML (PPMd menghasilkan kompresi terbaik) dan satu file biner (LZMA2), masih mencantumkan semua metode untuk kedua file, dan tampaknya tidak beralih secara dinamis per file.

Bahkan, dokumentasi secara khusus mengatakan bahwa "Anda dapat menggunakan sejumlah metode.", Tetapi tidak mengatakan karenanya .

Apa yang saya coba capai adalah arsip "coba beberapa metode, pilih yang mana yang terbaik" arsip. Tentu saja saya dapat secara manual mencapai ini dengan sedikit skrip, tetapi mungkin, metode kompresi chaining harus melakukan hal itu?

Sören Kuklau
sumber
Mengubah urutan metode kompresi harus mengubah ukuran terkompresi bahkan jika semua metode diterapkan secara berurutan. Kebanyakan kompresi biasanya berasal dari metode pertama yang diterapkan. Hasil dari itu biasanya memiliki entropi tinggi, sehingga sulit untuk dikompres lebih lanjut. Ada pengecualian untuk tranform yang tidak diharapkan untuk memampatkan data itu sendiri, tetapi yang menyandikannya menjadi lebih kompresibel - misalnya urutan 1, 2, 3, 4, 5 tidak memiliki pengulangan nilai, tetapi memiliki pengulangan perbedaan, jadi transformasi delta meningkatkan kompresibilitas. Itulah jawaban Daniel B.
Steve314
Saya sebenarnya tidak tahu apa yang dilakukan 7zip - hanya mengomentari logika Anda "karena mengubah urutan metode mempengaruhi ukuran file secara signifikan".
Steve314

Jawaban:

5

Secara umum, data terkompresi tidak dapat dikompres (lebih lanjut) secara efisien. Setelah metode kompresi pertama diterapkan, ukuran file tidak dapat dikurangi secara signifikan.

The -mN=Xterutama untuk menentukan filter (diambil dari bantuan Windows file):

Filter yang didukung:

Filter Delta Delta ("Dimungkinkan untuk mengatur offset delta dalam byte. Misalnya, untuk mengkompresi file WAV stereo 16-bit, Anda dapat mengatur" 0 = Delta: 4 ". Offset delta default adalah 1.")

Konverter BCJ untuk executable x86

Konverter BCJ2 untuk executable x86 (versi 2) ("BCJ2 adalah konverter Branch untuk executable x86 32-bit (versi 2). Konversi beberapa instruksi cabang untuk meningkatkan kompresi lebih lanjut.")

Konverter ARM untuk executable ARM (little endian)

Konverter ARMT untuk executable ARM Thumb (little endian)

Konverter IA64 untuk executable IA-64

Konverter PPC untuk executable PowerPC (big endian)

Konverter SPARC untuk executable SPARC

Juga dari file bantuan, contoh lanjutan yang meningkatkan beberapa aliran output dari filter 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

menambahkan file * .exe dan * .dll ke arsip arsip.7z menggunakan konverter BCJ2, LZMA dengan kamus 8 MB untuk aliran output utama (s0), dan LZMA dengan kamus 512 KB untuk aliran output s1 dan s2 dari BCJ2.

Daniel B
sumber
"Setelah metode kompresi pertama diterapkan, ukuran file tidak dapat dikurangi secara signifikan." - Tentu. Harapan saya adalah menentukan beberapa metode akan membuatnya mencoba, per-file , setiap metode yang ditentukan dan memilih yang paling efisien. Secara alami, ini akan membuat kompresi lebih lambat.
Sören Kuklau
2

Tampaknya Anda dapat menerapkan filter secara berurutan.

Posting ini dari tahun lalu memiliki penjelasan yang bagus:

Apa arti angka setelah saklar 7-zip's -m?

Angka itu memungkinkan Anda mengatur urutan operasi kompresi jika Anda menggunakan lebih dari satu sekaligus.

Ini adalah contoh dari dokumentasi:

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

menambahkan file * .exe dan * .dll ke arsip a.7z menggunakan filter BCJ2, LZMA dengan kamus 32 MB untuk aliran output utama (s0), dan LZMA dengan kamus 512 KB untuk aliran output s1 dan s2 dari BCJ2.

Kompresi pertama adalah angka terendah, yaitu nol. Dalam contoh ini, nol diatur ke BCJ2. Kemudian muncul satu, yaitu LZMA. Dua dan tiga juga LZMA, tetapi mereka menggunakan parameter d yang berbeda.

Opsi -mb digunakan untuk "mengikat" output dari satu kompresi ke input yang lain. Dalam contoh ini, BCJ2 memiliki satu input dan empat output. Output nol akan kompresi nomor satu. Output satu akan kompresi nomor dua. Output dua masuk ke kompresi nomor tiga. Output tiga tidak terikat (karena tidak perlu dikompres lagi).

Marcelo
sumber