LZMA ( anglicky Lempel-Ziv-Markov chain-Algorithm ) je algoritmus pro kompresi dat vyvinutý od roku 1996 nebo 1998 Igorem Pavlovem [1] . Používá se v archivátoru 7-Zip stejným autorem k vytváření komprimovaných archivů ve formátu 7z.
Algoritmus je založen na schématu komprese dat ze slovníku , podobnému schématu používanému v LZ77 , a poskytuje vysoký kompresní poměr (obvykle vyšší než poměr získaný při komprimaci pomocí bzip2 ) a také umožňuje použití slovníků různých velikostí (až 4 GB [2] ).
lzma je také nástroj pro kompresi dat příkazového řádku s otevřeným zdrojovým kódem ze sady LZMA SDK , který pracuje se soubory, které mají formát .lzma a příponu .
Open source vývojová sada LZMA, napsaná v C++ , používá vylepšený kompresní algoritmus LZ77 doplněný o algoritmus pro vzdálené kódování a také speciální postupy pro zpracování binárních souborů.
LZMA podporuje různé varianty řetězců hash , binární stromy a stromy předpon jako základ algoritmů vyhledávání ve slovníku.
LZMA SDK také obsahuje algoritmus BCJ/BCJ2 implementovaný pro procesory architektury x86 , ARM , PowerPC , IA-64 a ARM Thumb. V něm se skokové body před kompresí normalizují - tedy např. pro x86 to znamená, že instrukce pro blízké a podmíněné skoky a volání funkcí se převedou z formuláře s relativním posunem "jdi zpět o 1665 bajtů" do podoby s absolutní adresa "přejít na adresu 5554".
Algoritmus BCJ2 implementovaný v 7-Zip používá 32bitové adresování. V UPX spustitelném packeru závisí adresování na typu architektury (například 16bitové adresování se používá pro spustitelné soubory DOS ).
Implementace, která byla od verze 4.61 beta přesunuta z CPL do veřejné domény , má následující vlastnosti:
Velikost rozbalovacího kódu LZMA je asi 5 KB; dynamická spotřeba paměti závisí na velikosti slovníků. Tyto vlastnosti umožňují implementovat rozbalování na vestavěných systémech .
Použití funkcí Microsoft Windows ve zdrojovém kódu znesnadňuje vytváření unixových verzí programu. Existují však dvě funkční portované verze: p7zip více či méně portované verze nástrojů příkazového řádku 7z a 7za pro systémy POSIX ( GNU/Linux , Solaris , OpenBSD , FreeBSD , Cygwin a další), Mac OS X a BeOS .
Existuje také oficiální přenosná implementace LZMA Utils, která je navržena pro vytváření inline kompresorů jako gzip [3] . Od roku 2008 se stále více používá v systémech pro správu balíčků - zejména dpkg a RPM .
7-Zip používá poměrně flexibilní formát archivu a podporují jej i některé nástroje třetích stran (například čtení 7z podporuje WinRAR ).
K dispozici je také port 7-Zip pro Mac OS X s názvem Compress, což je v současné době poměrně nedokončený nástroj. Pro Mac OS X existují také sestavení p7zip a 7zX .
Pro práci s LZMA autor poskytuje své multiplatformní SDK, které má výše uvedené vlastnosti. Většina SDK je napsána v C++ a původně distribuována za podmínek GNU LGPL. Stojí za zmínku několik bodů:
Některá síťová zařízení (jako US Robotics 9105 a 9106) používají jako firmware upravený Linux , spouštěný z komprimovaného souborového systému. Algoritmus LZMA se používá namísto Zlib jako kompresní algoritmus souborového systému. Obvykle je tímto souborovým systémem squashfs s opravou LZMA [4] [5] .
Kromě toho se LZMA používá v implementacích UEFI jako jeden z kompresních algoritmů.
LZMA2 je nová verze algoritmu LZMA. Tento algoritmus má oproti algoritmu LZMA následující výhody:
Kompresní metody | |||||||
---|---|---|---|---|---|---|---|
Teorie |
| ||||||
Bezztrátový |
| ||||||
Zvuk |
| ||||||
snímky |
| ||||||
Video |
|
Archivní formáty | |
---|---|
Pouze archivace | |
Pouze komprese | |
Archivace a komprese | |
Balení a distribuce softwaru |