TDengine 中的压缩设计

简介

机器设备产生的时序数据量大,直接存储成本非常高,所以需要使用压缩技术,尽可能减小体积。 TDengine 使用了列式存储,结合二级压缩技术,压缩率通常可以达到 20%,特殊情况下更能达到 5 % 以内,超高的压缩率实实在在的为用户节约了磁盘空间。

数据压缩

数据压缩是一种在不损失数据有效信息的前提下,利用特定算法对数据进行重新组织和处理,以减少数据占用的存储空间和提高数据传输效率的技术。TDengine 在数据的存储和传输过程中均采用了这一技术,旨在优化存储资源的使用并加快数据交换的速度。

存储压缩

TDengine 在存储架构上采用了列式存储技术,这意味着在存储介质中,数据是以列为单位进行连续存储的。这与传统的行式存储不同,后者在存储介质中是以行为单位进行连续存储的。列式存储与时序数据的特性相结合,尤其适合处理平稳变化的时序数据。

为了进一步提高存储效率,TDengine 采用了差值编码技术。这种技术通过计算相邻数据点之间的差异来存储数据,而不是直接存储原始值,从而大幅度减少存储所需的信息量。在差值编码之后,TDengine 还会使用通用的压缩技术对数据进行二次压缩,以实现更高的压缩率。

对于设备采集的稳定时序数据,TDengine 的压缩效果尤为显著,压缩率通常可以达到 10% 以内,甚至在某些情况下更高。这种高效的压缩技术为用户节约了大量的存储成本,同时也提高了数据的存储和访问效率。

一级压缩

时序数据自设备采集后,遵循 TDengine 的数据建模规则,每台采集设备会被构建为一张子表。如此,一台设备产生的所有时序数据均记录在同一张子表中。在数据存储过程中,数据是以块为单位进行分块存储的,每个数据块仅包含一张子表的数据。压缩操作也是以块为单位进行的,对子表中的每一列数据分别进行压缩,压缩后的数据仍然按
块存储至硬盘。

时序数据的平稳性是其主要特征之一,例如采集的大气温度、水温等,通常在一定范围内波动。利用这一特性,可以对数据进行重编码,并且根据不同的数据类型采用
应的编码技术,以实现最高的压缩效率。接下来将介绍各种数据类型的压缩方法。

  • 时间戳类型:由于时间戳列通常记录设备连续采集数据的时刻,且采集频率固定,因此只须记录相邻时间点的差值。由于差值通常较小,这种方法比直接存储原始
    时间戳更能节省存储空间。
  • 布尔类型:布尔类型通过一个比特位表示一个布尔值,一个字节可以存储 8 个布尔值。通过紧凑的编码方式,可以显著减少存储空间。
  • 数值类型:物联网设备产生的数值数据,如温度、湿度、气压、车速、油耗等,通常数值不大且在一定范围内波动。对于这类数据,统一采用 zigzag 编码技术。该技术将有符号整数映射为无符号整数,并将整数的补码最高位移动到低位,负数除了符号位以外的其他位取反,正数保持不变。这样做可以将有效数据位集中,同时增加前导零的数量,从而在后续压缩步骤中获得更佳的压缩效果。
  • 浮点数类型:对于 float 和 double 两种浮点数类型,采用 delta-delta 编码方法。
  • 字符串类型:字符串类型数据采用字典压缩算法,通过短的标识符替换原字符串中频繁出现的长字符串,从而减少存储的信息长度。

二级压缩

在完成针对特定数据类型的专用压缩之后,TDengine 进一步采用通用的压缩技术,将数据视为无差别的二进制数据进行二次压缩。与一级压缩相比,二级压缩的侧重点在于消除数据块之间的信息冗余。这种双重压缩技术,一方面专注于局部数据的精简,另一方面着眼于整体数据的重叠消除,二者相辅相成,共同实现了 TDengine 中的超高压缩率。

TDengine 支持多种压缩算法,包括 LZ4、ZLIB、ZSTD、XZ 等,用户可以根据具体的应用场景和需求,在压缩率和写入速度之间进行灵活权衡,选择最适合的压缩方案。

有损压缩

TDengine 引擎为浮点数类型数据提供了无损压缩和有损压缩两种模式。浮点数的精度通常由其小数点后的位数决定。在某些情况下,设备采集的浮点数精度较高,但实际应用中关注的精度却较低,此时采用有损压缩可以有效地节约存储空间。TDengine 的有损压缩算法基于预测模型,其核心思想是利用前序数据点的趋势来预测后续数据点的走势。这种算法能够显著提高压缩率,相比之下,其压缩效果远超无损压缩。有损压缩算法的名称为 TSZ。

传输压缩

TDengine 在数据传输过程中提供了压缩功能,以减少网络带宽的消耗。使用原生连接从客户端(如 taosc)向服务器传输数据时,可以通过配置压缩传输来节省带宽。在配置文件 taos.cfg 中,可以设置 compressMsgSize 选项来实现这一目标。可配置的值有以下 3 个。

  • 0:表示禁用压缩传输。
  • 1:表示启用压缩传输,但仅对大于 1KB 的数据包进行压缩。
  • 2:表示启用压缩传输,对所有数据包进行压缩。

在使用 RESTful 和 WebSocket 连接与 taosAdapter 通信时,taosAdapter 支持行业标准的压缩协议,允许连接端根据行业标准协议开启或关闭传输过程中的压缩。以下是具体的实现方式:

  • RESTful 接口使用压缩:客户端在 HTTP 请求头部指定 Accept-Encoding 来告知服务器可接受的压缩类型,如 gzip、deflate 等。服务器在返回结果时,会在 ContentEncoding 头部中指定所使用的压缩算法,并返回压缩过的数据。
  • WebSocket 接口使用压缩:可以参考 WebSocket 协议标准文档 RFC7692,了解如何在 WebSocket 连接中实现压缩。
  • 数据备份迁移工具 taosX 与 taosX Agent 之间的通信也可以开启压缩传输。在 agent.toml 配置文件中,设置压缩开关选项 compression=true 即可启用压缩功能。

压缩流程

下图展示了 TDengine 引擎在时序数据的整个传输及存储过程中的压缩及解压过程,以更好地理解整个处理过程。

在这里插入图片描述

更多压缩相关文章

  • 如何选择最佳的压缩算法
  • TDengine 检测数据最佳压缩算法工具
  • TDengine 新功能 压缩算法可配置

访问官网

更多内容欢迎访问 TDengine 官网

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

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

相关文章

深度学习涉及的数学与计算机知识总结

深度学习涉及的数学与计算机知识可总结为以下核心模块,结合理论与实践需求分为数学基础和计算机技能两大方向: 一、数学知识 线性代数 核心:矩阵运算(乘法、转置、逆矩阵)、向量空间、特征值与特征向量、奇异值分解&am…

javascript<——>进阶

一、作用域:变量可以被访问的范围 1.局部作用域 1.1函数作用域 在函数内部声明的变量,在函数内部被访问的,外部无法直接访问。 总结:1、函数内部声明的变量,在函数外部无法直接访问 2、函数的参数也是函数内部的局…

驱动开发硬核特训 · Day 25 (附加篇):从设备树到驱动——深入理解Linux时钟子系统的实战链路

一、前言 在嵌入式Linux开发中,无论是CPU、外设控制器,还是简单的GPIO扩展器,大多数硬件模块都离不开时钟信号的支撑。 时钟子系统(Clock Subsystem),作为Linux内核中基础设施的一部分,为设备…

并发设计模式实战系列(7):Thread Local Storage (TLS)

🌟 大家好,我是摘星! 🌟 今天为大家带来的是并发设计模式实战系列,第七章Thread Local Storage (TLS),废话不多说直接开始~ 目录 一、核心原理深度拆解 1. TLS内存模型 2. 关键特性 二、生活化类比&a…

时序数据库 TDengine × Perspective:你需要的可视化“加速器”

你有没有遇到这样的场景:数据已经写进数据库,图表却总是“慢半拍”?或是操作界面太卡,光是一个排序就能让你等到喝完一杯咖啡?当数据量越来越大、响应时间却越来越长,开发者和用户都不禁要问一句——就没有…

前端面试每日三题 - Day 19

这是我为准备前端/全栈开发工程师面试整理的第十一天每日三题练习,涵盖 JavaScript中WeakMap与内存管理的底层机制、Redux Toolkit的事件以及系统设计中的企业级表单引擎构建。通过这三道题,你将对现代前端开发中的关键概念有更深入的理解,并…

Antd Modal Drawer 更改默认项

当项目比较大使用了非常多的 Modal 和 Drawer 要是有需求一次性全部调整就会比较麻烦,目前 Antd 的 ConfigProvider 暂不支持(也有可能我没找到,待大佬指证)就比如由于默认 Modal Drawer 的遮罩层是可以点击关闭的,但是…

硬件工程师面试常见问题(8)

第三十六问:基尔霍夫定理的内容是什么? 基尔霍夫电流定理: 1. 内容:电路中任意一个节点上,在任意时刻,流入节电的电流之和等于流出节点的电流之和。 2. 表达式:根据上图写出节点电流定律的数学…

Elasticsearch 内存使用指南

作者:来自 Elastic Valentin Crettaz 探索 Elasticsearch 的内存需求以及不同类型的内存统计信息。 Elasticsearch 拥有丰富的新功能,帮助你为你的使用场景构建最佳搜索解决方案。浏览我们的示例笔记本了解更多信息,开始免费云试用&#xff0…

硬件工程师面试常见问题(9)

第四十一问:色环电阻的颜色表示什么? 各环表示的意思: 4色环的:前两位表示有效位;第三环表示倍乘;最后一环表示误差; 5色环的:前三位表示有效位;第四环表示倍乘&#…

PyTorch 深度学习实战(23):多任务强化学习(Multi-Task RL)之扩展

之前的PyTorch 深度学习实战(23):多任务强化学习(Multi-Task RL)总结扩展运用代码如下: import torch import torch.nn as nn import torch.optim as optim import numpy as np from torch.distributions import Norm…

前端——CSS1

一,概述 CSS(Cascading Style Sheets)(级联样式表) css是一种样式表语言,为html标签修饰定义外观,分工不同 涉及:对网页的文字、背景、宽、高、布局进行修饰 分为内嵌样式表&…

赋能航天教育:高校卫星仿真教学实验平台解决方案

​​​​​​ 随着全球航天事业的飞速发展,对高素质航天人才的需求日益增长。如何在高校阶段提前锻炼学生的航天工程实践能力,成为教育界的重要命题。作为领先的通信与网络技术供应商,IPLOOK基于自身在5G核心网、卫星通信及仿真平台领域的深…

Python爬虫(10)Python数据存储实战:基于pymongo的MongoDB开发深度指南

目录 一、为什么需要文档型数据库?1.1 数据存储的范式变革1.2 pymongo的核心优势 二、pymongo核心操作全解析2.1 环境准备2.2 数据库连接与CRUD操作2.3 聚合管道实战2.4 分批次插入百万级数据(进阶)2.5 分批次插入百万级数据(进阶…

Springboot 手搓 后端 滑块验证码生成

目录 一、效果演示 二、后端滑块验证码生成思路 三、原理解析 四、核心代码拿走 滑块验证码react前端实现,见我的这篇博客:前端 React 弹窗式 滑动验证码实现_react中使用阿里云滑块验证码2.0前端接入及相关视觉-CSDN博客 一、效果演示 生成的案例…

关于flink两阶段提交高并发下程序卡住问题

先抛出代码 package com.dpf.flink;import com.dpf.flink.sink.MysqlSink; import org.apache.flink.api.common.serialization.SimpleStringSchema; import org.apache.flink.api.common.typeinfo.Types; import org.apache.flink.api.java.tuple.Tuple2; import org.apache.…

html css js网页制作成品——HTML+CSS+js美甲店网页设计(5页)附源码

美甲店 目录 一、👨‍🎓网站题目 二、✍️网站描述 三、📚网站介绍 四、🌐网站效果 五、🪓 代码实现 🧱HTML 六、🥇 如何让学习不再盲目 七、🎁更多干货 一、👨‍&a…

LeetCode[347]前K个高频元素

思路: 使用小顶堆,最小的元素都出去了,省的就是大,高频的元素了,所以要维护一个小顶堆,使用map存元素高频变化,map存堆里,然后输出堆的东西就行了 代码: class Solution…

2024年网站开发语言选择指南:PHP/Java/Node.js/Python如何选型?

2024年网站开发语言选择指南:PHP/Java/Node.js/Python如何选型? 一、8大主流Web开发语言技术对比 1. PHP开发:中小型网站的首选方案 最新版本:PHP 8.3(2023年11月发布)核心优势: 全球78%的网站…

从数据结构说起(一)

1 揭开数据结构神奇的面纱 1.1 初识数据结构 在C的标准库模板(Standard Template Library,STL)课程上,我初次结识了《数据结构》。C语言提供的标准库模板是面向对象程序设计与泛型程序设计思想相结合的典范。所谓的泛型编程就是编写不依赖于具…