存储空间紧张?来看 TDengine TSZ 压缩算法如何显著提升压缩率

本文涉及的产品
云原生数据库 PolarDB MySQL 版,Serverless 5000PCU 100GB
云数据库 Redis 版,社区版 2GB
推荐场景:
搭建游戏排行榜
云数据库 RDS MySQL Serverless,0.5-2RCU 50GB
简介: 本篇文章中,我们将就如何在 TDengine 中开启 TSZ 压缩算法进行详细说明,并会针对 TSZ 压缩算法展开功能测试,为大家验证其在实际业务场景中的更优性能。

TSZ 压缩算法是 TDengine 为浮点数据类型提供的可选压缩算法,可以实现浮点数有损至无损全状态压缩,相比默认压缩算法,TSZ 压缩算法压缩率更高,即使切至无损状态,压缩率也会比默认压缩高一倍。一般来说,TSZ 压缩算法是通过数据预测技术完成的压缩,所以更适合有规律变化的数据。同时 TSZ 压缩时间会更长一些,在我们的服务器 CPU 空闲、存储空间紧张的情况下适合选用。


在此前发布的《压缩比提高5倍!贡献者+1》一文中,华中科技大学、武汉光电国家研究中心的硕士研究生钟宇为大家详细介绍了其在近期发表的学术论文中,针对 TDengine TSZ 压缩算法进行的相关改进。本篇文章中,我们将就如何在 TDengine 中开启 TSZ 压缩算法进行详细说明,并会针对 TSZ 压缩算法展开功能测试,为大家验证其在实际业务场景中的更优性能。


在 TDengine 中开启 TSZ 压缩算法

TDengine 3.2.0.0 及以上版本中支持此压缩算法。在 taos.cfg 配置中增加以下内容,即可开启 TSZ 压缩算法,功能打开后,会替换默认算法。以下表示字段类型是 float 及 double 类型都使用此压缩算法,也可以单独只配置一个。


lossyColumns     float|double


配置成功后需要重启服务才能生效,当 Taosd 日志输出以下内容时,即表明功能已生效:


02/22 10:49:27.607990 00002933 UTL  lossyColumns     float|double


配置参数

FLOAT 类型精度控制:

DOUBLE 类型精度控制:

TSZ 压缩中可选择的算法 FSE,默认为 HUFFMAN:

但需要注意的是,打开 TSZ 后生成的存储数据格式,在回退至 3.2.0.0 之前的版本后数据将不能被识别。


TDengine TSZ 压缩算法功能测试

数据正确性

首先我们需要验证写入数据被 TDengine 存储后再次读取出来的正确性:


  • 通过 0-others/compress_tsz1.py 实现;
  • 写入 10 个子表, 每子表 10 万数据,分别写入 float 和 double 字段指定的随机值,写入完成后全部再读取出来,和原来写入时的值进行比较。原来写入的值把整数及小数部分分别在两个 int64 的字段中保存,验证时再读取出来合成一个浮点数进行验证。验证的误差 float 为 1e-6, double 为 1e-12;
  • 验证通过,数据完全正确。


数据兼容性

首先我们需要先写入打开 TSZ 压缩的数据,然后再写入关闭 TSZ 压缩的数据,此阶段测试预期是不管 TSZ 选项打开或关闭,原来使用 TSZ 写入的及没有使用 TSZ 写入的都能正确读取出来。


测试步骤如下:


  1. 配置 TSZ 选项为打开 lossyColumns float|double
  2. 启动 taosd
  3. 创建数据库及表,表中包括 float 及 double 字段
  4. 写入 100 万条数据
  5. 写入成功后读取并查看数据正确性
  6. 退出 taosd 并关闭 TSZ 选项
  7. 启动 taosd 并写入新数据到表中


测试结果显示原来的数据及新写入数据,都正常为符合预期,反复打开及关闭 TSZ,不影响已写入数据的正常存取。


性能比较

我们对本次新引入的 FSE 算法、原来的算法,及关闭 TSZ 压缩后的三个场景作为三种方案进行对比测试,验证打开 TSZ 算法及使用 TSZ 新的 FSE 算法的效果。本次测试的数据规模如下:1 个超级表,2 个子表,每子表 100 万条数据,子表为 25 列 (其中 float 11 列、double 11 列)。


下表为最终测试结果:

从上表可知,方案一中新增的 FSE 算法打开后写入性能优于原来的算法,符合预期;其次,TSZ 压缩算法打开比关闭时,在写入性能、查询及压缩率方面均有小幅提升,此结论也符合预期。


写在最后

在阅读完本篇文章后,你一定对在 TDengine 中开启 TSZ 压缩算法及如何打造更优质性能有了更深入的了解,现在你可以进行操作了。如果在实操过程中碰到任何问题或难点,可以联系我们,和资深研发工程师进行面对面沟通。

目录
相关文章
|
3月前
|
算法 JavaScript Java
【状态压缩】【动态规划】【C++算法】1125.最小的必要团队
【状态压缩】【动态规划】【C++算法】1125.最小的必要团队
|
3月前
|
算法 测试技术 C++
【动态规划】【状态压缩】【C++算法】1815 得到新鲜甜甜圈的最多组数
【动态规划】【状态压缩】【C++算法】1815 得到新鲜甜甜圈的最多组数
|
4月前
|
算法 测试技术 C#
【状态压缩】【动态规划】【C++算法】691贴纸拼词
【状态压缩】【动态规划】【C++算法】691贴纸拼词
|
3月前
|
算法 测试技术 C++
【状态压缩】【动态规划】【C++算法】691贴纸拼词
【状态压缩】【动态规划】【C++算法】691贴纸拼词
|
4月前
|
SQL 存储 编解码
Hive中的压缩技术是如何实现的?请解释其原理和常用压缩算法。
Hive中的压缩技术是如何实现的?请解释其原理和常用压缩算法。
28 0
|
5月前
|
存储 设计模式 算法
【数据结构和算法】压缩字符串
给你一个字符数组chars,请使用下述算法压缩: 从一个空字符串s开始。对于chars中的每组连续重复字符: 如果这一组长度为1,则将字符追加到s中。 否则,需要向s追加字符,后跟这一组的长度。 压缩后得到的字符串s不应该直接返回,需要转储到字符数组chars中。需要注意的是,如果组长度为10或10以上,则在chars数组中会被拆分为多个字符。 请在修改完输入数组后,返回该数组的新长度。
65 1
|
5月前
|
存储 分布式计算 算法
MapReduce计数器,Tash的运行机制,shuffle过程,压缩算法
MapReduce计数器,Tash的运行机制,shuffle过程,压缩算法
22 0
|
5月前
|
消息中间件 存储 算法
【云计算与大数据技术】数据编码LZSS算法、Snappy压缩库及分布式通信系统的讲解(图文解释 超详细)
【云计算与大数据技术】数据编码LZSS算法、Snappy压缩库及分布式通信系统的讲解(图文解释 超详细)
86 0
|
5月前
|
存储 算法 数据处理
C# | 上位机开发新手指南(十一)压缩算法
流式压缩 流式压缩是一种能够实时处理数据流的压缩方式,例如音频、视频等实时传输的数据。 通过流式压缩算法,我们可以边读取边压缩数据,并能够随时输出已压缩的数据,以确保数据的实时性和减少存储和传输所需的带宽。 块压缩 块压缩则是将数据划分为固定大小的块,在每个块内进行独立的压缩处理。块压缩通常适用于文件、存储、传输等离线数据处理场景。 字典压缩 字典压缩是一种基于字典的压缩算法,通过建立一个字典来存储一组重复出现的字符串,并将这些字符串替换成字典中相应的索引,从而减少数据的存储和传输。字典压缩算法可以更好地处理数据中的重复模式,因为它们可以通过建立字典来存储和恢复重复出现的字符串。
46 0
C# | 上位机开发新手指南(十一)压缩算法
|
5月前
|
存储 机器学习/深度学习 人工智能
【408数据结构与算法】—数组和特殊矩阵的压缩存储(二十五)
【408数据结构与算法】—数组和特殊矩阵的压缩存储(二十五)