Dlaczego plik 7zip jest większy niż plik raw? [duplikować]

37

Możliwy duplikat:
Dlaczego kompresja ZIP nic nie kompresuje?

Próbowałem 7zipping pliku .exe, ale tak naprawdę stał się większy.

wprowadź opis zdjęcia tutaj

Czy to oczekiwany wynik?

IMB
źródło
3
Tak, to oczekiwany wynik. Czemu? Ponieważ gdy coś jest już skompresowane (= używając mniejszej możliwej przestrzeni), nie można go dalej skompresować.
woliveirajr
4
Aby dodać do wszystkich innych - ponieważ ten plik exe jest specjalnie instalatorem, większość jego zawartości to prawdopodobnie archiwum zip lub cab. Nie uzyskałbyś takich samych wyników z normalnego pliku exe (ale większość normalnych plików exe nie będzie 145 megabajtów)
Random832
1
Objaśnienie tylko z podstawową logiką: Kompresja wyszukuje dla pliku raw plik UNIQUE skompresowany, a dla pliku zip UNIQUE plik oryginalny (nieskompresowany). Wyobraź sobie, że masz pliki 8-bitowe i chcesz skompresować je do plików 5-bitowych. Istnieje 256 unikatowych plików 8-bitowych, ale tylko 32 unikalne pliki 5-bitowe (!) Tak więc niektóre pliki 8-bitowe muszą zostać skompresowane do tego samego pliku 5-bitowego (!). A jeśli 2 różne nieprzetworzone pliki skompresowane do tego samego pliku ZIP, który chcesz uzyskać po dekompresji? Dla każdej metody kompresowania, jeśli istnieją pliki, które stają się mniejsze po skompresowaniu, muszą istnieć pliki, które stają się większe (!)
Ivan Kuckir

Odpowiedzi:

78

Sprowadza się do koncepcji zwanej entropią . Zobacz Wikipedia .

Podstawową ideą jest to, że jeśli istniała operacja kompresji, która zawsze może zmniejszać plik, logika mówi, że ta operacja kompresji byłaby w stanie zmniejszyć dowolny plik do 0 bajtów i nadal zachować wszystkie dane. Jest to jednak absurdalne , ponieważ wiemy, że 0 bajtów w ogóle nie może przekazać żadnej informacji. Właśnie dlatego udowodniliśmy, że nie może istnieć algorytm kompresji, który zawsze zmniejsza jego dane wejściowe, ponieważ w takim przypadku każda informacja mogłaby być przechowywana w 0 bajtach - ale 0 bajtów oznacza brak informacji, więc możesz ' jednocześnie nie mają informacji i wszystkich informacji. To jest absurdalne.

Ze względu na tę teoretyczną koncepcję, każdy program kompresji, którego kiedykolwiek użyjesz, zwiększy (lub w najlepszym razie utrzyma ten sam rozmiar) niektóre dane wejściowe. Oznacza to, że dla każdego zaprojektowanego lub używanego algorytmu kompresji będą pewne dane wejściowe, które wyjdą mniejsze, a niektóre nie.

Już skompresowane dane są ogólnie okropnym kandydatem do dalszej kompresji, ponieważ większość algorytmów kompresji bezstratnej opiera się na tych samych zasadach teoretycznych. Możliwe jest dalsze kompresowanie słabo skompresowanych danych; ale jest to mniej wydajne niż zwykłe kompresowanie go za pomocą najlepszego dostępnego algorytmu z oryginalnych danych na początek.

Na przykład, jeśli masz plik tekstowy 100 MB i kompresujesz go przy użyciu zwykłego algorytmu Zip, może zostać skompresowany do 50 MB. Jeśli następnie skompresujesz plik Zip za pomocą LZMA2, możesz go zmniejszyć do 40 lub 45 MB, ponieważ LZMA ma wyższy współczynnik kompresji dla większości danych podlegających kompresji niż Zip. Jest więc oczywiste, że może również kompresować dane Zip, ponieważ Zip nie wysysa z niego całej entropii. Ale jeśli całkowicie wyeliminujesz pojemnik Zip, możesz być w stanie go jeszcze zmniejszyć, kompresując surowy tekst za pomocą LZMA2, potencjalnie uzyskując coś rzędu 30 - 35 MB (są to tylko „liczby lotnicze” ilustrujące tę koncepcję) .

W przypadku tego pliku binarnego, który próbujesz skompresować, jest on większy, ponieważ format pliku 7-Zip musi stworzyć własną strukturę wewnętrzną i spakować już skompresowane dane pliku wykonywalnego do formatu 7-Zip. Zawiera rzeczy takie jak słownik, nagłówek pliku i tak dalej. Te dodatkowe dane są zwykle więcej niż kompensowane przez oszczędności związane z kompresowaniem samych danych, ale wydaje się, że plik wykonywalny, który próbujesz skompresować, jest już skompresowany za pomocą jakiejś formy LZMA; w przeciwnym razie prawdopodobnie zmniejszyłby rozmiar pliku wykonywalnego lub bardzo nieznacznie go zwiększył, zamiast zwiększać o 2 MB (co jest dużo).

allquixotic
źródło
btw najważniejsza część odpowiedzi na to pytanie znajduje się na końcu: „Zawiera rzeczy takie jak słownik, nagłówek pliku itp. Te dodatkowe dane są zwykle więcej niż kompensowane przez oszczędności związane z kompresowaniem samych danych, ale to wygląda na to, że plik wykonywalny, który próbujesz skompresować, jest już skompresowany za pomocą jakiejś formy LZMA ”
jhocking
6
@ jhocking: Nie, najważniejszą częścią jest środek: „Każdy program kompresji, którego kiedykolwiek użyjesz, zwiększy rozmiar… niektórych danych wejściowych”. Format pliku 7zip ma słownik / nagłówek pliku / etc, ale nawet jeśli 7zip użył algorytmu, który nie miał żadnej z tych rzeczy, nadal mamy gwarancję, że niektóre (w rzeczywistości większość) danych wejściowych będą miały wyjścia, które są tak duże lub większe niż same dane wejściowe. Jest to podstawowy fakt teorii informacji i nie ma nic wspólnego z nagłówkami plików.
BlueRaja - Danny Pflughoeft
2
@ Mehrdad Pewnie: po prostu napisz algorytm „kompresji”, który zawsze zwraca oryginalne dane wejściowe. Tam; gotowy. : P ... Poza tym nie - każdy algorytm kompresji, który jest algorytmem, będzie miał jakieś metadane, nawet jeśli jest to tylko jeden bit na początku pliku, który wskazuje, czy plik jest skompresowany, czy nie (0 == nieskompresowany, 1 == skompresowany). Jeśli masz zamiar zmodyfikować zawartość pliku w ogóle , trzeba trochę metadanych. A jeśli modyfikujesz zawartość, zwiększysz niektóre dane wejściowe.
allquixotic
1
Jeśli jednak twoje pytanie brzmiało: „Czy istnieje jakiś algorytm kompresji, który nie zwiększa długości danych wejściowych poza ustaloną liczbę metadanych”, odpowiedź brzmi: nie wiem, ale teoretycznie powinno być to możliwe. W rzeczywistości łatwe. Wszystko co musisz zrobić, to stworzyć format kontenera, który może też zawierać oryginalnego pliku, lub skompresowanego strumienia danych. Następnie, podczas tworzenia archiwum, spróbuj skompresować: jeśli skompresowany rozmiar jest większy niż wejście, po prostu zapisz oryginalne wejście i spakuj swoje metadane z przodu. Rozmiar pliku wzrośnie, ale jeśli metadane są małe (
ciągdalszy
2
@Mehrdad: „Czy istnieje algorytm kompresji (jakkolwiek słaby), który nie zwiększa długości żadnego wejścia? ” - Odpowiedź brzmi „nie”. Możliwe są 2^(n+1)-1komunikaty o rozmiarze n-bitów lub mniejszym. Nasz algorytm musi odwzorować każdy z nich na unikalne wyjście. Jeśli nawet jedna z nich zostanie zmapowana na wartość o mniejszej liczbie bitów, inna wartość musi koniecznie zostać odwzorowana na wartość o większej liczbie bitów.
BlueRaja - Danny Pflughoeft
7

Podstawowe algorytmy kompresji stosowane w 7z są bezstratne . Co oznacza, że ​​możesz wielokrotnie iteracyjnie kompresować i dekompresować plik. Ponadto po każdej iteracji plik pozostanie dokładnie taki sam.

Niestety nie można oczekiwać wielokrotnego stosowania bezstratnego algorytmu kompresji z zawsze pozytywnym wynikiem. Istnieje ścisła granica, której nie może przeskoczyć. Z grubsza granica ta zależy od tego, jak ściśle sekwencja wejściowa gromadzi losowe dane. Przede wszystkim stosowane są bezstratne algorytmy do kompresji plików, przesyłania danych przez Internet HTML, kopii zapasowych i innych operacji, które oczekują dekompresji pliku wyjściowego na dokładnie ten sam oryginalny plik wejściowy.

W przeciwieństwie do kompresji bezstratnej , zawsze można oczekiwać zmniejszenia rozmiaru pliku po kompresji za pomocą algorytmów kompresji stratnej (lub stratnej) . Wadą jest to, że nie można dokładnie przywrócić oryginalnego pliku po pojedynczej iteracji kompres-dekompresja. Algorytmy te są najbardziej znane z transmisji i przechowywania audio / wideo / obrazu.

bzip2 , LZMA , LZMA2 i inne algorytmy używane w formacie 7zbezstratne . Dlatego będzie limit, po którym nie będzie już mógł się kompresować. Ponadto obrazy wykonywalne (.exe) są zwykle plikami o wysokim stopniu kompresji. 7zip, podobnie jak wiele innych narzędzi do kompresji, osadza niektóre metadane, co w rzeczywistości może zwiększyć plik wyjściowy.

Łamigłówka: co by było, gdybyśmy mieli bezstratny algorytm, który zawsze może zmniejszyć rozmiar pliku?

W takim przypadku zawsze zobaczysz, że skompresowany plik jest mniejszy niż plik wejściowy. Zobacz komentarz poniżej, dlaczego nie jest to możliwe.

oleksii
źródło
5
Dowód sprzeczności. Hipoteza: załóżmy, że zawsze można skompresować plik za pomocą bezstratnego algorytmu. Krok 1. Pojedyncza kompresja zmniejsza plik wyjściowy co najmniej o jeden bit. Jeśli tak, po kilku iteracjach otrzymamy plik, który ma tylko dwa bity. Krok 2 Następna iteracja tworzy plik o rozmiarze 1 bitu. Krok 3 Ale algorytmy kompresji są bezstratne, co oznacza, że ​​dozwolona jest tylko jedna poprawna dekompresja. Oczywiście nie możesz przywrócić 2 oryginalnych bitów z 1 skompresowanego bitu - musisz zgadywać. Ostatni punkt narusza hipotezę.
oleksii
Nie możesz zagwarantować algorytmu zmniejszającego rozmiar pliku, ale możesz zagwarantować taki, który nie zwiększy rozmiaru, nie stosując „kompresji” w takich przypadkach. Aby naprawdę nie zwiększyć rozmiaru pliku, musisz wskazać to poza pasmem (np. W nazwie pliku).
jeteon,
@jeteon Nie jestem pewien, co próbujesz powiedzieć.
oleksii
Właśnie dodałem, że ponieważ zawsze masz opcję nieskompresowania danych wejściowych, możesz mieć program do kompresji, który w ogóle nie skompresuje pliku. Zasadniczo, jeśli stwierdzisz, że wersja skompresowana jest większa niż wersja nieskompresowana, po prostu ją zostaw. Będziesz musiał także w jakiś sposób wskazać, że tak jest, bez dodawania rozmiaru wyjścia, aby dekompresor wiedział, że plik nie został skompresowany. Jedynym sposobem na to bez zwiększania rozmiaru pliku jest zmiana nazwy pliku.
jeteon,
@jeteon och, rozumiem. Tak, ma sens.
oleksii
6

Jeśli oryginalny plik wykonywalny był już skompresowany (lub zawierał mocno skompresowane dane lub dane nieściśliwe), wówczas skompresowanie go zwiększy rozmiar.

PhonicUK
źródło
2

Większość algorytmów kompresji wykorzystuje tak zwaną tablicę symboli, po prostu tylko fragmenty pliku, który wykorzystuje jako elementy, które MOŻE skompresować. To oczywiście stwarza pewne obciążenie w pliku, ale zwykle powoduje znacznie mniejszy plik.

W już skompresowanych plikach nadal tworzy zestaw symboli, ale jest bardzo niewiele, aby można było zmniejszyć rozmiar. W twoim przypadku tablica symboli już skompresowanego pliku jest prawdopodobnie w okolicach 2 MB lub więcej, jeśli udało się go trochę skompresować.

Chad Harrison
źródło
0

kompresja ideea:

oprogramowanie do kompresji tworzy listę plików i eliminuje duplikaty treści.

podczas kompresji już skompresowanych plików możesz skompresować pliki większe niż oryginalne.

fromnaboo
źródło