7z'de sıkıştırma yöntemlerini birleştirmek gerçekte ne yapar?


11

7z komut satırı aracı , birden çok sıkıştırma yöntemi belirlemenize olanak tanır , örneğin:

# 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üm yöntemler bir şekilde kullanılır veya en azından meta verilerde belirtilir:

$ 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

O mu değil iyi toplama, her üç yöntemlerle dosyasını çalıştırın görünmektedir. Aksine, yöntemin sırasını değiştirmek dosya boyutunu önemli ölçüde etkilediğinden, her zaman ilkini seçer.

Bir XML dosyası (PPMd en iyi sıkıştırmayı sağlar) ve bir ikili dosya (LZMA2 yapar) gibi birden fazla dosya eklesem bile, yine de her iki dosya için tüm yöntemleri listeler ve dosya başına dinamik olarak değişmez.

Aslında, belgeler, "Sen. Yöntemlerden herhangi numarayı kullanabilirsiniz", ancak demiyor diyor niçin .

Ne elde etmeye çalışıyorum dosya başına "birden çok yöntem deneyin, hangisi en iyisi seç" arşividir. Elbette bunu biraz komut dosyasıyla manuel olarak başarabilirim, ancak muhtemelen zincirleme sıkıştırma yöntemleri tam olarak bunu yapmalı mı?


Sıkıştırma yöntemleri sırasını değiştirme gereken tüm yöntemler sırayla uygulanan bile sıkıştırılmış boyutunu değiştirmek. Çoğu sıkıştırma tipik olarak uygulanan ilk yöntemden gelir. Bunun sonucu tipik olarak yüksek entropiye sahiptir, bu nedenle daha fazla sıkıştırmak zordur. Verilerin kendileri sıkıştırması beklenmeyen, ancak daha sıkıştırılabilir olmasını kodlayan tranformlar için istisnalar vardır - örneğin, 1, 2, 3, 4, 5 dizisi değerlerin tekrarına sahip değildir, ancak farkların tekrarı vardır, bu nedenle bir delta dönüşümü sıkıştırılabilirliği artırır. Daniel B'nin cevabı bu.
Steve314

Aslında 7zip'in ne yaptığını bilmiyorum - sadece "yöntemin sırasını değiştirmek dosya boyutunu önemli ölçüde etkiler" mantığına yorum yapmak.
Steve314

Yanıtlar:


5

Genel olarak, sıkıştırılmış veriler verimli bir şekilde sıkıştırılamaz (daha fazla). İlk sıkıştırma yöntemi uygulandıktan sonra dosya boyutu önemli ölçüde azaltılamaz.

-mN=XAğırlıklı filtreleri belirtmek için (Windows yardım dosyası alınır) olan:

Desteklenen filtreler:

Delta Delta filtresi (“Bayt cinsinden delta ofsetini ayarlamak mümkündür. Örneğin, 16 bit stereo WAV dosyalarını sıkıştırmak için" 0 = Delta: 4 "ayarını yapabilirsiniz. Varsayılan delta ofseti 1'dir.))

X86 yürütülebilir dosyaları için BCJ dönüştürücü

X86 yürütülebilir dosyaları için BCJ2 dönüştürücü (sürüm 2) (“BCJ2, 32 bit x86 yürütülebilir dosyaları için bir şube dönüştürücüsüdür (sürüm 2). Daha fazla sıkıştırmayı artırmak için bazı şube talimatlarını dönüştürür.”)

ARM (little endian) yürütülebilir dosyaları için ARM dönüştürücü

ARM Thumb (küçük endian) yürütülebilir dosyaları için ARMT dönüştürücü

IA-64 yürütülebilir dosyaları için IA64 dönüştürücü

PowerPC (big endian) yürütülebilir dosyaları için PPC dönüştürücü

SPARC yürütülebilir dosyaları için SPARC dönüştürücü

Ayrıca yardım dosyasından, BCJ2 filtresinin birden çok çıkış akışından yararlanan gelişmiş bir örnek:

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

* .exe ve * .dll dosyalarını arşivlemeye arşivler. 7 BCJ2 dönüştürücü kullanarak, ana çıkış akışı (s0) için 8 MB sözlük ile LZMA ve BCJ2'nin s1 ve s2 çıkış akışları için 512 KB sözlük ile LZMA ekler.


"İlk sıkıştırma yöntemi uygulandıktan sonra dosya boyutu önemli ölçüde azaltılamaz." - Elbette. Umudum, birden çok yöntem belirtmenin dosya başına her belirtilen yöntemi denemesini ve en verimli şekilde seçmesini sağlamasıydı . Doğal olarak, bu sıkıştırmayı oldukça yavaşlatacaktır.
Sören Kuklau

2

Filtreleri sırayla uygulayabileceğiniz anlaşılıyor.

Geçen yıldan bu gönderinin güzel bir açıklaması var:

7-zip'in -m anahtarından sonraki sayı ne anlama geliyor?

Bu sayı, aynı anda birden fazla kullanıyorsanız sıkıştırma işlemlerinin sırasını ayarlamanızı sağlar.

Bu dokümantasyondan bir örnek:

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

BCJ2 filtresini kullanarak a.7z, ana çıkış akışı (s0) için 32 MB sözlük içeren LZMA ve BCJ2'nin s1 ve s2 çıkış akışları için 512 KB sözlük içeren LZMA'yı * .exe ve * .dll dosyalarını ekler.

İlk sıkıştırma sıfır olan en düşük sayıdır. Bu örnekte, sıfır BCJ2 olarak ayarlanmıştır. Sonra bir tane geliyor, ki bu LZMA. İki ve üç de LZMA, ancak farklı d parametreleri kullanıyorlar.

-Mb seçeneği, çıktıyı bir sıkıştırmadan diğerinin girişine "bağlamak" için kullanılır. Bu örnekte, BCJ2'nin bir girişi ve dört çıkışı vardır. Sıfır çıkış bir sıkıştırma numarasına gidiyor. Birinci çıkış iki numaralı sıkıştırmaya gidiyor. İkinci çıkış, üç numaralı sıkıştırmaya gider. Üçüncü çıkış bağlı değildir (çünkü tekrar sıkıştırılması gerekmez).

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.