数据压缩是按照特定的编码机制用比未经编码少的数据表示信息的过程。数据压缩能够实现是因为多数现实世界的数据都存在统计冗余。无损数据压缩(Lossless Compression)指的是数据经过压缩后,信息不受损失,数据还能完全恢复到压缩前的原样,一般用于严格要求“经过压缩、解压缩的数据必须与原始数据一致”的场合。无损压缩典型的例子包括文字文件、程序可执行文件、程序源代码。

无损压缩工具

Snappy

Snappy 是谷歌基于 LZ77 算法思想编写出的压缩解压缩库,其目标并非最大压缩率或与其他压缩程序库的兼容性,而是非常高的速度和合理的压缩率。谷歌在 2011 年将该库开源。Snappy 广泛应用在 Google 的项目,例如 BigTable、MapReduce 和 Google 内部 RPC 系统的压缩数据。它可在许多开源项目中被使用,例如 Cassandra、Hadoop、LevelDB、MongoDB、RocksDB 和 Lucene。
Snappy 项目地址:https://github.com/google/snappy

LZ4

LZ4 是一种比较新新的高速压缩软件和算法,着重于压缩和解压缩的速度。该算法已有多种语言的移植和绑定,包括 Java、C#、Python 等。Linux 在内核 3.11 中原生实现了 LZ4 算法,从 3.19-rc1 开始在 SquashFS 中支持 LZ4。ZFS 文件系统在 linux 中的实现使用的是 LZ4 算法进行即时压缩。

LZ4 项目地址:https://github.com/lz4。大多数 linux 发行版都集成了 LZ4 算法库,要使用 LZ4 命令行工具,ubuntu 需要安装 liblz4-tool 包。

QuickLZ

QuickLZ 是一种高速压缩软件和算法,其自称是世界上最快的压缩库。

QuickLZ 的官网:http://www.quicklz.com/

lzop

lzop 使用 LZO 数据压缩库进行压缩服务,适合在注重压缩速度的场合。lzop 的压缩量取决于输入的大小和公共子串的分布。通常,诸如源代码或英文的文本被压缩到原始大小的 40-50%,而大文件通常比小的文件压缩得更好。压缩和解压速度通常比通过 gzip 实现的速度快得多,但压缩比更差。

lzop 项目地址:https://www.lzop.org/

gzip 和 pigz(多线程gzip)

gzip 和 pigz(多线程 gzip)的实现基于 zip 库,实现了 ZIP 算法。Gzip 代表的是 GUN zip,通常指的是 GUN 计划的实现。Gzip 是一个老牌的压缩解压缩工具,最初在 1992 年 10 月 31 日公开发布,是一个很受欢迎的数据压缩解压缩程序。起初写该程序目的是由于 Unisys 和 IBM 的专利涵盖了 compress 使用的 LZW 算法,因此开发了该程序作为compress 的替代。pzip 是 gzip 的一个多线程实现,利用多核进行压缩,他的压缩速度是 gzip 的 5 倍,同时 cpu 消耗也比 gzip 大,但实际上做的事情和 gzip 是一样的。

gzip 项目地址:http://www.gzip.org/
pigz 项目地址:https://zlib.net/pigz/

bzip2 和 pbzip2(多线程 bzip2)

bzip2 和 pbzip2(多线程 bzip2)基于 libbzip2 库,实现了 Burrows–Wheeler 压缩方法。bzip2 是 Julian Seward 开发并按照开源软件协议发布的数据压缩算法及程序,Seward 在 1996 年 7 月第一次公开发布了 bzip2 0.15 版,在随后几年中这个压缩工具稳定性得到改善并且日渐流行。bzip2 比传统的 gzip 或者 ZIP 的压缩效率更高,但是它的压缩速度较慢。pbzip2 作为多线程版本的 bzip2 工具,压缩比和 bzip2 基本相当,但是压缩时间比 bzip2 减少了线程数倍数。

bzip2 项目地址:http://www.bzip.org/
pbzip2 项目地址:http://compression.ca/pbzip2/

7-Zip

7-Zip 主要基于 LZMA 和 LZMA2 算法实现的软件,有着很高的压缩比,压缩和解压缩速度比较慢。7-Zip 是开源软件。大多数源代码都是 GNU LGPL 许可证,unRAR 代码是混合许可证:GNU LGPL + unRAR 限制。7-Zip 与 winrar 是竞争关系,但是 winrar 是专有软件。7-Zip 也是目前最普及的开源压缩程序。

7-Zip 官网:http://www.7-zip.org/

xz 和 pxz(多线程 xz)

xz 和 pxz(多线程 xz)是基于 LZMA 算法实现的软件,使用的库为 liblzma。类似于 7-zip,和 7-zip 一样,比较适合注重压缩比,而不是速度的场合。

xz 工具的官方网址:https://tukaani.org/xz/.

不同压缩工具的性能比较

测试环境及方法:

  • Intel(R) Core(TM) i3-4160 CPU @ 3.60GHz MemTotal:4G
  • Ubuntu 16.04 x64 kernel:4.4.0-42-generic
  • 为避免磁盘 IO 导致的测试不准,将两个数据集都移到了使用内存作为后备存储器的 /dev/shm 目录(你可以将它视作内存虚拟盘)。
  • 部分支持多线程的也进行了多线程测试。不过 7-zip 貌似未提供多线程的选项,默认情况下,处理器有多少硬件线程,他就能生成多少个线程。
  • 测试中使用 time 进行时间统计,测试命令类似于 time cat comppression_html.tar | lz4 | wc -c
  • 测试文件大小:用 tar 打包的 html 文件,大小 15226880KB

压缩解压缩测试结果

算法 压缩率 压缩耗时(s) 压缩速度(MB/s) 解压耗时(s) 解压速度(MB/s)
snappy lz77变种 22.31 % * 610.8 * 706.1
lz4(r128) lz4(lz77变种) 4.30% 0.04 363.03 0.04 363.03
quicklz * 7.03% 0.05 290.42 0.058 250.37
lzop(v1.03) lzo(lz77变种) 5.82% 0.06 242.02 0.07 207.44
Gzip(1.6) lz77 3.08% 0.17 85.42 0.04 363.03
Pigz(2.3.1) lz77 3.03% 0.14 103.72 0.02 726.07
bzip2(v1.0.6) Burrows-Wheelser 1.38% 5.74 2.52 0.353 41.13
pbzip2(1.1.9) Burrows-Wheelser 1.45% 6.01 2.41 0.320 45.37
*7-zip(9.20) lzma 0.08% 1.195 12.15 0.097 149.70
xz(5.1.0a) lzma 0.08% 1.754 8.28 0.054 268.91
pxz(4.999.9) lzma 0.08% 1.668 8.70 0.033 440.04

从测试结果中可以看出 lz4,quicklz,lzop 都兑现了其速度很快的承诺,lz4 的性能较其他两个可能更好点。另一方面,他们的压缩比都比较低,不过,可以通过设置参数提高压缩比,这将会导致压缩速度降下来,经测试改变压缩比生成的压缩文件并不比原来小多少。gzip 和 pigz 是压缩比和压缩速度的折中方案。7-zip 和 xz 有着非常高的压缩比,但是压缩速度非常慢。多线程方面,Pigz、pbzip2 和 pxz 得到的结果都胜于它们的单线程结果(这里未列出多线程测试结果)。

从上边的测试可以看出,每个压缩方式都有着自己特定的使用场景:

  • lz4 和 lzop 非常适合实时压缩或近实时压缩,以非常快的速度,提供了大幅节省空间的优点。
  • gzip 尤其是多线程 pgiz 版本,非常适合一般的使用场合:它既有相当高的压缩比,速度也不慢,比较消耗 cpu 资源。
  • xz 是压缩比方面明显的赢家,但它却是压缩和解压缩方面速度较慢的软件之一。适合用于存储压力较大、不对数据做更新或更新频率较低的场景,比如在网盘上存储的文件用 7z 压缩就挺好的。

参考文章