Neden 7zipli bir dosya ham dosyadan daha büyük? [çift]


37

Olası Çoğalt:
Neden ZIP Sıkıştırması hiçbir şeyi sıkıştırmıyor?

Bir .exe dosyasını 7zipping denedim ama aslında daha büyük oldu.

görüntü tanımını buraya girin

Beklenen sonuç bu mu?


3
Evet, beklenen sonuç. Neden? Çünkü bir şey zaten sıkıştırılmışsa (= mümkün olan daha küçük alanı kullanarak), daha fazla sıkıştırılamaz.
woliveirajr

4
Sadece herkese eklemek için - bu exe dosyası özellikle bir yükleyici olduğundan, içeriğinin çoğu muhtemelen bir zip veya kabin arşividir. Normal bir exe dosyasından aynı sonuçları elde edemezsiniz (ancak çoğu normal exe dosyası 145 megabayt olmaz)
Random832

1
Yalnızca temel mantığı kullanarak açıklama: Sıkıştırma, ham bir dosya için UNIQUE sıkıştırılmış bir dosya ve sıkıştırılmış bir dosya için UNIQUE işlenmemiş (sıkıştırılmamış) orijinal dosya bulur. 8 bit dosyalarınız olduğunu ve bunları 5 bit dosyalara sıkıştırmak istediğinizi düşünün. 256 benzersiz 8 bit dosya var, ancak yalnızca 32 benzersiz 5 bit dosya (!) Bu yüzden bazı 8 bit dosyaların aynı 5 bit dosya (!) Halinde sıkıştırılması gerekiyor. Ve eğer 2 farklı ham dosya aynı ZIP dosyasına sıkıştırılmışsa, hangisini sıkıştırmadan sonra açmak istersiniz? Herhangi bir sıkıştırma yöntemi için, sıkıştırma işleminden sonra daha küçük hale getirilmiş dosyalar varsa, daha büyük hale getirilen dosyalar olmalıdır (!)
Ivan Kuckir 22

Yanıtlar:


78

Entropi denilen bir konsepte iniyor . Vikipedi'ye bakınız .

Temel fikir, her zaman bir dosyayı küçültebilecek bir sıkıştırma işlemi varsa , o zaman mantık, bahsedilen sıkıştırma işleminin herhangi bir dosyayı 0 bayta indirgeyebileceğini ve hala tüm verileri koruyabileceğini söyler. Fakat bu çok saçma , çünkü biliyoruz ki 0 byte hiçbir bilgi aktaramaz. Bu nedenle , girişini her zaman daha küçük yapan bir sıkıştırma algoritması bulunmadığını kanıtladık , çünkü durum buysa, herhangi bir bilgi 0 baytta depolanabilir - ancak 0 bayt bilginin yokluğunu ima eder. t aynı anda hiçbir bilgiye ve tüm bilgilere sahip değilsiniz . Dolayısıyla, bu saçma.

Bu teorik konsept sayesinde, kullandığınız her sıkıştırma programı bazı girdilerin boyutunu artıracak (veya en iyi ihtimalle aynı boyutta olacak) . Diğer bir deyişle, tasarladığınız veya kullandığınız herhangi bir sıkıştırma algoritması için, daha küçük çıkacak ve bazıları çıkmayacak belirli girdiler olacaktır.

Zaten sıkıştırılmış veriler genellikle daha fazla sıkıştırma için korkunç bir adaydır, çünkü çoğu kayıpsız sıkıştırma algoritması aynı teorik ilkelere dayanır. İse daha da kötü sıkıştırılmış veriyi sıkıştırmak mümkün; ancak bu başlangıçta orijinal verilerden elde edilebilecek en iyi algoritma ile sıkıştırmaktan daha az etkilidir.

Örneğin, 100 MB'lık bir metin dosyanız varsa ve normal Zip algoritmasını kullanarak sıkıştırırsanız, 50 MB'a kadar sıkıştırılabilir. Daha sonra, Zip dosyasını LZMA2 ile sıkıştırırsanız, 40 veya 45 MB'a düşürebilirsiniz, çünkü LZMA, Sıkıştırılabilir verilerin çoğu için Zip'den daha yüksek bir sıkıştırma oranına sahiptir . Bu yüzden, Zip verilerini de sıkıştırabildiği için bir neden olabilir, çünkü Zip tüm entropiyi emmez. Ancak, Zip kabını tamamen ortadan kaldırırsanız, ham metni LZMA2 ile sıkıştırarak daha da küçültebilirsiniz, potansiyel olarak 30 - 35 MB mertebesinde bir şeyler verebilir (bunlar sadece kavramı göstermek için "hava numaralarıdır") .

Sıkıştırmaya çalıştığınız bu ikili dosyada daha büyüktür, çünkü 7-Zip dosya formatı kendi iç yapısını oluşturmak ve önceden sıkıştırılmış çalıştırılabilir verilerin verilerini 7-Zip formatına paketlemek zorundadır. Bu sözlük, dosya başlığı vb. Gibi şeyleri içerir. Bu ekstra veriler, genellikle verilerin kendisinin sıkıştırılmasının tasarrufuyla dengelenmekten daha fazladır, ancak sıkıştırmaya çalıştığınız yürütülebilir dosyanın zaten bir çeşit LZMA ile sıkıştırılmış olduğu anlaşılmaktadır; Aksi takdirde, 2 MB (çok fazla) artırmak yerine, yürütülebilir dosyanın boyutunu küçültebilir veya çok az artırabilir.


btw bu soruyu cevaplamanın en önemli kısmı en sonundadır: "Bu bir sözlük, dosya başlığı vb. gibi şeyleri içerir. Bu ekstra veriler genellikle verilerin kendisini sıkıştırmanın tasarrufuyla dengelenmekten daha fazladır Sıkıştırmaya çalıştığınız çalıştırılabilir dosya zaten LZMA ile sıkıştırılmış gibi görünüyor "
jhocking

6
@jhocking: Hayır, en önemli kısım ortasına doğru: " Kullandığınız her sıkıştırma programı bazı girdilerin boyutunu artıracak." 7zip'in dosya biçiminde bir sözlük / dosya başlığı / etc var, ancak 7zip bu şeylerden hiçbirine sahip olmayan bir algoritma kullansa da, bazı (aslında, çoğu) girdilerin çıktı alacağı garanti edildi girdilerin kendisinden daha büyük veya daha büyük. Bu, bilgi teorisinin temel bir gerçeğidir ve dosya başlıkları ile ilgisi yoktur.
BlueRaja - Danny Pflughoeft

2
@Mehrdad Sure: Her zaman orijinal girişi döndüren bir "sıkıştırma" algoritması yazmanız yeterli. Orada; yapılır. : P ... Bunun dışında, hayır - bir algoritma olan herhangi bir sıkıştırma algoritması , dosyanın başında sadece dosyanın bir sıkıştırılmış olup olmadığını belirten bir bit olsa bile , bazı meta verilere sahip olacak (0 == sıkıştırılmamış, 1 == sıkıştırılmış). AT ALL dosyasının içeriğini değiştirecekseniz, bazı meta verilere ihtiyacınız vardır . İçeriği değiştiriyorsanız bazı girdileri daha büyük hale getireceksiniz .
allquixotic

1
Bununla birlikte, sorunuz "Girişin uzunluğunu belirli bir meta verinin ötesinde artırmayacak herhangi bir sıkıştırma algoritması var mı?" İse, cevap: Bilmiyorum, ancak bunu yapmak teorik olarak mümkün olmalıdır. Aslında kolay. Tek yapmanız gereken bir kapsayıcı biçimini geliştirmek olduğunu ya orijinal dosya bulunur veya sıkıştırılmış veri akışı. Ardından, arşivi oluşturduğunuzda, sıkıştırmayı deneyin: eğer sıkıştırılmış boyut girdiden daha büyükse, orijinal girişi saklayın ve meta verilerinizi öne alın. Dosya boyutu artacak, ancak eğer meta veriler küçükse (devam ediyor)
allquixotic

2
@Mehrdad: "Herhangi bir girişin uzunluğunu arttırmayacak herhangi bir sıkıştırma algoritması var (ancak zayıf) var mı? " - Cevap hayır. Var 2^(n+1)-1boyutu, n-bit veya daha az olası mesajlar. Algoritmamız bunların her birini benzersiz bir çıktıya eşlemelidir. Bunlardan biri bile daha az bitli bir değerle eşlenirse, başka bir değer mutlaka birden fazla olanla eşlenmelidir.
BlueRaja - Danny Pflughoeft,

7

7z'de kullanılan temel sıkıştırma algoritmaları kayıpsızdır . Bu, bir dosyayı yinelemeli olarak sıkıştır-sıkıştırmasını açabileceğiniz anlamına gelir. Ayrıca, her yinelemeden sonra dosya tamamen aynı kalacaktır .

Ne yazık ki, kayıpsız bir sıkıştırma algoritmasının her zaman olumlu bir sonuçla birçok kez uygulanmasını bekleyemezsiniz . Üstünden atlayamayacağı katı bir sınır var. Kabaca, bu sınır, bir giriş dizisinin rastgele verileri ne kadar yakından birleştirdiğine bağlıdır. Her şeyden önce, kayıpsız algoritmalar dosya sıkıştırma, Internet HTML veri aktarımı, yedeklemeler ve bir çıktı dosyasının tam olarak aynı orijinal girdi dosyasına sıkıştırılmasını bekleyen diğer işlemler için kullanılır.

Kayıpsız sıkıştırmanın aksine, kayıpsız (veya kayıplı) sıkıştırma algoritmalarıyla sıkıştırmadan sonra bir dosya boyutunda küçülme bekleyebilirsiniz . Aşağı tarafı, tek bir sıkıştırmalı dekompresyon yinelemesinden sonra orijinal bir dosyayı tam olarak geri yükleyemezsiniz. Bu algoritmalar en çok ses / video / görüntü aktarımı ve depolamasıyla ünlüdür.

bzip2 , LZMA , LZMA2 ve 7z formatı tarafından kullanılan diğer algoritmalar tamamen kayıpsızdır . Bu nedenle artık sıkıştıramayacağı bir sınır olacaktır. Bunun da ötesinde, çalıştırılabilir görüntüler (.exe) genellikle yüksek oranda sıkıştırılmış dosyalardır. Diğerleri gibi 7zip sıkıştırma aracı, çıktı dosyasını daha büyük hale getirebilen bazı meta verileri içerir.

Zekâ: Eğer bir dosyanın boyutunu her zaman azaltabilecek kayıpsız bir algoritmaya sahip olsaydık?

Bu durumda, her zaman sıkıştırılmış dosyanın giriş dosyasından daha küçük olduğunu göreceksiniz. Bunun neden mümkün olmadığına dair bir yorumu görün.


5
Condiction tarafından kanıtı. Hipotez: Bir dosyayı kayıpsız bir algoritma ile sıkıştırmanın her zaman mümkün olduğunu varsayalım. Aşama 1. Tek sıkıştırma, çıktı dosyasını en az bir bit daha küçük yapar. Eğer öyleyse, birkaç yinelemeden sonra sadece iki bit olan bir dosya ile sonuçlanır. Adım 2 Sonraki yineleme, 1 bit boyutunda bir dosya yapar. Adım 3 Ancak sıkıştırma algoritmaları kayıpsızdır, bu sadece bir geçerli dekompresyona izin verildiği anlamına gelir. Açıkça 2 orijinal bit'i 1 sıkıştırılmış bitten geri yükleyemezsiniz - bir tahminde bulunmanız gerekir. Son nokta, hipotezi ihlal ediyor.
oleksii

Dosyayı daha küçük yapan bir algoritma garanti edemezsiniz, ancak bu durumlarda "sıkıştırma" uygulayarak boyutu artırmayacak olanı garanti edebilirsiniz. Gerçekten de dosya boyutunda bir artış olmamasını sağlamak için, bunu bant dışı (örneğin dosya adında) belirtmeniz gerekir.
jeteon

@jeteon Ne söylemeye çalıştığınızdan emin değilim.
oleksii,

Ben sadece şunu ekliyordum; girişi her zaman sıkıştırmama seçeneğiniz olduğundan, dosyayı en kötü şekilde sıkıştırmayacak bir sıkıştırma programına sahip olabilirsiniz. Temel olarak, sıkıştırılmış sürümün sıkıştırılmamış sürümden daha büyük olduğunu belirlerseniz, hemen bırakın. Ayrıca, bir şekilde, çıktının boyutuna ekleme yapmadan durumun böyle olduğunu belirtmeniz gerekir, böylece dekompresör dosyanın sıkıştırılmadığını bilir. Dosya boyutunu artırmadan bunu yapmanın tek yolu dosya adını değiştirmek gibi bir şey yapmaktır.
jeteon

@jeteon oh, anlıyorum. Evet, mantıklı.
oleksii,

6

Orijinal çalıştırılabilir dosya zaten sıkıştırılmışsa (veya yoğun biçimde sıkıştırılmış veriler veya sıkıştırılamaz veriler içeriyorsa), sıkıştırmanın boyutu artar.


2

Sıkıştırma algoritmalarının çoğu, sembol tablosu olarak adlandırılanları kullanır, temelde sadece sıkıştırdığı CAN olarak kullandığı dosyanın parçalarıdır . Bu, elbette, dosyada bir miktar ek yük oluşturur, ancak genellikle çok daha küçük bir dosya oluşturur.

Zaten sıkıştırılmış dosyalarda, yine de bir semboller kümesi oluşturur, ancak boyutu azaltabilecek çok az şey vardır. Sizin durumunuzda, önceden sıkıştırılmış dosyanın sembol tablosu muhtemelen 2 MB veya daha fazla mahallede ya da biraz sıkıştırma yapmayı başardıysa daha fazladır.


0

sıkıştırma ideea:

Sıkıştırma yazılımı, dosyaların bir listesini oluşturur ve yinelenen içeriği ortadan kaldırır.

Zaten sıkıştırılmış dosyaları sıkıştırırken, sıkıştırılmış dosyalarınızı orijinalinden daha büyük alabilirsiniz.

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.