Bagaimana saya bisa mencapai kompresi ZIP standar terbaik?

20

Saya tidak peduli berapa lama waktu yang dibutuhkan untuk kompres, yang ingin saya capai adalah dua hal:

  • Rasio kompresi terbaik yang absolut
  • Kompatibilitas dengan pembaca standar, seperti Windows dan WinZip

Jadi saran seperti 7-zip tidak akan banyak berguna, kecuali 7-zip juga sedikit lebih baik pada kompresi ZIP standar (dibandingkan dengan menggunakan format .7z yang sangat bagus).

Idealnya saya mencari:

  • Rekomendasi perangkat lunak
  • Pengaturan khusus untuk perangkat lunak itu yang memungkinkan kompresi terbaik mutlak
  • Sesuatu yang gratis

Ingat, berapa lama waktu yang dibutuhkan untuk kompres tidak menjadi masalah!

Satu hal terakhir - beberapa file mungkin lebih baik dikompresi dengan pengaturan yang berbeda, seperti "Ukuran kata" atau "Ukuran kamus" - apakah ada alat yang dapat menganalisis file dan memilih rasio kompresi yang paling tepat, atau apakah WinZip, 7-zip dll sudah melakukannya?

Josh Comley
sumber

Jawaban:

20

Jika Anda ingin kompatibilitas dengan kemampuan Zip Folders pada Windows XP, Anda terjebak dengan kompresi Deflate. Saya tidak berpikir Anda bahkan dapat menggunakan Deflate64, apalagi metode kompresi canggih (seperti LZMA, PPMD, WavPack, Bzip2, dll.) Tersedia dalam versi terbaru winZip dan PowerArchiver. PowerArchiver setidaknya default untuk menggunakan ekstensi .zipx untuk file-file tersebut - saya belum berpikir WinZip melakukan itu.

File zip terkecil yang dapat dibuat oleh 7-Zip dapat dilakukan dengan baris perintah berikut:

7za a -mm=Deflate -mfb=258 -mpass=15 -r C:\Path\To\Archive.zip C:\Path\To\Files\*

Catatan khusus: parser wildcard 7-Zip tidak sama dengan kebanyakan orang lain pada sistem. *.*berarti semua file yang memiliki ekstensi. *berarti semua file.

Membuat file .zip dengan cara ini (dan, mungkin, menggunakan alat lain yang berupaya membuat file .zip "standar" yang lebih kecil) benar-benar lambat. Anda kemungkinan besar akan menghemat waktu dan ruang yang cukup dengan menggunakan 7-Zip atau WinRar untuk membuat arsip ekstraksi diri.

lebih gila
sumber
7z kesalahan saya pada "-m0" tapi saya kira "-mm" melakukan hal yang sama dengan versi terbaru. Saya juga memperhatikan bahwa, dalam kasus saya (mengompresi file JPG), menggunakan "-mx9" bukannya "-mfb = 258 -mpass = 15" hasilnya akan berbeda secara acak rata-rata ± 15 byte (dengan pengecualian pada ± 50s )
Mark Jeronimus
1
@ Zom-B: Anda benar, itu seharusnya -mm=bukan -m0=. -m0=digunakan pada .7zarsip. Juga, manual 7-Zip menentukan bahwa -mx=9untuk arsip Zip setara dengan -mfb=128 -mpass=10. Apa yang saya perhatikan adalah bahwa -mfb=258 -mpass=15selalu jauh lebih lambat daripada -mx=9dan sering tidak menghemat banyak ruang sama sekali (atau kadang-kadang menggunakan beberapa byte lebih banyak). Sesekali menghemat sedikit ruang yang layak.
Afrazier
"Banyak" lebih lambat dalam komentar sebelumnya diterjemahkan menjadi sedikit lebih dari 3 kali lebih lambat. Adapun ruang, opsi lebih lambat memberikan arsip sekitar. Ukuran 99.885% dibandingkan dengan versi yang lebih cepat (yaitu -mx = 9 tanpa -mpass = 15). Jadi, untuk 3x lebih banyak waktu seseorang dapat menghemat ruang hanya 0,115%. Jadi, kecuali jika kenaikan 0,115% sangat penting, gunakan -mx = 9 dan bukan -mpass = 15.
TV
8

Kompresor deflate terbaik (format kompresi yang digunakan oleh ZIP standar) yang saya tahu adalah:

Deflate file terkompresi perbandingan ukuran file dari kompresi data menggunakan Zopfli (diarsipkan dari aslinya ):

╔══════════════╦═══════════╦═════════╦═════════╦═════════╦═════════╗
║              ║Corpus size║gzip ­-9  ║7-­zip    ║kzip     ║Zopfli   ║
╠══════════════╬═══════════╬═════════╬═════════╬═════════╬═════════╣
║Alexa-top-10k ║  693108837║128498665║125599259║125163521║123755118║
║Calgary       ║    3141622║  1017624║   980674║   978993║   974579║
║Canterbury    ║    2818976║   730732║   675163║   674321║   669933║
║enwik8        ║  100000000║ 36445248║ 35102976║ 35025767║ 34995756║
╚══════════════╩═══════════╩═════════╩═════════╩═════════╩═════════╝

Bahkan pada PNG acak Zopfli mampu menjadi 0,5% lebih baik daripada pngout . Zopfli membuat yang terkecil dari semuanya.

Anon
sumber
Bagaimana saya bisa menggunakan Zopfli untuk memampatkan satu set file, seperti dengan perintah zip asli?
Panayotis
1
@Panayotis Pencarian Google untuk zip zopfli mengarah ke github.com/google/zopfli/issues/29 yang berbicara tentang bagaimana proyek zopfli tidak akan melakukan file Zip secara langsung tetapi termasuk diskusi tentang alat-alat seperti advzip AdvanceCOMP yang dapat menggunakan zopfli sebagai backend .
Anon
5

Dengan asumsi Anda menggunakan Windows: jika Anda masih ingin menggunakan format ZIP, saya akan merekomendasikan menggunakan utilitas baris perintah KZIP gratis Ken Silverman, ditemukan di sini . Salin di dalam folder yang berisi semua file yang perlu Anda kompres, buka folder itu menggunakan CMD, dan jalankan perintah berikut:

kzip /r <filename of ZIP file> *.*

Seperti yang disarankan Roald, yang terbaik adalah memasukkan direktori tempat kzip.exeberada dalam variabel PATH sistem Anda untuk mencegahnya dimasukkan dalam arsip / file Zip.

Sejauh ini, saya telah menemukan file ZIP yang dibuat dengan KZIP sekitar 10-20% lebih kecil daripada yang dibuat oleh program kompresi ZIP lainnya. Mereka juga sepenuhnya dapat dibuka oleh perangkat lunak arsip lainnya (Winzip, WinRAR, 7-zip, dll.) Dan oleh Windows.

Isxek
sumber
5
Bagaimana dengan tidak meletakkannya di direktori itu tetapi di suatu tempat di PATH sistem Anda?
RD
1
Saya memiliki persyaratan yang sama - harus didukung oleh fungsionalitas ZIP standar Windows. KZIP adalah apa yang akhirnya saya gunakan karena bekerja seperti juara. Pastikan untuk bermain dengan opsi / s / b / n untuk mendapatkan ide bagus tentang apa yang terbaik di lingkungan Anda.
Goyuix
Tentu saja! Variabel PATH. Saya sudah mengedit jawaban saya. Roald terima kasih!
Isxek
atau hanya awalan perintah dengan jalur yang dapat dieksekusi
micsthepick
1

Skrip super sederhana untuk mengkompres semua folder dalam folder ke file zip individual menggunakan .zip filetype dan metode kompresi Deflate64.

@echo off
for /d %%X in (*) do "c:\Program Files\7-Zip\7z.exe" a "%%X.zip" "%%X\" -tzip -mx9 -mm=Deflate64
SuperMar1o
sumber
-1

Ini lebih merupakan batasan seberapa banyak memori yang Anda miliki untuk kompresor saat melakukan pekerjaannya. Dengan menggunakan 7-Zip, saya akan mengemas arsip dengan format .Zip, kompresi Ultra, metode kompresi LZMA, dan ukuran kamus 64MB default. Jika Anda memiliki memori yang tersedia, maka naikkan ukuran kamus, meskipun perlu diketahui bahwa Anda akan membutuhkan hampir 3GB memori yang tersedia untuk dikompres dengan kamus 64MB. Menggunakan kamus yang lebih besar harus memungkinkan 7-zip untuk berburu lebih banyak pertandingan dan memberikan kompresi yang lebih baik jika Anda mampu membeli memori. LZMA mengalahkan gzip (deflate / deflate64, saya pikir) dan bzip2 dengan rata-rata 5% yang baik, hingga 10-12% tergantung pada konten.

Saya tidak tahu alat untuk menemukan ukuran kata / kamus terbaik, meskipun saya pikir Anda akan menemukan bahwa metode kompresi memiliki korelasi yang lebih kuat dengan data input, dan rata-rata / default seharusnya baik jika tidak.

Darth Android
sumber
3
Saya mengalami beberapa masalah dengan LZMA - misalnya, tidak peduli pengaturan apa yang saya coba di 7zip, file teks dalam zip ini ( joshz.com/Bad.zip ) tidak akan melakukan dekompresi menggunakan Windows 'built in decompresser (saya menggunakan Windows 7).
Josh Comley
(file zip yang saya
tautkan
@ joshcomley Saya tidak dapat menemukan daftar skema kompresi yang didukung untuk alat kompresi folder windows bawaan. Menurut Wikipedia untuk LZMA, ini didukung oleh WinZip dan banyak alat kompresi lainnya di berbagai platform, jadi saya memilih untuk menggunakannya. * .zip hanyalah format wadah, jadi saya tidak tahu apakah ada kompresi "resmi" yang akan didukung oleh alat, atau yang biasa (mirip dengan cara * .avi dapat menampung hampir semua jenis video). Jika Anda perlu memastikan itu selalu berhasil, kemaslah sebagai penggalian sendiri.
Darth Android
-3

Jika Anda mencari kompresor terbaik untuk lingkungan Windows , saya akan merekomendasikan Anda untuk mencoba format * .zip dengan 7-zip LZMA 'Metode Kompresi' ATAU menggunakan arsip SFX 7-Zip * .7z SFX. Arsip SFX memiliki overhead sekitar 130 kb lebih dari .7z file terkompresi dan layak digunakan ketika perbedaan ukuran antara .7z dan .zip besar.

Pesaing lain yang baik tetapi tidak umum adalah NSIS yang dapat menggunakan mode kompresi LZMA untuk membuat ongkos yang sangat dapat disesuaikan. Saya tahu NSIS bukan kompresor tetapi bahasa Scripting tapi saya terkesan performanya lebih baik daripada 7-zip SFX.

Tes yang saya lakukan dengan 2 file -

  • AutoHotkey-H.exe (946 kb)
  • AutoHotkey.dll (1003 kb)
  • Total Ukuran - 1955 kb

  • 7-Zip .zip - 794 kb
  • 7-Zip .7z SFX - 594 kb
  • NSIS LZMA Solid Compression - 552 kb
  • 7-Zip .7z - 461 kb

Karena # 4 bukan yang Anda inginkan, pemenang yang jelas adalah NSIS tetapi untuk alasan praktis, saya sarankan menggunakan .zip adalah ukuran yang dikompresi kurang dari 500 kbs dan jika lebih besar, gunakan alat pembuat exe seperti 7-Zip SFX atau NSIS (7-zip khususnya karena mudah diatur).

Avi
sumber
2
Persyaratan dalam pertanyaan secara khusus mengecualikan 7z dan format lainnya.
Bob
@ Bob Dia mengatakan kompresor yang kompatibel dengan Windows dan exe (my # 2 dan # 3) adalah. 7z hanya # 4 yang telah saya tunjukkan.
Avi