Misalkan saya memiliki 10.000 file XML. Sekarang anggaplah saya ingin mengirim mereka ke teman. Sebelum mengirim mereka, saya ingin mengompres mereka.
Metode 1: Jangan kompres
Hasil:
Resulting Size: 62 MB
Percent of initial size: 100%
Metode 2: Zip setiap file dan kirim 10.000 file xml
Perintah:
for x in $(ls -1) ; do echo $x ; zip "$x.zip" $x ; done
Hasil:
Resulting Size: 13 MB
Percent of initial size: 20%
Metode 3: Buat zip tunggal yang berisi 10.000 file xml
Perintah:
zip all.zip $(ls -1)
Hasil:
Resulting Size: 12 MB
Percent of initial size: 19%
Metode 4: Menggabungkan file menjadi satu file & zip itu
Perintah:
cat *.xml > oneFile.txt ; zip oneFile.zip oneFile.txt
Hasil:
Resulting Size: 2 MB
Percent of initial size: 3%
Pertanyaan:
- Mengapa saya mendapatkan hasil yang jauh lebih baik ketika saya hanya zip file tunggal?
- Saya berharap mendapatkan hasil yang lebih baik secara drastis menggunakan metode 3 daripada metode 2, tetapi tidak. Mengapa?
- Apakah perilaku ini khusus untuk
zip
? Jika saya mencoba menggunakangzip
apakah saya akan mendapatkan hasil yang berbeda?
Informasi tambahan:
$ zip --version
Copyright (c) 1990-2008 Info-ZIP - Type 'zip "-L"' for software license.
This is Zip 3.0 (July 5th 2008), by Info-ZIP.
Currently maintained by E. Gordon. Please send bug reports to
the authors using the web page at www.info-zip.org; see README for details.
Latest sources and executables are at ftp://ftp.info-zip.org/pub/infozip,
as of above date; see http://www.info-zip.org/ for other sites.
Compiled with gcc 4.4.4 20100525 (Red Hat 4.4.4-5) for Unix (Linux ELF) on Nov 11 2010.
Zip special compilation options:
USE_EF_UT_TIME (store Universal Time)
SYMLINK_SUPPORT (symbolic links supported)
LARGE_FILE_SUPPORT (can read and write large files on file system)
ZIP64_SUPPORT (use Zip64 to store large files in archives)
UNICODE_SUPPORT (store and read UTF-8 Unicode paths)
STORE_UNIX_UIDs_GIDs (store UID/GID sizes/values using new extra field)
UIDGID_NOT_16BIT (old Unix 16-bit UID/GID extra field not used)
[encryption, version 2.91 of 05 Jan 2007] (modified for Zip 3)
Edit: Data meta
Satu jawaban menunjukkan bahwa perbedaannya adalah data meta sistem yang disimpan di zip. Saya tidak berpikir ini bisa terjadi. Untuk menguji, saya melakukan hal berikut:
for x in $(seq 10000) ; do touch $x ; done
zip allZip $(ls -1)
Zip yang dihasilkan adalah 1.4MB. Ini berarti masih ada ~ 10 MB ruang yang tidak dapat dijelaskan.
.tar.gz
bukan hanya zip seluruh direktori.$(ls -1)
, hanya menggunakan*
:for x in *
;zip all.zip *
Jawaban:
Zip memperlakukan konten setiap file secara terpisah saat mengompresi. Setiap file akan memiliki aliran terkompresi sendiri. Ada dukungan dalam algoritma kompresi (biasanya DEFLATE ) untuk mengidentifikasi bagian berulang. Namun, tidak ada dukungan di Zip untuk menemukan redundansi antar file.
Itu sebabnya ada begitu banyak ruang ekstra ketika konten di beberapa file: itu menempatkan aliran terkompresi yang sama di file beberapa kali.
sumber
there is no support in Zip to find redundancy between files
ada dalam spesifikasi file zip?Kompresi ZIP didasarkan pada pola berulang dalam data yang akan dikompresi, dan kompresi menjadi lebih baik semakin lama file, karena semakin banyak pola dapat ditemukan dan digunakan.
Sederhana, jika Anda mengompres satu file, kamus yang memetakan kode (pendek) ke pola (lebih lama) tentu terkandung dalam setiap file zip yang dihasilkan; jika Anda zip satu file panjang, kamus 'digunakan kembali' dan tumbuh lebih efektif di semua konten.
Jika file Anda bahkan sedikit mirip (seperti teks biasanya), penggunaan kembali 'kamus' menjadi sangat efisien, dan hasilnya adalah total zip yang jauh lebih kecil.
sumber
Dalam Zip, setiap file dikompres secara terpisah. Yang sebaliknya adalah 'kompresi padat', yaitu file dikompresi bersama. 7-zip dan Rar menggunakan kompresi padat secara default. Gzip dan Bzip2 tidak dapat mengkompres banyak file sehingga Tar digunakan terlebih dahulu, memiliki efek yang sama seperti kompresi padat.
Karena file xml memiliki struktur yang sama dan mungkin konten yang serupa jika file dikompresi bersama, kompresi akan lebih tinggi.
Sebagai contoh jika file berisi string
"<content><element name="
dan kompresor telah menemukan string di file lain itu akan menggantinya dengan pointer kecil ke pertandingan sebelumnya, jika kompresor tidak menggunakan 'kompresi padat', arus pertama string di file akan direkam sebagai literal yang lebih besar.sumber
Zip tidak hanya menyimpan konten file, Zip juga menyimpan metadata file seperti ID pengguna yang memiliki, izin, waktu pembuatan dan modifikasi, dan sebagainya. Jika Anda memiliki satu file, Anda memiliki satu set metadata; jika Anda memiliki 10.000 file, Anda memiliki 10.000 set metadata.
sumber
Opsi yang terlewatkan oleh OP adalah untuk meng-zip semua file bersamaan dengan kompresi dimatikan, kemudian zip zip yang dihasilkan dengan kompresi diatur ke maksimum. Ini secara kasar mengemulasi perilaku * nix .tar.Z, .tar.gz, .tar.bz, dll. Arsip terkompresi, dengan memungkinkan kompresi untuk mengeksploitasi redundansi melintasi batas file (yang tidak bisa dilakukan oleh algoritma ZIP saat dijalankan dalam satu lulus). Ini memungkinkan masing-masing file XML diekstraksi nanti, tetapi memaksimalkan kompresi. Kelemahannya adalah bahwa proses ekstraksi membutuhkan langkah ekstra, untuk sementara menggunakan lebih banyak ruang disk daripada yang diperlukan untuk .zip normal.
Dengan berbagai alat gratisan seperti 7-Zip untuk memperluas keluarga tar ke Windows, sebenarnya tidak ada alasan untuk tidak menggunakan .tar.gz atau .tar.bz, dll., Seperti Linux, OS X, dan BSD semuanya memiliki alat asli untuk memanipulasi mereka.
sumber
xz
/ 7-zip). Bagaimanapun, kamus adaptif dapat menangkap pola begitu mereka terlihat. Ini tidak seperti itu hanya membangun sistem pengkodean statis berdasarkan 32k pertama. Inilah sebabnya mengapa gzip tidak payah.Format kompresi zip menyimpan dan mengkompres setiap file secara terpisah. Itu tidak mengambil keuntungan dari pengulangan di antara file, hanya dalam file.
Menggabungkan file memungkinkan zip untuk mengambil keuntungan dari pengulangan di semua file, menghasilkan kompresi yang lebih drastis.
Misalnya, katakanlah setiap file XML memiliki header tertentu. Header itu hanya terjadi sekali di setiap file tetapi diulang hampir identik di banyak file lainnya. Dalam metode 2 dan 3, zip tidak bisa dikompres untuk ini tetapi dalam metode 4 itu bisa.
sumber
Di sebelah metadata Mike Scott disebutkan ada juga overhead dalam algoritma kompresi.
Ketika mengompresi sekelompok file kecil individual Anda harus sangat beruntung untuk dapat mengompres mereka bahwa itu hanya mengisi satu blok kompresi. Ketika mengompresi blok monolitik tunggal, sistem hanya dapat melanjutkan untuk mengalirkan data ke algoritmanya, mengabaikan 'batas' (karena kurangnya kata yang lebih baik) dari masing-masing file.
Juga ASCII diketahui memiliki faktor kompresi tinggi. plus xml sering sangat berulang-ulang menjadikan metadata sebagian besar dari data yang tidak dapat dengan mudah dikompresi sebagai konten xml.
Terakhir, jika memori berfungsi dengan benar, zip menggunakan sesuatu seperti pengkodean kamus, yang sangat efektif pada file ascii dan bahkan lebih pada XML karena pengulangannya
Dijelaskan Kompresi Data: http://mattmahoney.net/dc/dce.html
sumber
Pertimbangkan XML ini:
Suatu XML memiliki struktur yang sangat berulang, Zip mengambil keuntungan dari pengulangan tersebut untuk membangun kamus yang polanya lebih banyak terjadi dan kemudian, ketika mengompresi, menggunakan lebih sedikit bit untuk menyimpan pola yang lebih banyak diulang dan lebih banyak bit untuk menyimpan pola yang kurang berulang .
Ketika Anda menggabungkan file-file itu, file sumber (sumber untuk zip) besar tetapi berisi pola yang lebih berulang karena distribusi struktur membosankan XML diamortisasi di seluruh file besar, memberikan kesempatan kepada ZIP untuk menyimpan pola - pola tersebut. menggunakan bit lebih sedikit.
Sekarang, Jika Anda menggabungkan XML yang berbeda ke dalam satu file, bahkan ketika file-file tersebut memiliki nama tag yang sama sekali berbeda, algoritma kompresi akan menemukan distribusi pola terbaik di semua file dan bukan file per file.
Pada akhirnya, algoritma kompresi telah menemukan distribusi pola berulang terbaik.
sumber
Selain jawaban 7-Zip, ada pendekatan lain yang tidak sebagus tetapi layak untuk diuji jika karena alasan tertentu Anda tidak ingin menggunakan 7-Zip:
Kompres file zip. Sekarang, biasanya file zip tidak dapat dimampatkan tetapi ketika itu berisi banyak file yang identik kompresor dapat menemukan redundansi ini dan kompres. Perhatikan bahwa saya juga melihat keuntungan kecil ketika berhadapan dengan sejumlah besar file tanpa redundansi. Jika Anda benar-benar peduli tentang ukuran, ada baiknya mencoba jika Anda memiliki banyak file di zip Anda.
sumber