Mengapa file 7 zip lebih besar dari file mentah? [duplikat]

37

Kemungkinan Duplikat:
Mengapa Kompresi ZIP tidak memampatkan sesuatu?

Saya mencoba 7zipping file .exe tetapi sebenarnya menjadi lebih besar.

masukkan deskripsi gambar di sini

Apakah ini hasil yang diharapkan?

IMB
sumber
3
Ya, itu hasil yang diharapkan. Mengapa? Karena ketika sesuatu sudah dikompresi (= menggunakan ruang yang lebih kecil yang mungkin), itu tidak dapat dikompresi lebih lanjut.
woliveirajr
4
Hanya untuk ditambahkan ke semua orang - karena file exe ini khusus adalah installer, sebagian besar kontennya mungkin merupakan arsip zip atau cab. Anda tidak akan mendapatkan hasil yang sama dari file exe normal (tetapi kebanyakan file exe normal tidak akan menjadi 145 megabita)
Random832
1
Penjelasan hanya menggunakan logika dasar: Kompresi menemukan file mentah file zip UNIK, dan file zip file UNIK mentah (tidak terkompresi). Bayangkan Anda memiliki file 8-bit dan ingin mengompresnya menjadi file 5-bit. Ada 256 file 8-bit yang unik, tetapi hanya 32 file 5-bit yang unik (!) Jadi beberapa file 8-bit harus dikompres ke dalam file 5-bit yang sama (!). Dan jika 2 file mentah berbeda dikompres menjadi file ZIP yang sama, mana yang ingin Anda dapatkan setelah dekompresi? Untuk metode zip apa pun, jika ada file yang menjadi lebih kecil setelah zip, harus ada file, yang menjadi lebih besar (!)
Ivan Kuckir

Jawaban:

78

Turun ke konsep yang disebut entropi . Lihat Wikipedia .

Ide dasarnya adalah bahwa, jika ada operasi kompresi yang selalu dapat membuat file lebih kecil, maka logika menentukan bahwa operasi kompresi akan dapat mengurangi file apa pun menjadi 0 byte dan masih mempertahankan semua data. Tetapi ini tidak masuk akal , karena kita tahu bahwa 0 byte tidak dapat menyampaikan informasi sama sekali. Jadi kami baru saja membuktikan bahwa tidak ada algoritma kompresi yang selalu membuat inputnya lebih kecil, karena jika itu masalahnya, informasi apa pun dapat disimpan dalam 0 byte - tetapi 0 byte menyiratkan tidak adanya informasi, sehingga Anda dapat ' t secara bersamaan tidak memiliki informasi dan semua informasi. Karenanya, itu tidak masuk akal.

Karena konsep teoretis ini, setiap program kompresi yang pernah Anda gunakan akan menambah ukuran (atau paling banter, mempertahankan ukuran yang sama) dari beberapa input. Artinya, untuk algoritma kompresi apa pun yang Anda desain atau gunakan, akan ada input tertentu yang akan keluar lebih kecil, dan beberapa yang tidak.

Data yang sudah dikompres umumnya merupakan kandidat yang mengerikan untuk kompresi lebih lanjut, karena kebanyakan algoritma kompresi lossless didasarkan pada prinsip-prinsip teoretis yang sama. Hal ini dimungkinkan untuk kompres data buruk-dikompresi lebih jauh; tetapi ini kurang efisien daripada hanya mengompresnya dengan algoritma terbaik yang tersedia dari data asli untuk memulai.

Misalnya, jika Anda memiliki file teks 100 MB dan kompres dengan menggunakan algoritma Zip biasa, mungkin akan dikompresi hingga 50 MB. Jika Anda kemudian mengompres file Zip dengan LZMA2, Anda mungkin mendapatkannya hingga 40 atau 45 MB, karena LZMA memiliki rasio kompresi yang lebih tinggi untuk sebagian besar data kompresibel daripada Zip. Jadi masuk akal bahwa itu juga dapat mengompresi data Zip, karena Zip tidak sepenuhnya menyedot semua entropi dari itu. Tetapi jika Anda menghilangkan wadah Zip sepenuhnya, Anda mungkin bisa membuatnya lebih kecil dengan mengompresi teks mentah dengan LZMA2, berpotensi menghasilkan sesuatu pada urutan 30 - 35 MB (ini hanya "nomor udara" untuk menggambarkan konsep) .

Dalam kasus biner yang Anda coba kompres, ini lebih besar karena format file 7-Zip harus membuat struktur internal sendiri dan mengemas data yang dapat dieksekusi yang sudah dikompresi ke dalam format 7-Zip. Ini berisi hal-hal seperti kamus, header file, dan sebagainya. Data tambahan ini biasanya lebih dari diimbangi dengan penghematan mengompresi data itu sendiri, tetapi tampaknya executable yang Anda coba kompres sudah dikompres dengan beberapa bentuk LZMA; jika tidak, kemungkinan akan mengecilkan ukuran executable atau sangat sedikit meningkatkannya, daripada meningkatkannya sebesar 2 MB (yang banyak).

allquixotic
sumber
btw bagian paling penting untuk menjawab pertanyaan ini tepat di akhir: "Ini berisi hal-hal seperti kamus, header file, dan sebagainya. Data tambahan ini biasanya lebih dari diimbangi oleh penghematan mengompresi data itu sendiri, tetapi tampaknya executable yang Anda coba kompres sudah dikompres dengan beberapa bentuk LZMA "
jhocking
6
@jhocking: Tidak, bagian terpenting adalah di tengah: "Setiap program kompresi yang Anda gunakan akan menambah ukuran ... beberapa input." Format file 7zip memiliki kamus / file-header / etc, tetapi bahkan jika 7zip menggunakan algoritma yang tidak memiliki hal-hal tersebut, kami masih dijamin bahwa beberapa (pada kenyataannya, sebagian besar) input akan memiliki output yang sebagai-besar-atau-lebih besar dari input itu sendiri. Ini adalah fakta dasar teori informasi, dan tidak ada hubungannya dengan header file.
BlueRaja - Danny Pflughoeft
2
@Mehrdad Sure: Cukup tulis algoritma "kompresi" yang selalu mengembalikan input asli. Sana; selesai : P ... Selain itu, tidak - algoritme kompresi yang merupakan algoritme sama sekali akan memiliki beberapa metadata, bahkan jika hanya satu bit pada awal file yang menunjukkan apakah file dikompresi atau tidak (0 == tidak terkompresi, 1 == dikompresi). Jika Anda akan memodifikasi konten file AT ALL , Anda perlu beberapa metadata. Dan jika Anda memodifikasi konten, Anda akan membuat beberapa input lebih besar.
allquixotic
1
Namun, jika pertanyaan Anda adalah "Apakah ada algoritma kompresi yang tidak menambah panjang input melebihi jumlah tetap metadata", jawabannya adalah: Saya tidak tahu, tetapi secara teori harus dimungkinkan untuk melakukannya. Sebenarnya mudah. Yang harus Anda lakukan adalah mengembangkan format wadah yang dapat baik berisi file asli, atau aliran data terkompresi. Kemudian, ketika Anda membuat arsip, coba kompres: jika ukuran terkompresi lebih besar dari input, simpan saja input asli dan kemas metadata Anda di depan. Ukuran file akan meningkat, tetapi jika metadata kecil (lanjutan)
allquixotic
2
@Mehrdad: "Apakah ada algoritme kompresi (betapapun buruknya) yang tidak menambah panjang input? " - Jawabannya adalah tidak. Ada 2^(n+1)-1kemungkinan pesan berukuran n-bit atau kurang. Algoritme kami harus memetakan masing-masing ke output yang unik . Jika salah satu dari ini dipetakan ke nilai dengan bit lebih sedikit, nilai lain harus dipetakan ke nilai lebih.
BlueRaja - Danny Pflughoeft
7

Algoritma kompresi yang mendasari digunakan dalam 7z adalah lossless . Yang berarti Anda dapat mengompres-ulang file berulang kali secara berulang. Selanjutnya, setelah setiap iterasi file akan tetap sama persis .

Sayangnya, Anda tidak dapat mengharapkan algoritma kompresi lossless diterapkan berkali-kali dengan selalu hasil positif. Ada batasan ketat yang tidak bisa dilompati. Secara kasar, batas ini tergantung pada seberapa dekat urutan input mengemas data acak. Di atas semua itu, algoritma lossless digunakan untuk kompresi file, transfer data HTML Internet, backup, dan operasi lain yang mengharapkan file output didekompresi menjadi file input asli yang sama persis.

Berbeda dengan kompresi lossless , Anda mungkin selalu mengharapkan penurunan ukuran file setelah kompresi dengan algoritma kompresi lossful (atau lossy) . Sisi bawah adalah bahwa Anda tidak dapat persis mengembalikan file asli setelah kompres-dekompresi iterasi tunggal. Algoritma ini paling terkenal untuk transmisi dan penyimpanan audio / video / gambar.

bzip2 , LZMA , LZMA2 dan algoritma lain yang digunakan oleh format 7z semuanya lossless . Karena itu akan ada batas setelah itu tidak bisa lagi dikompres. Selain itu, gambar yang dapat dieksekusi (.exe) biasanya merupakan file yang sangat terkompresi. 7zip karena banyak alat kompresi lainnya menanamkan beberapa metadata, yang pada kenyataannya dapat membuat file output lebih besar.

Brain teaser: bagaimana jika kita memang memiliki algoritma lossless yang selalu dapat mengurangi ukuran file?

Dalam hal ini, Anda akan selalu melihat bahwa file terkompresi lebih kecil dari file input. Lihat komentar di bawah mengapa itu tidak mungkin.

oleksii
sumber
5
Bukti berdasarkan kontradiksi. Hipotesis: Misalkan selalu mungkin untuk mengompres file dengan algoritma lossless. Langkah 1. Kompresi tunggal membuat file output lebih kecil setidaknya satu bit. Jika demikian, setelah sejumlah iterasi kita akan berakhir dengan file yang hanya memiliki dua bit. Langkah 2 Pengulangan selanjutnya membuat file berukuran 1 bit. Langkah 3 Tetapi algoritma kompresi ini lossless, yang berarti hanya ada satu dekompresi yang valid yang diperbolehkan. Jelas Anda tidak dapat mengembalikan 2 bit asli dari 1 bit terkompresi - Anda harus menebak. Poin terakhir melanggar hipotesis.
oleksii
Anda tidak dapat menjamin algoritma yang membuat file lebih kecil tetapi Anda dapat menjamin algoritma yang tidak akan menambah ukuran dengan menerapkan tidak ada "kompresi" dalam kasus tersebut. Agar benar-benar tidak memiliki peningkatan ukuran file, Anda harus menunjukkan ini keluar dari band (misalnya dalam nama file).
Juni
@ Jameson Saya tidak yakin apa yang Anda katakan.
oleksii
Saya baru saja menambahkan bahwa karena Anda selalu memiliki opsi untuk tidak mengompresi input, Anda dapat memiliki program kompresi yang tidak akan memampatkan file sama sekali paling buruk. Pada dasarnya, jika Anda menentukan bahwa versi terkompresi lebih besar dari versi terkompresi, maka Anda tinggal meninggalkannya. Anda juga harus menunjukkan entah bagaimana bahwa ini terjadi tanpa menambahkan ukuran output sehingga decompresser tahu file tidak dikompresi. Satu-satunya cara untuk melakukan ini tanpa meningkatkan ukuran file, adalah melakukan sesuatu seperti mengubah nama file.
Juni
@ James oh, begitu. Ya, masuk akal.
oleksii
6

Jika executable asli sudah dikompresi (atau berisi data yang sangat terkompresi atau data yang tidak dapat dikompres) maka mengompresnya akan menambah ukuran.

PhonicUK
sumber
2

Kebanyakan algoritma kompresi menggunakan apa yang disebut tabel simbol, pada dasarnya hanya bagian dari file yang digunakannya sebagai elemen yang BISA dikompres. Ini, tentu saja, membuat beberapa overhead dalam file tetapi biasanya menghasilkan file yang jauh lebih kecil.

Dalam file yang sudah dikompresi, masih membuat satu set simbol, tetapi ada sangat sedikit yang dapat mengurangi ukurannya. Dalam kasus Anda, tabel simbol dari file yang sudah dikompresi mungkin berada di sekitar 2 MB atau mungkin lebih jika berhasil melakukan kompresi.

Chad Harrison
sumber
0

ide kompresi:

perangkat lunak kompresi membuat daftar file dan menghilangkan konten duplikat.

saat mengompresi file yang sudah dikompresi, Anda mungkin mendapatkan file yang dikompresi lebih besar dari aslinya.

fromnaboo
sumber