算法:
- LZMA(Lempel-Ziv-Markov chain-Algorithm)是Igor Pavlov为7-Zip发明的压缩算法。
- LZMA2算法是LZMA算法的升级版,修正了一些问题。
文件格式:
.lzma、.7z和.xz分别是三种文件格式的后缀名,它们对应三种不同的文件结构。文件结构相当于容器,把LZMA算法压缩后的数据包装起来,然后添加上魔术字、校验码、压缩元信息、文件夹结构等信息。
.xz和.lzma一样,只能压缩一个文件。它们需要和打包工具tar一起使用才能把多个文件压缩成一个文件。 而.7z这种更复杂的文件结构可以包含多个文件或文件夹的压缩数据。
由于.xz的压缩元信息存储在头部,而压缩数据存储在元信息后面,所以.xz格式可以支持流式解压缩。 相反,.7z把压缩元信息存储在尾部,而压缩数据在元信息的前面,所以.7z不适合流式解压缩。
应用程序:
- 7-Zip是最早的项目,它是windows上类似winrar的一个软件。作者把7-Zip的部分代码开源出来成为LZMA SDK。7-Zip软件支持的文件格式较多,包括默认的.7z以及.lzma和.xz。
- p7zip是7-Zip移植到 POSIX-like 系统(比如Linux)上的命令行软件。
- LZMA Utils是 POSIX-like 系统上的另一个命令行软件。它基于LZMA SDK开发,只支持.lzma格式。
- XZ Utils是LZMA Utils的继承者。支持.xz和.lzma格式。
xz和gzip的性能对比:
用xz和gzip对文本文件做压缩大小和压缩、解压缩时间的性能对比。结果如下图。
可以看出:
1. 大小:对于大文件(大于10kB)xz相对gzip才有压缩率的收益。
2. 压缩时间:xz压缩的耗时是gzip的7倍以上。而且对于越大的文件,xz相对gzip增加的耗时更多。
3. 解压时间:xz的解压缩时间对gzip的比值比较稳定,大约多花费3-5倍。
文件格式详解:
1. lzma
.lzma是历史遗留的老文件格式,它正在被.xz格式取代。。lzma文件对LZMA压缩数据进行简单的封装,加上13个字节的头部信息。头部结构如下图。注意到它不包含magic number和CRC完整性校验等信息,所以.lzma是个不完备的文件格式。
2. xz
.xz作为.lzma的替代,它的文件结构更复杂,包含的元信息更多。
.xz文件可以由多个Stream和Stream Padding组成,但通常只有一个Stream。
每个Stream的格式如下图:
Stream Header包含magic number(FD 37 7A 58 5A 00)、Stream Flags以及CRC校验。其中Stream Flgas是CRC校验的类型。
Block包含Block Header和压缩数据。Block Header包含了压缩算法(filter)的数目和属性、数据长度以及CRC校验。
Index作用和结构如下:
Stream Footer的结构如下。其中Backward Size是Index模块的大小,用来在从后向前处理时快速定位到Index的位置。
3. 7z
.7z是一种复杂的文件格式。它支持对多个文件/文件夹的压缩、打包。 对7z文件格式的理解可以参考https://blog.byneil.com/category/zip-7z/和http://www.romvault.com/Understanding7z.pdf
参考文献:
- 7z
- xz