Jak uzyskać najlepszą standardową kompresję ZIP?

20

Nie obchodzi mnie, ile czasu zajmuje kompresja, wszystko, co chcę osiągnąć, to dwie rzeczy:

  • Absolutnie najlepszy możliwy stopień kompresji
  • Kompatybilność ze standardowymi czytnikami, takimi jak Windows i WinZip

Tak więc sugestie, takie jak 7-zip, nie będą miały większego zastosowania, chyba że 7-zip jest również nieco lepszy w standardowej kompresji ZIP (w przeciwieństwie do używania bardzo dobrego formatu .7z).

Idealnie szukam:

  • Rekomendacja oprogramowania
  • Szczegółowe ustawienia tego oprogramowania, które umożliwiają absolutnie najlepszą kompresję
  • Coś za darmo

Pamiętaj, że czas kompresji nie jest problemem!

I ostatnia rzecz - niektóre pliki mogą być lepiej skompresowane przy różnych ustawieniach, takich jak „Rozmiar słowa” lub „Rozmiar słownika” - czy istnieje narzędzie, które może analizować pliki i wybierać najbardziej odpowiedni współczynnik kompresji, czy też WinZip, 7-zip itd. już to robisz?

Josh Comley
źródło

Odpowiedzi:

20

Jeśli chcesz kompatybilności z funkcją Zip Folders wbudowaną w Windows XP, utkniesz z kompresją Deflate. Nie sądzę, że możesz nawet używać Deflate64, a tym bardziej zaawansowanych metod kompresji (takich jak LZMA, PPMD, WavPack, Bzip2 itp.) Dostępnych w najnowszych wersjach winZip i PowerArchiver. PowerArchiver przynajmniej domyślnie używa rozszerzenia .zipx dla tych plików - nie sądzę, że WinZip jeszcze to robi.

Najmniejszy możliwy plik zip, który może utworzyć 7-Zip, można wykonać za pomocą następującego wiersza poleceń:

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

Na szczególną uwagę: parser symboli wieloznacznych 7-Zip nie jest taki sam jak większość innych w systemie. *.*oznacza wszystkie pliki, które mają rozszerzenia. *oznacza wszystkie pliki.

Tworzenie plików .zip w ten sposób (i przypuszczalnie za pomocą innych narzędzi, które próbują tworzyć mniejsze „standardowe” pliki .zip) jest naprawdę bardzo powolne. Najprawdopodobniej zaoszczędziłbyś sporo czasu i miejsca, używając 7-Zip lub WinRar do tworzenia samorozpakowujących się archiwów.

afrazier
źródło
Mój błąd 7z wyskoczył na „-m0”, ale chyba „-mm” robi to samo z najnowszymi wersjami. Zauważyłem również, że w moim przypadku (kompresja plików JPG) użycie „-mx9” zamiast „-mfb = 258 -mpass = 15” wynik będzie się różnić losowo średnio o ± 15 bajtów (z wyjątkami przypadającymi na ± 50s )
Mark Jeronimus
1
@ Zom-B: Masz rację, to powinno być -mm=zamiast -m0=. -m0=jest używany w .7zarchiwach. Ponadto instrukcja 7-Zip określa, że -mx=9dla archiwów Zip jest to równoważne z -mfb=128 -mpass=10. Zauważyłem, że -mfb=258 -mpass=15zawsze jest o wiele wolniejszy -mx=9i często nie oszczędza dużo miejsca (lub czasami zużywa kilka bajtów więcej). Od czasu do czasu oszczędza sporo miejsca.
afrazier
„znacznie” wolniej w poprzednim komentarzu przekłada się na nieco ponad 3 razy wolniej. co do miejsca, wolniejsza opcja daje archiwum ok. Rozmiar 99,885% w porównaniu do szybszej (tj. -Mx = 9 bez -mpass = 15) wersji. Tak więc, 3 razy więcej czasu można zaoszczędzić tylko 0,115% miejsca. Tak więc, chyba że zwiększenie o 0,115% jest bardzo ważne, wybierz -mx = 9 zamiast -mpass = 15.
TV
8

Najlepsze znane mi kompresory deflate (format kompresji używany przez standardowe ZIP) to:

Deflate porównanie rozmiaru skompresowanego pliku z kompresji danych przy użyciu Zopfli (zarchiwizowane z oryginału ):

╔══════════════╦═══════════╦═════════╦═════════╦═════════╦═════════╗
║              ║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║
╚══════════════╩═══════════╩═════════╩═════════╩═════════╩═════════╝

Nawet na losowych plikach PNG Zopfli był o 0,5% lepszy niż pngout . Zopfli jest najmniejszym z nich wszystkich.

Anon
źródło
Jak mogę użyć Zopfli do kompresji zestawu plików, tak jak w przypadku oryginalnego polecenia zip?
Panayotis
1
@Panayotis Wyszukiwanie zopfli zip przez Google prowadzi do github.com/google/zopfli/issues/29, który mówi o tym, jak projekt zopfli nie zrobi bezpośrednio plików Zip, ale zawiera omówienie narzędzi takich jak Advzip AdvanceCOMP, który może używać zopfli jako backendu .
Anon
5

Zakładając, że korzystasz z systemu Windows: jeśli nadal chcesz korzystać z formatu ZIP, polecam skorzystanie z bezpłatnego narzędzia wiersza poleceń KZIP Kena Silvermana, które znajduje się tutaj . Skopiuj go do folderu zawierającego wszystkie pliki, które chcesz skompresować, przejdź do tego folderu za pomocą CMD i uruchom następujące polecenie:

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

Jak sugeruje Roald, najlepiej dołączyć katalog, w którym kzip.exeznajduje się zmienna PATH w systemie, aby nie została uwzględniona w pliku archiwum / Zip.

Jak dotąd odkryłem, że pliki ZIP utworzone za pomocą KZIP są około 10-20% mniejsze niż pliki utworzone przez inne programy do kompresji ZIP. Można je również w pełni otworzyć za pomocą innego oprogramowania do archiwizacji (Winzip, WinRAR, 7-zip itp.) Oraz systemu Windows.

Isxek
źródło
5
Co powiesz na nie umieszczanie go w tym katalogu, ale gdzieś na ŚCIEŻCE twojego systemu?
RD
1
Miałem te same wymagania - musi być obsługiwany przez standardową funkcjonalność ZIP systemu Windows. Skończyło się na KZIP, ponieważ działał jak mistrz. Pamiętaj, aby zagrać w opcje / s / b / n, aby dowiedzieć się, co najlepiej działa w twoim środowisku.
Goyuix
Oczywiście! Zmienna PATH. Zredagowałem swoją odpowiedź. Dzięki Roald!
Isxek
lub po prostu
poprzedź
1

Super prosty skrypt do kompresji wszystkich folderów w folderze do pojedynczych plików zip przy użyciu typu pliku .zip i metody kompresji Deflate64.

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

Jest to bardziej limit ilości pamięci, którą musisz udostępnić kompresorowi podczas wykonywania jego pracy. Korzystając z 7-Zip, spakowałbym archiwum w formacie .Zip, Ultra kompresja, metoda kompresji LZMA i domyślny rozmiar słownika 64 MB. Jeśli masz dostępną pamięć, zwiększ rozmiar słownika, ale pamiętaj, że potrzebujesz prawie 3 GB dostępnej pamięci do skompresowania za pomocą słownika 64 MB. Korzystanie z większego słownika powinno pozwolić 7-zip na polowanie na więcej dopasowań i zapewnić lepszą kompresję, jeśli możesz sobie pozwolić na pamięć. LZMA pokonuje zarówno gzip (deflate / deflate64, jak sądzę), jak i bzip2 średnio o dobre 5%, do 10-12% w zależności od zawartości.

Nie znam narzędzia do znalezienia najlepszego rozmiaru słowa / słownika, ale myślę, że przekonasz się, że metoda kompresji ma silniejszą korelację z danymi wejściowymi, w przeciwnym razie średnia / domyślna powinna być dobra.

Darth Android
źródło
3
Mam problem z LZMA - na przykład, bez względu na to, jakie ustawienia wypróbuję w 7zip, plik tekstowy w tym pliku zip ( joshz.com/Bad.zip ) nie będzie dekompresowany przy użyciu wbudowanego dekompresora systemu Windows (używam systemu Windows 7).
Josh Comley
(plik zip, z którym się
łączyłem,
@ joshcomley Nie mogłem znaleźć listy obsługiwanych schematów kompresji dla wbudowanego narzędzia do kompresji folderów w systemie Windows. Według Wikipedii dla LZMA jest obsługiwany przez WinZip i wiele innych narzędzi do kompresji na różnych platformach, więc zdecydowałem się na to. * .zip jest tylko formatem kontenera, więc nie wiem, czy istnieje „oficjalna” kompresja obsługiwana przez narzędzia, czy zwykłe (podobne do tego, w jaki sposób * .avi może przechowywać prawie każdy rodzaj wideo). Jeśli chcesz mieć pewność, że zawsze działa, zapakuj go jako samorozpakowujący się.
Darth Android
-3

Jeśli szukasz najlepszego kompresora dla środowisk Windows , polecam wypróbowanie formatu * .zip z 7- zipową metodą kompresji LZMA LUB użycie archiwów 7-Zip * .7z SFX. Archiwa SFX mają narzut około 130 kb ponad skompresowanych plików .7z i warto je stosować, gdy różnica wielkości między .7z a .zip jest duża.

Innym dobrym, ale niecodziennym konkurentem jest NSIS, który może korzystać z trybu kompresji LZMA w celu tworzenia wysoce dostosowanych plików ex. Wiem, że NSIS nie jest kompresorem, ale językiem skryptowym, ale byłem pod wrażeniem, że działał lepiej niż 7-zip SFX.

Test, który zrobiłem z 2 plikami -

  • AutoHotkey-H.exe (946 kb)
  • AutoHotkey.dll (1003 kb)
  • Rozmiar całkowity - 1955 kb

  • 7-Zip .zip - 794 kb
  • 7-Zip .7z SFX - 594 kb
  • Kompresja stała NSIS LZMA - 552 kb
  • 7-Zip .7z - 461 kb

Ponieważ # 4 nie jest tym, czego chcesz, wyraźnym zwycięzcą jest NSIS, ale ze względów praktycznych sugeruję, że użycie pliku .zip to skompresowany rozmiar mniejszy niż 500 kbs, a jeśli większy, skorzystaj z narzędzia do tworzenia exe, takiego jak 7-Zip SFX lub NSIS (w szczególności 7-zip, ponieważ jest łatwy w konfiguracji).

Avi
źródło
2
Wymagania w pytaniu wyraźnie wykluczają 7z i inne formaty.
Bob
@ Bob Powiedział, że kompresor jest kompatybilny z Windows i exe (mój # 2 i # 3) jest. 7z to tylko nr 4, o którym wspomniałem.
Avi