Facebook 的 Zstandard https://facebook.github.io/zstd/ (简称 zstd)压缩算法逐渐流行, 它有以下特点:
1, 压缩, 解压速度快.
下图的横轴是压缩率, 纵轴是压缩速度.
在高压缩等级时, 压缩率接近 LZMA; 在低压缩等级时, 速度接近 LZ4.(zstd 和 LZ4 的作者是同一个人)
在各种情况下, 比常用的 zlib 快, 可以考虑替代 zlib.
图片出自这个网页, 里面还有一些比较图表.
zstd 还多线程压缩, 充分利用多核 CPU, 让压缩速度提高数倍.
但不支持多线程解压, 不过解压速度已经非常快了, 通常比 SSD 快.
2, 如果使用预先训练的 zstd 字典, 对于几 KB 的小数据, 可以大大提高压缩率.
要压缩的数据越小, 就越难压缩, 这是所有压缩算法都有的问题, 原因是压缩算法从之前的数据中学习如何压缩之后的数据, 但对于小数据, 没有 "之前" 可以参考.
为了解决这一问题, zstd 提供了一种训练模式, 针对特定的数据类型调整算法. 训练是通过提供一些样本 (每个样本一个文件) 来实现的, 训练的结果存储在一个名为 "字典" 的文件中, 在压缩和解压缩之前必须加载该文件, 使用这个字典, 可以大大提高小数据的压缩比.
下图是压缩 1 万条 1KB 的数据, 在使用字典时, 压缩率, 压缩速度, 解压速度大大提高.
3, 帧 (frame) 和块 (block) 让使用更灵活, 适用各种场景.
zstd 数据由 1 个或多个独立的帧 (frame) 组成, 解压后的多帧数据 等于 每帧解压后再相接.
每帧完全独立, 包括一个帧头, 以及一套解压参数.
zlib 和 LZMA 也支持多帧的特性.
每帧包括 1 个或多个块(block), 块的最大尺寸是(3 字节块头 + 128KB), 实际最大尺寸取决于帧头里定义的参数.
和完全独立的帧不同, 在解压时块依赖前面的块, 不依赖后面的块, 块可以被全部解压, 所以块可以用于通讯场景.
zlib 也有类似块的特性.
来源: http://www.bubuko.com/infodetail-3717169.html