Save Load
GitHub 切换暗/亮/自动模式 切换暗/亮/自动模式 切换暗/亮/自动模式 返回首页

几种无损压缩算法整理与简介

几种无损压缩算法整理与简介

转自: 小川CD

链接:https://m.weibo.cn/profile/1202332555

压缩算法分为无损压缩和有损压缩。简单来说无损压缩要求压缩后的数据,经过解压能够得到和压缩前一模一样的数据。例如winrar和或者zip就是一种无损压缩。有损压缩,比如视频、图像,并不要求解压后的数据和原始数据一模一样,要求的是肉眼看上去图像是差不多一样即可,例如常见的H.264、H.265算法。

在存储系统中,要求的是无损压缩,即压缩后再解压能够得到原来的二进制数据。例如:snappy、zlib、zstd、lz4等。这几种算法也是CEPH中可选的压缩算法。一般来说衡量一种压缩算法的优劣,主要从压缩率、压缩速度、解压速度等方面来考虑。

下面分别来看看这几种压缩算法的简介和特点。 性能评测:lzbench,详见GitHub。
比较基准:(压缩速度、解压速度、压缩率)
以memcpy为参考,性能指标为:(10362 MB/s, 10790 MB/s, 100.00)

Snappy ,详见GitHub,谷歌开源。
性能指标:(591 MB/s, 1868 MB/s, 48.19)

Snappy 是一个 C++ 的用来压缩和解压缩的开发包。其目标不是最大限度压缩或者兼容其他压缩格式,而是旨在提供高速压缩速度和合理的压缩率。Snappy 比 zlib 更快,但文件相对要大 20% 到 100%。在 64位模式的 Core i7 处理器上,可达每秒 250~500兆的压缩速度。Snappy 在 Google 内部被广泛的使用,从 BigTable 到 MapReduce 以及内部的 RPC 系统。Google极力赞扬Snappy的各种优点,Snappy从一开始就被“设计为即便遇到损坏或者恶意的输入文件都不会崩溃”,而且被Google在生产环境中用于压缩PB级的数据。其健壮性和稳定程度可见一斑。

Zstd,详见GitHub,facebook开源。 性能指标:(1级:480 MB/s, 1203 MB/s, 34.68),压缩级别可选,级别越高,压缩率越好,但是性能越差。

Ztsd,全称Zstandard,其设计目的是提供一个高压缩比,但更快,特别是解压缩快的算法。它的压缩级别从负5级(最快)到22级(压缩速度最慢,但是压缩比最高)可以调节。压缩速度在最快和最慢级别之间可以相差20倍或更多,而解压缩速度统统很快,在最快和最慢级别之间相差不到20%。Zstandard命令行有一个“自适应”(–adapt)模式,根据I/O条件改变压缩级别,主要是写入输出的速度。Zstd在其最大压缩级别下的压缩比接近lzma、lzham和ppmx,并且比lza或bzip2性能更好。 Zstandard达到了当前的Pareto边界,因为它解压缩的速度比任何其他当前可用的算法都要快,并且有类似的或者更好的压缩比。

Lz4,详见GitHub。 性能指标:(lz4 1.9.2 737 MB/s, 4448 MB/s, 47.60),lz4提供不同的参数以及压缩级别,可以达到不同的压缩率和压缩速度。

LZ4是一种无损压缩算法,提供超过单核500MB/s的压缩速度,并且支持多核扩展。它的特点是解压速度非常块,可以达到单核心数GB/s,在多核系统上可以达到内存(RAM)的速度限制。和Zstd一样,它的压缩速度是可以调节的,那么如何在压缩率与压缩速度之间做权衡,这个是需要考虑的。

Zlib,详见GitHub。 性能指标:(lz4 1.9.2 119 MB/s, 383 MB/s, 36.45)

zlib初版0.9版在1995年5月1日发表。zlib使用DEFLATE算法,最初是为libpng函式库所写的,后来普遍为许多软件所使用。此函式库为自由软件,使用zlib授权。截至2007年3月,zlib是包含在Coverity的美国国土安全部赞助者选择继续审查的开源项目。今天,zlib是一种事实上的业界标准,以至于在标准文档中,zlib和DEFLATE常常互换使用。数以千计的应用程序直接或间接依靠zlib压缩函式库,包括:

  • Linux:使用zlib以实作网络协定的压缩、档案系统的压缩以及开机时解压缩自身的核心。
  • libpng,用于PNG图形格式的一个实现,对bitmap数据规定了DEFLATE作为流压缩方法。
  • Apache:使用zlib实作http 1.1。

……

因为其代码的可移植性,宽松的许可以及较小的内存占用,zlib在许多嵌入式设备中也有应用。

以上是几种无损压缩算法的简介,那么在实际应用中,面对这么多算法和开源实现。既要考虑其压缩性能和压缩率,另外稳定性,开源许可都是需要考虑的。

(以上资料均摘抄于:维基百科、百度百科、Github等。)