zstd压缩算法概述与基本使用
本文仅关注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_compress和ZSTD_decompress成对使用,过程中需要提前分配内存空间,参见demo吧
多个文件批量压缩:一个最为重大的误区是对ZSTD_compressCCtx的理解,该函数只会将多个文件压缩为多个.zst,实际上ZSTD_compressCCtx并不会将多个文件打包为一个.zst。
其意义在于重复使用ZSTD_CCtx上下文,避免多次重复申请和释放内存,用于批量压缩单个文件
step 2.1.2:流式压缩
流式压缩:本质是对文件进行分块压缩,通常适用于大文件而不是小文件,比如日志,视频流,数据库等。
分块读取数据,相比于一次性读取减少了内存占用,并且分块也可以支持多线程并发。
解压缩同理,分块读取并解压缩。
ZSTD_compressStream和ZSTD_decompressStream成对使用
注意,ZSTD_decompress和ZSTD_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: 那当然!
我们常见的处理方式是混合使用tar和zst,tar工具保持原有的文件结构,打包为一个文件。
之后使用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);\
}\
}
zstd压缩算法概述与基本使用的更多相关文章
- HBase数据压缩算法编码探索
摘要: 本文主要介绍了hbase对数据压缩,编码的支持,以及云hbase在社区基础上对数据压缩率和访问速度上了进行的改进. 前言 你可曾遇到这种需求,只有几百qps的冷数据缓存,却因为存储水位要浪费几 ...
- 一条数据的HBase之旅,简明HBase入门教程-开篇
常见的HBase新手问题: 什么样的数据适合用HBase来存储? 既然HBase也是一个数据库,能否用它将现有系统中昂贵的Oracle替换掉? 存放于HBase中的数据记录,为何不直接存放于HDFS之 ...
- MaxCompute新功能发布
2018年Q3 MaxCompute重磅发布了一系列新功能. 本文对主要新功能和增强功能进行了概述. 实时交互式查询:Lightning on MaxCompute 生态兼容:Spark on Max ...
- MySQL 每秒 570000 的写入,如何实现?
阅读本文大概需要 2.8 分钟. 来源:http://t.cn/E2TbCg5 一.需求 一个朋友接到一个需求,从大数据平台收到一个数据写入在20亿+,需要快速地加载到MySQL中,供第二天业务展示使 ...
- tikv性能参数调优
tiKV 最底层使用的是 RocksDB(tidb3.0版本中将使用tian存储引擎) 做为持久化存储,所以 TiKV 的很多性能相关的参数都是与 RocksDB 相关的.TiKV 使用了两个 Roc ...
- Deepgreen DB简介(转)
原文链接 Deepgreen DB 全称 Vitesse Deepgreen DB,它是一个可扩展的大规模并行(通常称为MPP)数据仓库解决方案,起源于开源数据仓库项目Greenplum DB(通 ...
- Deepgreen DB 是什么(含Deepgreen和Greenplum下载地址)
Deepgreen官网下载地址:http://vitessedata.com/products/deepgreen-db/download/ 不需要注册 Greenplum官网下载地址:https:/ ...
- HBase数据压缩编码探索
摘要: 本文主要介绍了hbase对数据压缩,编码的支持,以及云hbase在社区基础上对数据压缩率和访问速度上了进行的改进. 前言 你可曾遇到这种需求,只有几百qps的冷数据缓存,却因为存储水位要浪费几 ...
- TokuDB · 引擎特性 · HybridDB for MySQL高压缩引擎TokuDB 揭秘
原文出处:阿里云RDS-数据库内核组 HybridDB for MySQL(原名petadata)是面向在线事务(OLTP)和在线分析(OLAP)混合场景的关系型数据库.HybridDB采用一份数据存 ...
- Go操作kafka
Kafka是一种高吞吐量的分布式发布订阅消息系统,它可以处理消费者规模的网站中的所有动作流数据,具有高性能.持久化.多副本备份.横向扩展等特点.本文介绍了如何使用Go语言发送和接收kafka消息. s ...
随机推荐
- Swagger注解-@ApiModel 和 @ApiModelProperty
@ApiModel 使用场景 在实体类上边使用,标记类时swagger的解析类 概述 提供有关swagger模型的其它信息,类将在操作中用作类型时自动内省 属性 属性名称 数据类型 默认值 说明 va ...
- Qt编写地图综合应用58-兼容多浏览器内核
一.前言 miniblink是一个追求极致小巧的浏览器内核项目,全世界第三大流行的浏览器内核控件.其基于chromium最新版内核,去除了chromium所有多余的部件,只保留最基本的排版引擎blin ...
- Element库的Vue版本ElementUI的本地引入方法
最近刚接触ElementUI,发现官方介绍的使用方法中只有npm安装和CDN引入这两种方式,没有本地引入的方法. 因为我的学习环境有时候是断网状态的,所以自己研究了一下本地引入的方法,记录在此. 1. ...
- 不为人知的网络编程(十六):深入分析与解决TCP的RST经典异常问题
本文由腾讯技术kernel分享,原题"TCP经典异常问题探讨与解决",下文进行了排版和内容优化等. 1.引言 TCP的经典异常问题无非就是丢包和连接中断,在这里我打算与各位聊一聊T ...
- nginx配置参数优化
ginx作为高性能web服务器,即使不特意调整配置参数也可以处理大量的并发请求.以下的配置参数是借鉴网上的一些调优参数,仅作为参考,不见得适于你的线上业务. worker进程 worker_proce ...
- 基于Fluss 的流式湖仓架构
目录 1. What 2. 架构 2.1 CoordinatorServer 2.2 TabletServer 2.3 LogStore 2.4 KvStore 2.5 Tablet / Bucket ...
- 手撸原生js放大镜效果
普及知识:放大镜特效涉及到的几个值 offsetWidth 获取元素的宽度offsetHeight 获取元素的高度offsetLeft父元素没有定位时,获取元素距离页面的左边距,父元素有定位时 ...
- 安装WindowsXP系统
重点 1.虚拟磁盘类型必须选IDE,不然会找不到磁盘 2.下载地址:链接 ,提取码: 592u 3.可以将这个系统作成一个装机PE[大白菜] 4.安装成功后,调节分辨率时,安装VWmare Tool工 ...
- TCA 复习
HTML中预览PDF 手机端无法识别embed <embed src="***.pdf" id="review" style="width:11 ...
- Docker与联合文件系统
1. 联合文件系统 概念 UnionFS(联合文件系统)是一种分层,轻量级并且高性能的文件系统,它支持对文件系统的修改作为一次次的提交来一层一层的叠加,同时可以将不同目录挂载到同一个虚拟文件系统下(u ...