找回密码
 加入我们
搜索
      
查看: 3115|回复: 28

[软件] 压缩算法横评,ZSTD是唯一真神了

[复制链接]
发表于 2025-9-5 15:29 | 显示全部楼层 |阅读模式
本帖最后由 空桑 于 2025-9-5 15:39 编辑
我个人运维了一个文档数据库,后续想要朝着大量数据存储进行重写和发展,因此需要测试一下那种压缩算法比较好。整体环境处于一个写多读少,qps 量不高(<100)的状态

先说结论:ZSTD无敌,尤其是现在win11已经支持了



压缩算法就是最大化信息密度,而压缩容器(7z 等格式)则是盛放压缩结果的工具。这两者的关系就像是易拉罐和碳酸饮料的关系

无损压缩 -> 可以100%还原kssssssss...ssssssssss(一万个s)k10000个s有损压缩 -> 还原的差不多(视觉领域,图片/视频压缩的原理)kubernetesk8s
如何测试

在测试内容的选择上,需要选择最具有代表性的几个压缩算法和测试对象。这里我选择了六种最常见的压缩算法和三种常见的压缩场景(网页、文本、图片)进行测试。测试方法是对每一个单独文件进行压缩后统计压缩比和吞吐量,只记录计算时间不记录写入磁盘时间,每个场景的总文件大小都在 6G 以上,测试时长最长 5 分钟

测试平台:R7 7700 + qemu 虚拟机中的 win11 24h2

  • HTML:从生产数据库中取出了 10000 个 800KB 左右的 json 文件,其中包含多个 HTML 网页
  • 文本:从小说文库中提取了 1434 个小说,大小在 500KB-10MB 中随机分布
  • 图片:从 CV 测试记录中抽取了 228 个 BMP 文件(无压缩位图)每个 35.2MB(如果是 webp 等现代化文件,压缩的压缩比为 1)

目前按照常见程度和技术发展趋势选择了多个不同的压缩算法(注意这里的均值指的是文本压缩场景)。显而易见 zstd 和 brotli(网页专用) 等新算法要远超 deflate 和 gzip 等旧算法,lzma(即 .tar.xz / .7z)的用低吞吐量换来最极致的压缩率因此在服务分发场景依然常用(压缩一次,分发百万次,节省宽带费用),而 LZ4 用低压缩率换来了极致的吞吐量尤其是服务需要的解压速度,适合需要低延迟的服务使用。bzip2 用高到难以优化的复杂度换来了令人震惊的压缩效果

注:实际上从曲线来看,大部分情况下同压缩率下 zstd 远快于 lzma,同压缩速度下 zstd 压缩率远高于 lz4。因此 zstd 是当之无愧的压缩之神,满足既要又要的需求



算法名
对应容器
算法
介绍
均值压缩比
均值压缩速度
均值解压速度

deflatezip,gzLZ77+霍夫曼最经典的压缩算法1.9848.08338.76
bzip27zBWT&MTF+霍夫曼高复杂度、极低速度2.4320.9140.97
lzmaxzLZ77+范围编码高压缩比,低速度2.567.2481.26
lz4N/ALZ77 变种吞吐量特化,接近内存瓶颈1.65168.501765.32
snappyN/ALZ77 变种google 自用(菜)1.39351.09865.9
zstdzstLZ77 变种 + FSE/tANS高压缩比、高速度、万用2.3763.99708.89
brotlibrLZ+霍夫曼+上下文网页压缩领域特化2.2078.52383.61

代码编写

和 gemini vibe coding 一下,现在开源对话记录了(笑)。我稍微微调了一下代码,后续手动补充了 snappy 和 bzip2 的测试。zstd 的字典模式我也测试了下,发现完全没有变化

你是谁:你现在作为资深Python核心开发者,收了我100美金雇佣编写符合python zen的简洁、高效、可解释的代码你的任务是什么:撰写一份测试python下不同压缩算法[deflate,gzip,lzma,zstd,brotli,lz4]在不同压缩等级下的压缩吞吐量和压缩率环境变量:压缩文件存储目录=FILE_PATH;压缩任务最大耗时=MAX_TIME代码要求如下:1. 文件位置:压缩文件存储在目录:ENV下面,其中有多个原始文件,需要依次遍历文件并且压缩,不要将原始文件存储到内存中,随用随读。所有文件都已准备好,不需要创建2. 计时要求:测试要求为高精度的计时,即只计算压缩和解压缩的时间,读取文件不计入时间范围。且每次压缩完文件后都计算累计纯压缩时间是否超过了最大耗时,如果超过则终止3. 存储要求:全程压缩测试内容不落盘,即读取原始文件进行压缩后的结果不写入磁盘中4. 测试流程:在读取文件列表后,选择一个压缩算法和压缩等级对所有文件进行测试,直到测试完所有的文件。最后输出不同压缩算法的吞吐量和压缩率对比5. 期望输出:当切换到一种算法时:输出当前算法。每一个压缩等级用类似`压缩算法:压缩等级\t压缩率%\t压缩速度\t解压速度`输出结果,只需要输出数据6. 函数要求:开始测试的入口函数为func(FILE_PATH),负责读取文件列表和调度开始执行任务吧,我很看好你
结果分析

为了方便观看,我将结果绘制成了曲线,按照惯例,越是右上的越好,能包住越多面积的算法越强。注意,为了方便对比,Y 轴的压缩比不是从 0 开始,X 轴的吞吐量是以 2 为底的对数曲线

数据是会说谎的

  • 曲线是没有意义的,本质上是离散的点,压缩比快速提升后达到瓶颈,继续提高压缩等级只会降低吞吐量。无法相同吞吐量为基准,而是进行拐点(费效比最优)之间的对比
  • 看似高吞吐量的 LZ4 只有 HC 和非 HC 模式区别,非 HC 模式压缩比只有其他算法的一半且 zstd 的吞吐量已经很接近了,HC 模式吞吐量和压缩比双输
  • 看似高压缩比的 LZMA 只有在吞吐量被压倒 16MB 以下的时候才能基本超越 ZSTD。而 BZIP2 则用极其低下的压缩和解压速度换来了最高的压缩率(而且不同压缩等级之间的吞吐量相近,可以直接选最高压缩等级)
  • zip 和 gzip?一败涂地!现在是看情况选择要不要 ZSTD 的时代
网页

网页其实类似于日志,是高重复的内容,因此在这种场景中各家的压缩比都非常的惊人,甚至没有低于 12 的算法,这与文本和图片场景形成了鲜明的对比。其中专门为网页场景设计的 brotli 简直是一骑绝尘的又快又好,其次则是遥遥领先的 zstd

从曲线上看似 lzma 与 zstd 在高压缩比(8-128M 吞吐量)的时候打的难舍难分,实际上两者的拐点 lzma 的拐点是压缩比为 23.64 时吞吐量为 72.25,而 zstd 的拐点为 22.43,吞吐量高达 239.55,二者的吞吐量根本就不在一个数量级上。lzma 仅在最极限的压缩比(24.44)上取得了优势而代价则是 12.14 的吞吐量,而 bzip2 则是达到了恐怖的 28.72 压缩比但代价是吞吐量 23.56 小于压缩比

当然,考虑到目前压缩的吞吐量甚至不到 qps 级别,差距不大且 python 的哲学就是自带电池最后我应当还是会选择 bzip2

文本

文本我选择的是最常见的场景,找了若干份较大的小说分别进行压缩测试。在这个场景中离开了特化字典适用范围的 brotli 虽然还是基本强于传统压缩算法,但是在真神 zstd 面前还是只能甘拜下风

图片

图片走的是视觉无损压缩,传统压缩算法并没有任何实用意义(压 webp 等新算法压缩比只有 1),因此这个部分只是出于兴趣进行测试。以一张信息相对丰富的 bmp(无压缩图片) 为例,原始大小为 35.5MB。LZMA 最高压缩比也就 1.78 也就是 19.94MB,win11 自带的 PNG 压缩后为 15.5MB, 压缩比为 2.29。webp 压缩工具压缩后为 1.33MB,压缩比高达 26.96!

结论

其实从现有的结果上看,结论已经很明确了,新算法其实在大部分阶段上压缩比和吞吐量上全方面碾压了传统的压缩算法(deflate 及 lz4),仅剩少数领域在苦苦支撑(高压缩比还是 lzma 和 bzip2 的天下,要极致吞吐还是 lz4)。除此之外基本上就是 zstd 的天下了

目前 windows 11 24h2 已经支持了 zstd 和 bzip2,所以如果没有特殊要求就直接选择 zstd 压缩即可,需要高压缩比就压缩成 bzip2(注:需要压缩成 tar 格式)


最后提一嘴,目前文章出于95%完工状态,可以在我的WIKI(压缩算法测试 | 空桑)上看看何时更新

评分

参与人数 3邪恶指数 +35 收起 理由
Barcelona + 5
某人的马甲 + 20 支持一下
醉酒棕熊 + 10

查看全部评分

发表于 2025-9-5 15:33 | 显示全部楼层
纯文本追求压缩率可以试试 NNCP
 楼主| 发表于 2025-9-5 15:36 | 显示全部楼层
xy. 发表于 2025-9-5 15:33
纯文本追求压缩率可以试试 NNCP

这个就不是我的那台2c4g的小云服务器能跑得动的了
发表于 2025-9-5 15:56 | 显示全部楼层
如果不考虑压缩速度的话 xz 要更好一些
发表于 2025-9-5 16:00 | 显示全部楼层
压缩工具更多是个打包工具。。。
发表于 2025-9-5 16:12 | 显示全部楼层
压缩工具更多是个打包工具,用什么格式是看对面能不能解压
发表于 2025-9-5 16:20 | 显示全部楼层
博客不错,有写原创东西期待后续更新
发表于 2025-9-5 16:38 | 显示全部楼层
一直用winrar,那是属于什么格式呢?
发表于 2025-9-5 16:54 | 显示全部楼层
stuck 发表于 2025-9-5 16:38
一直用winrar,那是属于什么格式呢?

RAR格式
 楼主| 发表于 2025-9-5 17:52 | 显示全部楼层
stuck 发表于 2025-9-5 16:38
一直用winrar,那是属于什么格式呢?

RAR是单独的压缩算法,实际上和zip类似,都是LZ77+霍夫曼。不过新的算法有改进
 楼主| 发表于 2025-9-5 17:54 | 显示全部楼层
皇冠3.0L 发表于 2025-9-5 16:12
压缩工具更多是个打包工具,用什么格式是看对面能不能解压

我提到的基本都是win11能够解压的,而且主要针对需要压缩功能的用户。比如我就真有几T的小文件需要压缩,服务器真的太贵了
发表于 2025-9-5 18:08 | 显示全部楼层
不是才发过的嘛 https://www.chiphell.com/forum.php?mod=viewthread&tid=2727897

这是开小号了?
发表于 2025-9-5 18:41 | 显示全部楼层

上图大概可以看得出,三个区间各自的优势格式分别是ZSTD、PPMD、LZMA2。
综合来说,真压缩还是LZMA2,不仅仅极限高,在较高压缩比的情况下其实同压缩比下的吞吐率也是最高的
ZSTD的优势是归档,可以在很高的吞吐率的情况下提供一个不错的压缩比。

发表于 2025-9-5 18:44 | 显示全部楼层
其实都是真·打包工具
发表于 2025-9-5 19:12 | 显示全部楼层
给你一个iso,分分钟爆炸
发表于 2025-9-5 19:24 来自手机 | 显示全部楼层
我记得在论坛看过一个差不多这样的贴,但还是想多嘴说一句,对于需要发给别人的,ZIP永远的神
发表于 2025-9-5 20:04 | 显示全部楼层
6874110 发表于 2025-9-5 19:24
我记得在论坛看过一个差不多这样的贴,但还是想多嘴说一句,对于需要发给别人的,ZIP永远的神 ...

对的,打包就行,不需要压缩
发表于 2025-9-5 20:37 | 显示全部楼层
文本压缩的神是字典好吧
 楼主| 发表于 2025-9-5 21:44 | 显示全部楼层
gartour 发表于 2025-9-5 18:08
不是才发过的嘛 https://www.chiphell.com/forum.php?mod=viewthread&tid=2727897

这是开小号了? ...

测试范围和数据量抖远不一样好吧...
 楼主| 发表于 2025-9-5 21:51 | 显示全部楼层
af_x_if 发表于 2025-9-5 18:41
上图大概可以看得出,三个区间各自的优势格式分别是ZSTD、PPMD、LZMA2。
综合来说,真压缩还是LZMA2,不仅 ...

其实这点上我测试的时候也研究过了,这个轴是对数的,轮到lzma的时候吞吐量基本低到8M不到了,这一点上不如bzip2。吞吐量2-4倍,压缩率差不多
发表于 2025-9-6 00:26 | 显示全部楼层
bzip的曲线好奇怪
发表于 2025-9-6 04:39 | 显示全部楼层
zstd不保证新版向后兼容,导致你的软件支持了zstd就会是永远都是那个版本的zstd,所以永远不可能摆上台面
发表于 2025-9-6 07:23 | 显示全部楼层
现在都是打包需求,数据恢复是最重要的。错1bit整个压缩包全报废的算法,毫无意义。赶紧把rar的恢复记录功能加进来才是有价值的。
发表于 2025-9-6 08:23 | 显示全部楼层
压缩工具对我来说,就是把多个文件打包,好发微信。哈哈哈哈哈。
发表于 2025-9-6 10:09 | 显示全部楼层
个人感觉,压缩工具还是要根据你的具体情况而定,不存在唯一真神。

如果目标是长期保存,或是跟他人沟通,ZIP这种格式目测在很久的将来都会有非常好的软件支持。新兴格式则不一定。

如果目标是压缩特定文件格式,要用真实的数据文件测试才能知道哪个好。比方说,我之前有一个需求是压缩保存我们服务器的日志文件,以备后续数据分析。用我们真实的服务器日志测试下来,brotli在压缩比和速度上,远超包括zstd在内的其它压缩算法。

不要盲目,具体情况具体分析。不要用不相关的文件测试,要用自己真实的数据测试。
发表于 2025-9-6 12:53 | 显示全部楼层
视觉无损压缩图片,还可以试试 jpeg-xl,一般都能比无损 webp 更小,甚至无损压 jpg 都能少 20% 体积左右。。
发表于 2025-9-6 13:20 | 显示全部楼层
tankren 发表于 2025-9-5 16:00
压缩工具更多是个打包工具。。。

真相,主要为打包,压缩率随缘
发表于 2025-9-6 23:37 | 显示全部楼层
官方7-zip还不支持zstd
发表于 2025-9-7 00:04 | 显示全部楼层
要发送给别人一律zip,自己珍藏lzma2,其它看都不看......
您需要登录后才可以回帖 登录 | 加入我们

本版积分规则

Archiver|手机版|小黑屋|Chiphell ( 沪ICP备12027953号-5 )沪公网备310112100042806 上海市互联网违法与不良信息举报中心

GMT+8, 2025-9-8 07:23 , Processed in 0.012700 second(s), 6 queries , Gzip On, Redis On.

Powered by Discuz! X3.5 Licensed

© 2007-2024 Chiphell.com All rights reserved.

快速回复 返回顶部 返回列表