Berapa rasio kompresi maksimum gzip?

51

Berapa ukuran terbesar yang bisa didekompresi oleh gzip (misalnya 10kb)?

Zombie
sumber

Jawaban:

91

Ini sangat tergantung pada data yang dikompres. Pengujian cepat dengan file 1Gb yang penuh dengan nol memberikan ukuran terkompresi ~ 120Kb, sehingga file 10Kb Anda berpotensi berkembang menjadi ~ 85Mbytes.

Jika data memiliki redundansi yang rendah untuk memulai, misalnya, arsip berisi file gambar dalam format yang dikompresi secara asli (gif, jpg, png, ...), maka gzip dapat menambahkan kompresi lebih lanjut sama sekali. Untuk file biner seperti program yang dapat dieksekusi, Anda mungkin melihat kompresi 2: 1, untuk teks biasa, HTML atau markup lainnya 3: 1 atau 4: 1 atau lebih tidak mungkin. Anda mungkin melihat 10: 1 dalam beberapa kasus tetapi ~ 8700: 1 terlihat dengan file yang diisi dengan simbol tunggal adalah sesuatu yang Anda tidak akan melihat di luar keadaan buatan yang serupa.

Anda dapat memeriksa berapa banyak data yang akan dihasilkan dari membongkar file gzip, tanpa benar-benar menulis konten yang tidak dikompres ke disk, dengan gunzip -c file.gz | wc --bytes- ini akan membuka kompresi file tetapi tidak menyimpan hasilnya, alih-alih meneruskannya ke wcyang akan menghitung jumlah byte saat mereka lewat lalu buang mereka. Jika konten terkompresi adalah file tar yang berisi banyak file kecil Anda mungkin menemukan bahwa ruang disk yang dibutuhkan lebih banyak untuk membongkar arsip lengkap, tetapi dalam sebagian besar keadaan, jumlah yang dikembalikan dari gunziphasil perpipaan melalui wcakan seakurat yang Anda butuhkan.

David Spillett
sumber
Saya telah melihat HTML berkembang menjadi 10x (tentu saja x3 dan x4 adalah yang paling umum!) .... mungkin banyak data yang berlebihan untuk yang meledak + 8x. Saya pikir halaman yang dimaksud adalah halaman info php.
Zombi
Markup berulang, seperti yang terlihat pada output phpinfo(), kompres dengan sangat baik. Informasi teknis dalam output itu mengandung lebih banyak pengulangan langsung daripada potongan rata-rata bahasa alami juga, dan distribusi alfabet mungkin kurang lancar yang bisa membantu tahap Huffman mendapatkan hasil yang lebih baik.
David Spillett
Jawaban ini tidak memperhitungkan data terkompresi yang sengaja berbahaya . Seseorang dapat membuat file zip berbahaya sekitar 10KB yang dapat diperluas hingga lebih dari 4GB.
David Schwartz
Bom zip dengan skala seperti itu bergantung pada arsip bersarang, jadi sebagai manusia yang membongkar file Anda akan melihat sesuatu yang aneh tak lama kemudian. Mereka dapat digunakan sebagai serangan DoS yang efektif terhadap pemindai otomatis (pada layanan email dan sebagainya).
David Spillett
1
@ David Spillett: Bom pos bersarang meluas ke ukuran dalam kisaran petabyte. Bukan itu yang saya bicarakan. Lihatlah bahkan hanya satu lapisan bom ritsleting yang khas.
David Schwartz
10

Biasanya Anda tidak mendapatkan kompresi lebih dari 95% (sehingga data gzipped 10kB akan terdekompresi menjadi ~ 200kB), tetapi ada file yang dibuat khusus yang berkembang secara eksponensial. Carilah 42.zip, itu mendekompres ke beberapa petabyte (tidak berarti) data.

liori
sumber
4
Wikipedia mengatakan 42.zip adalah "berisi lima lapisan file zip bersarang dalam set 16", jadi itu bukan contoh yang valid untuk dekompresi (hanya untuk dekompresi rekursif).
Tgr
5
Memang, 42.zip secara khusus berbahaya bagi alat yang secara otomatis memindai file zip secara rekursif, misalnya pemindai virus.
thomasrutter
4
Itu zip, bukan gzip
BeniBela
8

Dikutip kata demi kata dari https://stackoverflow.com/a/16794960/293815

Rasio kompresi maksimum dari format deflate adalah 1032: 1. Ini karena proses terpanjang yang dapat dikodekan adalah 258 byte. Setidaknya diperlukan dua bit untuk setiap proses tersebut (satu bit untuk kode panjang dan satu bit untuk kode jarak), maka 4 * 258 = 1032 byte yang tidak terkompresi dapat dikodekan per satu byte terkompresi.

Anda bisa mendapatkan lebih banyak kompresi dengan gzip hasil gzip. Biasanya itu tidak meningkatkan kompresi, tetapi untuk berjalan sangat lama itu bisa.

By the way, pendekatan LZ77 yang digunakan oleh deflate lebih umum daripada pengkodean run-length. Alih-alih hanya panjang, pasangan panjang / jarak digunakan. Ini memungkinkan menyalin string dari jarak tertentu ke belakang, atau mereplikasi byte sebagai run-length untuk jarak satu, atau mereplikasi tiga kali lipat byte dengan jarak tiga, dll.

ioquatix
sumber
6

Rasio kompresi dari semua algoritma kompresi akan menjadi fungsi dari data yang dikompresi (selain panjang data itu).

Berikut ini adalah analisis di MaximumCompression ,
Lihatlah salah satu sampel seperti,

Ringkasan dari beberapa tes benchmark kompresi file

Jenis file: Beberapa jenis file (total 46)  
# file yang akan dikompres dalam tes ini: 510  
Total Ukuran File (byte): 316.355.757 
Ukuran File Rata-rata (byte): 620.305
File terbesar (byte): 18.403.071
File Terkecil (byte): 3,554
nik
sumber
4

File besar yang hanya berisi satu simbol akan memampatkan dengan sangat baik.

kutu buku
sumber
4

10 MB nol dalam file, kompres dengan gzip -9 hingga 10217. Jadi rasio maksimal terlihat sekitar 1000x.

nikos
sumber
1

Jawaban untuk pertanyaan Anda, tergantung inputnya. Untuk memberi Anda gambaran bagaimana kompresi dilakukan, tonton video enam menit ini.

https://www.youtube.com/watch?v=ZdooBTdW5bM

Apa yang harus Anda dapatkan dari itu adalah bahwa tingkat kompresi tergantung pada frekuensi masing-masing karakter, sehingga tidak ada tingkat maks generel, itu tergantung pada input, untuk teks bahasa Inggris sekitar 65 persen.

berambut cokelat
sumber
1
Selamat Datang di Pengguna Super! Silakan kutip bagian-bagian penting dari jawaban dari tautan referensi, karena jawabannya dapat menjadi tidak valid jika halaman yang tertaut berubah.
DavidPostill
Akan lebih akurat untuk mengatakan "frekuensi setiap string" daripada "frekuensi masing-masing karakter"
JoelFan