zstd压缩算法概述与基本使用

news/2025/3/16 15:29:29/文章来源:https://www.cnblogs.com/kazusarua/p/18775040

本文仅关注zstd的使用,并不关心其算法的具体实现

并没有尝试使用zstd的所有功能模式,但是会简单介绍每种模式的应用场景,用到的时候去查api吧

step 0:why zstd?

zstd是facebook开源的压缩算法,可以在这里找到:https://github.com/facebook/zstd

官方使用文档:https://facebook.github.io/zstd/zstd_manual.html

根据传闻(自己评估),zstd在通用任务场景下,其压缩速度和压缩比都有相对优秀的表现,相对于gzip和zlib等同行值得一试。

但是,具体采用哪种压缩算法,需要根据你自己的工作场景选择,最好提供一些sample files在benchmark上跑一下试试。

此处代码为C++,也支持其他的语言版本,可以到官网中查找。

step 1:下载并安装zstd

git clone https://github.com/facebook/zstd.git
cd zstd/
make
sudo make install
make check

至此,应该正常完成zstd的安装和测试,可以cd examples/来尝试编译并运行部分demo代码

step 2:zstd的使用

step 2.1:基本功能api

step 2.1.1:通用压缩

单个文件压缩:ZSTD_compressZSTD_decompress成对使用,过程中需要提前分配内存空间,参见demo吧

多个文件批量压缩:一个最为重大的误区是对ZSTD_compressCCtx的理解,该函数只会将多个文件压缩为多个.zst,实际上ZSTD_compressCCtx并不会将多个文件打包为一个.zst
其意义在于重复使用ZSTD_CCtx上下文,避免多次重复申请和释放内存,用于批量压缩单个文件

step 2.1.2:流式压缩

流式压缩:本质是对文件进行分块压缩,通常适用于大文件而不是小文件,比如日志,视频流,数据库等
分块读取数据,相比于一次性读取减少了内存占用,并且分块也可以支持多线程并发
解压缩同理,分块读取并解压缩。
ZSTD_compressStreamZSTD_decompressStream成对使用

注意,ZSTD_decompressZSTD_decompressStream都能够正确解压文件,只是性能有区别

ZSTD_c_compressionLevel:是调整压缩速度和压缩率的trade-off,默认等级为3,当前范围是 1 ~ ZSTD_maxCLevel()

step 2.1.3:字典压缩

官方提出了以下讨论:

The smaller the amount of data to compress, the more difficult it is to compress. This problem is common to all compression algorithms, and reason is, compression algorithms learn from past data how to compress future data. But at the beginning of a new data set, there is no "past" to build upon.

压缩算法的本质是对过去内容pattern的学习,直觉上有点类似ai中的模式识别。

提出了一个方法:使用一个预训练的字典对多个文件进行压缩,以提高压缩率和速度。
适用于小文件、多文件压缩,比标准压缩更高效。

zstd --train FullPathToTrainingSet/* -o dictionaryName,提前训练所需的字典文件

代码中使用的API为:

  • ZSTD_createCDict:创建字典结构
  • ZSTD_compress_usingCDict:实际压缩
  • ZSTD_decompress_usingDDict:实际解压

step 2.2:文件夹压缩保持原有的文件结构

以上压缩结果均为单对单,已有的zstd API不支持将多个文件保持原有的树状文件结构并压缩为一个文件。

Q: 所以,想要将多个文件压缩成一个压缩包,一定有办法的吧?
A: 那当然!
我们常见的处理方式是混合使用tarzsttar工具保持原有的文件结构,打包为一个文件。
之后使用zst将单个文件压缩。

还有另一种方法是使用流式压缩,将递归遍历的路径结构写入压缩内容,需要在文件之间添加分隔符或元数据
这种做法会比较复杂,在性能瓶颈不严重的情况下我个人不太喜欢。

step 3:一个小case

注意,约定被压缩后的文件后缀为.zst

最近在,一般会在工具函数(命名为utils.h或者common.h)等部分设置一个check函数,在对应环境下有统一的判断和返回处理。

这种操作可以避免你每次都写相同的错误处理,这在实际的编程实践中可以显著减少代码行数并增加可读性,是优秀且值得借鉴的。

类似zstd中的:

/*! CHECK* Check that the condition holds. If it doesn't print a message and die.*/
#define CHECK(cond, ...)                        \do {                                        \if (!(cond)) {                          \fprintf(stderr,                     \"%s:%d CHECK(%s) failed: ", \__FILE__,                   \__LINE__,                   \#cond);                     \fprintf(stderr, "" __VA_ARGS__);    \fprintf(stderr, "\n");              \exit(1);                            \}                                       \} while (0)/*! CHECK_ZSTD* Check the zstd error code and die if an error occurred after printing a* message.*/
#define CHECK_ZSTD(fn)                                           \do {                                                         \size_t const err = (fn);                                 \CHECK(!ZSTD_isError(err), "%s", ZSTD_getErrorName(err)); \} while (0)

和cuda中的:

#define CHECK(call)\
{\const cudaError_t error=call;\if(error!=cudaSuccess)\{\printf("ERROR: %s:%d,",__FILE__,__LINE__);\printf("code:%d,reason:%s\n",error,cudaGetErrorString(error));\exit(1);\}\
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/899818.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

FastAPI依赖注入:参数共享与逻辑复用

扫描二维码关注或者微信搜一搜:编程智域 前端至全栈交流与成长第一章:依赖注入核心原理 1.1 依赖树构建机制 from fastapi import Dependsdef auth_service():return OAuth2Scheme()def db_conn(auth: dict = Depends(auth_service)):return Database(creds=auth)@app.get(&q…

洛谷-P1449 后缀表达式

重操旧业~ 本菜鸡看到题就只会想到数组,但后来发现不可行,出去俩元素,还得进来一个元素,不好调o(╥﹏╥)o emm...但还是有所收获的,2转2,利用2-0,而不是直接强制int转换哦 同时也发现被题中举的例子迷惑了,数字可不一定是个位数! 1、此题采用栈和二叉树的后序遍历思想(…

DQL(查询语句)

简单查询 查询一个字段 select 字段名 from 表名; 查询多个字段 select 字段名1,字段名2,...,字段名 from 表名; 查询全部字段 ①在查询多个字段中,将所有的字段名写入 ②select * from 表名;————效率低,可读性差,因为将星号转化为所有字段名需要耗费一定时间,所…

PTA

​ 题目描述 小轿车中有一个系统随时监测四个车轮的胎压,如果四轮胎压不是很平衡,则可能对行车造成严重的影响。让我们把四个车轮 —— 左前轮、右前轮、右后轮、左后轮 —— 顺次编号为 1、2、3、4。本题就请你编写一个监测程序,随时监测四轮的胎压,并给出正确的报警信息。…

第二章

TempStr = input("请输入带有符号的温度值:") if isinstance(TempStr, str) and TempStr[-1] in [F, f]:C = int((float(TempStr[0:-1]) - 32) / 1.8)print(f"转换后的温度是{C}C") elif isinstance(TempStr, str) and TempStr[-1] in [C, c]:F = int(1.8…

window11家庭版 WSL上安装CentOS7

环境 Windows11家庭版 1. 安装WSL配置 1.1 Win命令模式开启虚拟化步骤点击查看代码 # 启用适用于 Linux 的 Windows 子系统:打开powershell并输入: dism.exe /online /enable-feature /featurename:Microsoft-Windows-Subsystem-Linux /all /norestart# 启用虚拟化:以管理员打…

探秘Transformer系列之(14)--- 残差网络和归一化

从零开始解析Transformer,目标是:(1) 解析Transformer如何运作,以及为何如此运作,让新同学可以入门;(2) 力争融入一些比较新的或者有特色的论文或者理念,让老鸟也可以有所收获。探秘Transformer系列之(14)--- 残差网络和归一化 目录探秘Transformer系列之(14)--- 残差…

省选联考2024游记

搬运自 洛谷博客 ,文章写于 2024.03.05“总有地上的生灵,敢于直面雷霆的威光。”全文共1169字。 Day -105 2023/11/18 noip考完人就崩了,第二题甚至都没写出正解,只有压线省一,大哭。 也基本注定这回是进不了省队了。 Day -5 2024/2/26 周一 开始停课 Day -4 2024/2/27 周…

day30 正则三剑客---awk

awk是什么 再谈三剑客grep,擅长单纯的查找或匹配文本内容 sed,更适合编辑、处理匹配到的文本内容 awk,更适合格式化文本内容,对文本进行复杂处理后、更友好的显示三个命令称之为Linux的三剑客 awk学完后的能力 以下部分内容需要结合shell编程对文本行数据提取数据字段 模式…

树上查分学习笔记+做题记录

树上查分 点的查分求路径 \(u-v\) 上的点被经过的次数. \(cnt[x]\) 表示点 \(x\) 被经过的次数. 核心代码:cnt[u]++; cnt[v]++; cnt[lca(u,v)]--; cnt[father[lca(u,v)]]--;A. 运输压力解法 树上查分板子题啊 #include <bits/stdc++.h> using namespace std; const int N…

ActAgent开发之基于http请求引用链路模版发起对话

下载deepeek 首先本地安装ollama,这是一款支持mac,windows和linus系统的大模型管理工具。下载好后打开终端,执行命令ollama pull deepseek-r1:7b,可以在网上找想要下载的开源大模型,我这里下载的是deepseek-r1的7b模型。执行完后可以用ollama list查看是否下载成功,然后可…

缓存与数据库的一致性方案,Redis与Mysql一致性方案,大厂P8的终极方案(图解+秒懂+史上最全)

说在前面 在40岁老架构师 尼恩的读者交流群(50+)中,最近有小伙伴拿到了一线互联网企业如阿里、滴滴、极兔、有赞、希音、百度、网易、美团的面试资格,遇到很多很重要的redis一致性面试题,类似如下:如何保障 MySQL 和 Redis 的数据一致性? 如何保障 MySQL 和 Cache 的数据一…