Co właściwie robi kombinacja metod kompresji w 7z?

11

Narzędzie wiersza polecenia 7z umożliwia określenie wielu metod kompresji , np .:

# 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

Wszystkie metody są używane w jakiś sposób lub przynajmniej określone w metadanych:

$ 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

To nie nie wydaje się, aby uruchomić plik za pomocą wszystkich trzech metod, wybierając najlepsze. Najwyraźniej zawsze wybiera pierwszą, ponieważ zmiana kolejności metody ma znaczący wpływ na rozmiar pliku.

Nawet jeśli dodam wiele plików, takich jak jeden plik XML (PPMd zapewnia najlepszą kompresję) i jeden plik binarny (robi to LZMA2), nadal wyświetla listę wszystkich metod dla obu plików i nie wydaje się przełączać dynamicznie dla poszczególnych plików.

W rzeczywistości, dokumentacja wyraźnie mówi, że „można użyć dowolnej liczby metod.”, Ale to nie znaczy Przeto .

To, co próbuję osiągnąć, to archiwum „wypróbuj wiele metod, wybierz najlepszą z nich” dla każdego pliku. Mogę oczywiście ręcznie to osiągnąć za pomocą małego skryptu, ale prawdopodobnie metody kompresji łańcuchowej powinny to zrobić?

Sören Kuklau
źródło
Zmiana kolejności metod kompresji powinna zmienić rozmiar kompresji, nawet jeśli wszystkie metody są stosowane po kolei. Większość kompresji zazwyczaj pochodzi z pierwszej zastosowanej metody. Wynik tego zazwyczaj ma wysoką entropię, więc trudno go dalej kompresować. Istnieją wyjątki dla transformacji, które nie powinny same kompresować danych, ale kodują je jako bardziej ściśliwe - np. Sekwencja 1, 2, 3, 4, 5 nie ma powtarzania wartości, ale ma powtarzanie różnic, więc transformata delta poprawia ściśliwość. O to właśnie odpowiada Daniel B.
Steve314,
Jednak tak naprawdę nie wiem, co robi 7zip - po prostu komentowanie twojej „zmiany kolejności metody znacząco wpływa na rozmiar pliku”.
Steve314,

Odpowiedzi:

5

Zasadniczo skompresowanych danych nie można (dalej) skutecznie kompresować. Po zastosowaniu pierwszej metody kompresji rozmiar pliku nie może zostać znacznie zmniejszony.

Służy -mN=Xgłównie do określania filtrów (pobranych z pliku pomocy systemu Windows):

Obsługiwane filtry:

Filtr Delta Delta („Możliwe jest ustawienie przesunięcia delta w bajtach. Na przykład, aby skompresować 16-bitowe pliki WAV stereo, można ustawić„ 0 = Delta: 4 ”. Domyślne przesunięcie delta wynosi 1.”)

Konwerter BCJ dla plików wykonywalnych x86

Konwerter BCJ2 dla plików wykonywalnych x86 (wersja 2) („BCJ2 to konwerter rozgałęzień dla 32-bitowych plików wykonywalnych x86 (wersja 2). Konwertuje niektóre instrukcje rozgałęzień w celu zwiększenia dalszej kompresji.”)

Konwerter ARM dla plików wykonywalnych ARM (little endian)

Konwerter ARMT dla plików wykonywalnych ARM Thumb (little endian)

Konwerter IA64 dla plików wykonywalnych IA-64

Konwerter PPC dla plików wykonywalnych PowerPC (big endian)

SPARC konwerter do plików wykonywalnych SPARC

Również z pliku pomocy zaawansowany przykład wykorzystujący wiele strumieni wyjściowych filtra 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

dodaje pliki * .exe i * .dll do archiwum archiwum. 7z przy użyciu konwertera BCJ2, LZMA ze słownikiem 8 MB dla głównego strumienia wyjściowego (s0) i LZMA ze słownikiem 512 KB dla strumieni wyjściowych s1 i s2 BCJ2.

Daniel B.
źródło
„Po zastosowaniu pierwszej metody kompresji rozmiar pliku nie może zostać znacznie zmniejszony.” - Pewnie. Miałem nadzieję, że określenie wielu metod sprawi, że spróbuje, dla każdego pliku , każdej określonej metody i wybierze najbardziej wydajną. Oczywiście spowodowałoby to spowolnienie kompresji.
Sören Kuklau
2

Wygląda na to, że możesz zastosować filtry w sekwencji.

Ten post z ubiegłego roku ma ładne wyjaśnienie:

Co oznacza liczba po przełączniku -m 7-zip?

Liczba ta pozwala ustawić kolejność operacji kompresji, jeśli używasz więcej niż jednej jednocześnie.

To jest przykład z dokumentacji:

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

dodaje pliki * .exe i * .dll do archiwizacji a.7z przy użyciu filtra BCJ2, LZMA ze słownikiem 32 MB dla głównego strumienia wyjściowego (s0) i LZMA ze słownikiem 512 KB dla strumieni wyjściowych s1 i s2 BCJ2.

Pierwsza kompresja to najniższa liczba, która wynosi zero. W tym przykładzie zero jest ustawione na BCJ2. Potem przychodzi jeden, którym jest LZMA. Dwa i trzy są również LZMA, ale używają różnych parametrów d.

Opcja -mb służy do „wiązania” danych wyjściowych z jednej kompresji do danych wejściowych innej. W tym przykładzie BCJ2 ma jedno wejście i cztery wyjścia. Wyjście zero zmierza do kompresji numer jeden. Wyjście pierwsze przejdzie do kompresji numer dwa. Wyjście dwa przechodzi do kompresji numer trzy. Wyjście trzecie nie jest powiązane (ponieważ nie trzeba go ponownie kompresować).

Marcelo
źródło