LZMA

2001年推出的壓縮演演算法

LZMA,(Lempel-Ziv-Markov chain-Algorithm的縮寫),是一個Deflate和LZ77演演算法改良和優化后的壓縮演演算法,開發者是Igor Pavlov,2001年被首次應用於7-Zip壓縮工具中,是 2001年以來得到發展的一個數據壓縮演演算法。它使用類似於 LZ77 的字典編碼機制,在一般的情況下壓縮率比 bzip2 為高,用於壓縮的可變字典最大可達4GB。

簡介


C++語言寫成的的 LZMA開放源碼壓縮庫使用了區間編碼支持的 LZ77 改進壓縮演演算法以及特殊的用於二進位的預處理程序。
數據流、重複序列大小以及重續序列位置單獨進行了壓縮。
LZMA 支持幾種散列鏈變體、二叉樹以及基數樹作為它的字典查找演演算法基礎。
BCJ / BCJ2 二進位文件壓縮
BCJ/ BCJ2 壓縮工具所附帶的 LZMA SDK 包括:在 X86、ARMPowerPC、IA-64 以及 ARM Thumb 處理器上在壓縮之前跳轉目標進行歸一化處理。對於x86 平台來說,這是一個近跳轉、近調用以及近條件跳轉需要從“向後跳 1665位元組”這樣的機器語言歸一化到“跳轉到 5554”這樣的格式,但是短跳轉及短條件跳轉不需要進行這樣的處理。
儘管 7-Zip BCJ2 使用 32 位的偏移地址,但是UPX 這樣的可執行文件壓縮工具當檢測到 16 位 DOS 二進位文件格式的時候仍然可以使用 16 位的數值。RAR壓縮工具對 32 位的 x86可執行文件以及 IA64 Itanium 可執行文件進行偏移地址壓縮。
BCJ 與 BCJ2 之間的區別在於前者只將近跳轉及近調用目標地址轉換到歸一化的形式,而 BCJ2 只將 x86 平台下的近跳轉、近調用及條件近跳轉目標分別進行壓縮。

特點


一些微軟Windows專有的特性深深嵌入在源程序中,這樣就很難生成一個與Unix 兼容的版本。但是,已經有兩個移植到類 Unix 平台的版本:
*p7zip是一個或多或少地完全將 7z 及 7za 移植到 POSIX 的7-zip版本,這些系統包括Linux、SolarisOpenBSDFreeBSD、Cygwin 等Unix系統以及Mac OS X和BeOS等。
* LZMA Unix Port 是一個只移植了 LZMA 中代碼的版本,它是一個類似於 gzip 的基於數據流的壓縮工具。它不是一個歸檔工具,而只是一個普通的壓縮工具,並且由於它在沒有數據頭中沒有未壓縮文件大小的 UInt64 變數,所以它與7-zip生成的 LZMA 數據流中不同。7-zip使用一種更加靈活的歸檔格式 7z,因此二者都不能互相使用對方生成的數據。
在GNU通用公共許可證下發布的7-zip中使用的LZMA有以下幾個特點:
* 高壓縮比;
*解壓縮代碼較小:約 5 KB;
*解壓縮時僅需少量內存 (取決於字典大小);
* 可變更字典大小 (最大 4 GB);
* 壓縮速度:在一部2GHz的處理器上運行,約可達到1MB每秒的速度;
*解壓縮速度:在一部2GHz的處理器上運行,約可達10-20MB每秒的速度;
* 支持多線程、多核心(多處理器)和Pentium 4處理器的超線程(Hyper-Threading);
這個特點使得這個這個演演算法的解壓過程非常適合於嵌入式系統應用的場合。

應用


使用或者支持 LZMA 的軟體有:
* Nullsoft Scriptable Install System
* Inno Setup
* AdvancedInstaller
* cramfs and SquashFS, with applied patches
* lrzip ("long range zip", or "LZMA rzip")
* PyLZMA,Igor Pavlov 的 LZMA SDK 的 Python 語言介面
* FreeArc, 歸檔工具及 LZMA SDK 的 Haskell 語言介面
* 用於 Pascal 語言的 LZMA SDK