关于压缩算法的选择和使用场景

看了两篇关于压缩算法选择和使用场景的文章:

速度与压缩比如何兼得?压缩算法在构建部署中的优化 - 美团技术团队 https://tech.meituan.com/2021/01/07/pack-gzip-zstd-lz4.html

Zstandard: How Facebook increased compression speed - Facebook Engineering https://engineering.fb.com/2018/12/19/core-data/zstandard/

美团那篇文章的应用场景在于部署二进制包,他们使用场景不是使用API,而是直接使用工具对包进行压缩和解压。在这个场景下面对于多线程就非常敏感了,而在开发系统里面使用压缩解压则比较少考虑多线程,因为系统有自己的线程规划安排。

另外就是压缩算法选择上需要考虑几点:

  1. 压缩比例
  2. 压缩和解压速度
  3. 可调参性

关于可调参性我以前没有考虑过,可以看下面这张图。lzma和lz4分别在左上和右下角,lzma压缩比例高,但是速度慢;lz4压缩比例低,但是速度快。但是中间那段光谱却没有办法覆盖,zlib也只是覆盖到了其中一个部分。这就意味着,zstd可以适用于广泛的场景,而不必在考虑其他算法(不考虑兼容性的话)

Pasted-Image-20231225103801.png

FB那篇文章则提到了如何在生产环境中使用zstd,提到了zstd的几个特点:

  1. 多线程压缩解压
  2. long-range mode 可以在非常大的区域查找可压缩串
  3. 自适应,根据IO读写速度
  4. 字典压缩,可以训练字典,然后传入训练数据
  5. managed compression. 可以认为整个压缩服务化了