Perl压缩模块介绍
2013-06-02 16:39:00 阿炯

Perl世界里有许多压缩(解)模块,以对应于现行的多种压缩工具及算法。包括zipgzip(rfc 1952)、bzip2lzma(7z)xz、lzf、lzoplz4lzo、lzw、snappydeflate(rfc 1950)、rawdeflate(rfc 1951)、zstd

IO系列
压缩模块
IO::Compress
IO::Compress::Zip
IO::Compress::Gzip
IO::Compress::Bzip2
IO::Compress::Deflate
IO::Compress::RawDeflate
IO::Compress::Lzf
IO::Compress::Lzop
IO::Compress::Lzma
IO::Compress::Xz
IO::Compress::Zstd

对应的解压缩模块
IO::Uncompress
IO::Uncompress::Unzip
IO::Uncompress::Gunzip
IO::Uncompress::Bunzip2
IO::Uncompress::Inflate
IO::Uncompress::UnLzma
IO::Uncompress::RawInflate
IO::Uncompress::UnLzop
IO::Uncompress::UnLzf
IO::Uncompress::AnyInflate
IO::Uncompress::AnyUncompress
IO::Uncompress::UnXz
IO::Uncompress::UnZstd

Compress模块
Compress
Compress::Zlib
Compress::Bzip2
Compress::Deflate7
Compress::Snappy
Compress::AsciiFlate
Compress::LZMA::External|Simple
Compress::unLZMA
Compress::Raw::Zlib|Bzip2|Lzma
Compress::LZ4
Compress::LZF
Compress::LZW
Compress::LZO

综合比较-Compare
在LZ4的cpan主页上,有关于几种较新压缩方式的对比,可以参考一下。

对于主开源界主流的压缩方法,在这里有一个综合的结果对比。从(cpu)时间、内存用量、最终结果三个方面进行了考量,综合表现最好的应该是gzip、bzip2、lzop。流行时间越长的工具其综合得分越高,像gzip,bzip2,但也有后来居上者,像lzop,lzma,xz等。

另外一个必须要提的问题是:开源界的打包与编码的问题。
我们知道,常见的压缩其实是两个步骤:打包与压缩,而通常我们只注意到了后者,在windows下,几乎就没有打包这一说法。在linux下,通常是将一系列的文件及目录打成一个包,然后在调用上面所提及的压缩程序进行压缩,这样的操作也可以一步来完成,即是在打包的同时调用压缩程序(像tar的'-j'与'-z'参数)。最常见的打包程序是tar,其次是cpio,前者非常普偏,而后者多于生成内核文件或不常见的备份程序中。

但tar的使用过程中却发现一个问题:它并不记录字符集,不能进行自动转换。在多字节码的环境中不能正确地识别语言编码,本地编码的字符集是跟Locale(多语种支持)不能匹配。打包含有中文名称的文件名后,解压时其名称为乱码。

zip工具在跨平台使用时也有个问题,可以修改其代码来解决。

目前只发现有两款打包(压缩)工具可以实现在多平台上处理此问题,它们分别是7zip和rar(windows下叫winrar)。7zip默认使用Unicode来存储文件名称,可以避免不同系统间压缩解压乱码的问题。rar估计也是用此方法,rar是商业软件,支持试用,对应的解压软件unrar是免费软件。

另外,7zip与rar是将打包集成到压缩之中,因此不必在使用它们之前对文件及目录进行打包操作。

就其压缩比率与算法理论(lzma)来说,7zip是一款优秀的软件;如果追求速度的话,lz4和lzop当是首选;如果对使用协议有要求的话,有基于bsd协议的bzip2、lz4、snappy,基于lgpl的lzma、lzf、xz等。

如何在Perl环境下选择合适的(解)压缩模块,gzip,bzip2绝对是首选,它们的使用时间和平台都非常广范,尤其是前者。在核心模块中,Raw::Bzip2、Raw::Zlib、Zlib、Deflate、RawDeflate、Gzip为内置模块。

另外在笔者主页上有源码安装zstd、p7zip-zstd及一些简单的性能对比