时间序列数据压缩算法简述
本文简单介绍了时间序列压缩任务的来源,压缩算法的分类,并对常见压缩算法的优缺点进行了简介,爱码士们快来一探究竟呀!
引言
时间序列数据是在许多应用程序和领域中生成的一种基本数据类型,例如金融、医疗保健、交通和智慧城市[1]。时间序列分析对于各种任务至关重要,包括异常检测、预测、分类和聚类等。然而,时间序列数据的庞大数量和复杂性可能对高效存储、检索和处理带来重大挑战[2]。
相比于传统的关系型数据库,时间序列数据库天生是为了时间序列数据处理而生。关系数据库往往采用传统的B+树存储结构以及行式存储的方式。这种存储结构的设计方案往往适合读多写少的场景,来提高数据查询性能,用以减少磁盘或者网络 I/O。
然而,在这种设计上,由于绝大部分设计和资源都是为了读取数据,在每插入一条新记录时,都要同步更新相应的存储结构。数据库往往还要先找到所要插入的数据位于B+ 树中的哪个节点,存储页面中的哪一个页,查看相应的键是不是已经存在等等,这都会大量增加插入操作的时间开销。因此,以目前时间序列数据库开源社区使用最为广泛的InfluxDB[3]为例,其采用了基于LSM树的存储结构,并对此进行了一些特异性优化开发,使得数据库写入的能力提高很多倍。
随着时间的推移,早期产生的数据所具有的价值会越来越低,对于时间序列数据库的应用场景之一监控场景来说,用户更可能仅仅关注当前时刻或近期内数据库的状态参数,而较早产生的数据会因时间积累越来越多且仅有较低概率会被查询。因此有必要对早期的数据进行一定程度的压缩,同时考虑到该类型数据查询价值较低,在提高压缩比的同时又能够尽可能保留原始数据的一些特征便成为了一个重要的问题。这样可以更好地对数据库资源合理规划、缓解数据库管理数据的压力,降本增效,更好的为数据的存储和查询赋能。
为了应对这些挑战,越来越需要专门的算法和数据结构来压缩并索引时间序列数据。数据压缩算法主要在数据压缩比、数据解压缩速度、数据压缩精度这几方面做权衡,指导了时间序列数据压缩的各种技术的发展。
数据压缩算法分类
对于时间序列数据,有几种常用的压缩算法。可以根据压缩再解压后是否丢失精度问题,将压缩算法分为两类:分别是无损压缩算法和有损压缩算法。
无损压缩算法的特点是压缩前后数据的完整性保持不变,即压缩后的数据可以完全恢复到压缩前的原始数据。常见的无损压缩算法包括:
- 基于差分编码的算法[7,8]:差分编码算法通过计算相邻时间点之间的差异来压缩时间序列数据,减少冗余信息的存储。
- 基于霍夫曼编码的算法[9,10]:使用变长编码,高频数据用较短的代码表示,而低频数据用较长的代码表示。
有损压缩算法通过去除一些冗余信息来达到较高的压缩率,但压缩后的数据不能完全恢复到原始数据,可能存在一定程度的误差。常见的有损压缩算法包括:
- 基于小波变换的算法[11,12]:小波变换可以将时间序列数据分解成多个频率子带,提取时间序列数据的主要特征,然后通过编码对这些特征进行压缩。
- 基于离散余弦变换的算法:离散余弦变换可以将时间序列数据转换为频域信号,通过保留高频分量和抑制低频分量实现压缩。
广泛应用的压缩算法简介
- Gorilla[13]是一种基于二进制元组编码的时间序列数据压缩算法。它的优点包括高压缩率、高压缩速度和较低的存储要求,但由于需要大缓冲区,可能会受到内存限制的影响。
- LZ4[14]是一种通用数据压缩算法,也可用于时间序列数据压缩。其优点包括压缩速度快、压缩延迟低、压缩比好,但在一些特殊的时间序列数据分布中,可能会出现压缩性能不佳的情况。
- Zstandard[15]是一种基于LZ77算法的压缩算法,适用于一般的压缩解压任务, 也可以用于时间序列数据的压缩。其优点是压缩比高,解压延迟低,压缩速度可调,但压缩时间可能较长。
- Snappy[16]是一种快速压缩算法,适用于各种类型的数据,包括时间序列数据。其优点包括压缩速度高、压缩延迟低、压缩比可靠,但压缩比相对较低。
- LFZip[17]是一种基于分段和拟合算法的时间序列数据压缩算法,具有良好的压缩比和速度。它的缺点是不能处理异常值和噪声,需要调整一些参数以适应 同的数据分布。
- Chimp[18]是一种基于采样的时间序列数据压缩算法,具有高压缩比和速度,可以动态适应不同的数据分布。它的缺点是需要足够的采样频率来保证压缩精度,并且处理异常值的能力较弱。
- Sprintz[19]是一种简单有效的无损数据压缩算法。其主要优点包括压缩比高、速度快、复杂度低。但是Sprintz算法对数据相关性的依赖度很高,需要额外的一些位来存储差异,导致存储量相对较低。
在 CnosDB 中应用压缩算法
在 CnosDB 中,可以在创建数据库时对特定的属性指定压缩方法,CnosDB 中支持的压缩方法包括:
- Delta
- Gzip
- Bzip
- Gorilla
- Snappy
- Zstd
- Zlib
- BitPack
- SDT
- DeadBand
语法结构如下:
CREATE TABLE TIMESERIES(column1 BIGINT CODEC(DELTA),name STRING CODEC(GZIP),age BIGINT UNSIGNED CODEC(NULL),marriage BOOLEAN,ID DOUBLE CODEC(GORILLA)
)
在创建数据库时,指定属性的类型后,附加一个CODEC(),括号内是压缩方法,来达到指定压缩方式的效果。
小结
时间序列的压缩主要还是围绕着时间序列的连续性好、相关性强的特点设计压缩算法,而由于数据规模通常较大,以一定精度损失换取极高压缩比的有损压缩算法更广泛地被应用。
本文简单介绍了时间序列压缩任务的来源,压缩算法的分类,并对常见压缩算法的优缺点进行了简介,在CnosDB中的应用也只是略有提及,感兴趣者可以查看参考文献中的内容。
参考文献
[1] FU T-C. A review on time series data mining [J]. Engineering Applications of Artificial Intelligence,2011,24(1):164-181.
[2] WLODARCZYK T W. Overview of time series storage and processing in a cloud environment [C] // 4th IEEE International Conference on Cloud Computing Technology and Science Proceedings,[S.l.],2012:625-628.
[3] NAQVI S N Z,YFANTIDOU S,ZIMÁNYI E. Time series databases and influxdb[J]. Studienarbeit, Université Libre de Bruxelles,2017,12
[4] ANH V N,MOFFAT A. Index compression using 64-bit words[J]. Software: Practice and Experience,2010,40(2):131-147.
[5] GOLOMB S. Run-length encodings (corresp.) [J]. IEEE transactions on information theory,1966,12(3):399-401.
[6] RICE R F. Some practical universal noiseless coding techniques[M] // . 1979.
[7] CANDY J. A use of double integration in sigma delta modulation [J]. IEEE transactions on communications,1985,33(3):249-258.
[8] O’NEAL J. Differential pulse-code modulation (PCM) with entropy coding[J]. IEEE Transactions on Information Theory,1976,22(2):169-174.
[9] OSWAL S,SINGH A,KUMARI K. Deflate compression algorithm [J]. International Journal of Engineering Research and General Science,2016,4(1) :430-436.
[10] GAILLY J-L,ADLER M. GNU gzip [J]. GNU Operating System,1992.
[11] ZHANG Q,BENVENISTE A. Wavelet networks[J]. IEEE transactions on Neural Networks,1992,3(6):889-898.
[12] KINGSBURY N. Complex wavelets for shift invariant analysis and filtering of signals[J]. Applied and computational harmonic analysis,2001,10(3): 234-253.
[13] PELKONEN T,FRANKLIN S,TELLER J,et al. Gorilla: A fast, scalable, inmemory time series database [J]. Proceedings of the VLDB Endowment,2015, 8(12):1816-1827.
[14] COLLET Y,OTHERS. Lz4: Extremely fast compression algorithm[J]. code. google. com,2013.
[15]COLLET Y. Zstandard-fast real-time compression algorithm[J]. Github repository [online],2018.
[16] GUNDERSON S H. Snappy: A fast compressor/decompressor[J]. code. google. com/p/snappy,2015.
[17] CHANDAK S,TATWAWADI K,WEN C,et al. LFZip: Lossy compression of multivariate floating-point time series data via improved prediction [C] // 2020 Data Compression Conference (DCC),[S.l.],2020:342-351.
[18] LIAKOS P,PAPAKONSTANTINOPOULOU K,KOTIDIS Y. Chimp: efficient lossless floating point compression for time series databases [J]. Proceedings of the VLDB Endowment,2022,15(11):3058-3070.
[19] BLALOCK D,MADDEN S,GUTTAG J. Sprintz: Time series compression for the internet of things [J]. Proceedings of the ACM on Interactive, Mobile, Wearable and Ubiquitous Technologies,2018,2(3):1-23
CnosDB简介
CnosDB是一款高性能、高易用性的开源分布式时序数据库,现已正式发布及全部开源。
欢迎关注我们的社区网站:https://cn.cnosdb.com
相关文章:

时间序列数据压缩算法简述
本文简单介绍了时间序列压缩任务的来源,压缩算法的分类,并对常见压缩算法的优缺点进行了简介,爱码士们快来一探究竟呀! 引言 时间序列数据是在许多应用程序和领域中生成的一种基本数据类型,例如金融、医疗保健、交通和…...

智能锁-SI522TORC522方案资料
南京中科微这款SI522目前完全PinTOPin兼容的NXP:RC522、CV520 复旦微:FM17520、FM17522/FM17550 瑞盟:MS520、MS522 国民技术:NZ3801、NZ3802 SI522 是应用于13.56MHz 非接触式通信中高集成度读写卡系列芯片中的一员。是NXP 公司针对&quo…...
redux(4) -RTK简单使用
简单使用 1、下载 npm i reduxjs/toolkit react-redux 2、创建 1、在redux/user.js中创建模块user。从reduxjs/toolkit中引入createSlice创建模块片段,我们需要传入name、初始数据initialState、改state的reducers等。最后需要导出reducer和action。 代码如下&a…...

开源运维监控系统-Nightingale(夜莺)应用实践(未完)
一、前言 某业务系统因OS改造,原先的Zabbix监控系统推倒后未重建,本来计划用外部企业内其他监控系统接入,后又通知需要自建才能对接,考虑之前zabbix的一些不便,本次计划采用一个类Prometheus的监控系统,镜调研后发现Nightingale兼容Prometheus,又有一些其他功能增强,又…...

深入理解GMP模型
1、GMP模型的设计思想 1)、GMP模型 GMP分别代表: G:goroutine,Go协程,是参与调度与执行的最小单位M:machine,系统级线程P:processor,包含了运行goroutine的资源&#…...

数学建模-基于集成学习的共享单车异常检测的研究
基于集成学习的共享单车异常检测的研究 整体求解过程概述(摘要) 近年来,共享单车的快速发展在方便了人们出行的同时,也对城市交通产生了一定的负面影响,其主要原因为单车资源配置的不合理。本文通过建立单车租赁数量的预测模型和异常检测模型…...

C语言-内存分配
内存分配 1. 引入 int nums[10] {0}; //对int len 10; int nums[len] {0}; //错是因为系统的内存分配原则导致的2. 概述 在程序运行时,系统为了 更好的管理进程中的内存,所以有了 内存分配机制。 分配原则: 2.1 静态分配 静态分配原…...
算法工程师-机器学习面试题总结(1)
目录 1-1 损失函数是什么,如何定义合理的损失函数? 1-2 回归模型和分类模型常用损失函数有哪些?各有什么优缺点 1-3 什么是结构误差和经验误差?训练模型的时候如何判断已经达到最优? 1-4 模型的“泛化”能力是指&a…...

【蓝桥杯选拔赛真题73】Scratch烟花特效 少儿编程scratch图形化编程 蓝桥杯创意编程选拔赛真题解析
目录 scratch烟花特效 一、题目要求 编程实现 二、案例分析 1、角色分析...
Juniper EX系列交换机端口配置操作
配置物理端口参数 userhost#set interface ge-slot/pic/port decription description #配置端口描述 userhost#set interface ge-slot/pic/port mtu mtu-number #配置端口MTU userhost#set interface ge-slot/pic/port ether-options speed (10m | 100m | 1g) #配置端口速率…...

2.1 Linux C 编程
一、Hello World 1、在用户根目录下创建一个C_Program,并在这里面创建3.1文件夹来保存Hellow World程序; 2、安装最新版nvim ①sudo apt-get install ninja-build gettext cmake unzip curl ②sudo apt install lua5.1 ③git clone https://github.…...

服务器数据恢复—ocfs2文件系统被格式化为其他文件系统如何恢复数据?
服务器故障: 由于工作人员的误操作,将Ext4文件系统误装入到存储中Ocfs2文件系统数据卷上,导致原Ocfs2文件系统被格式化为Ext4文件系统。 由于Ext4文件系统每隔几百兆就会写入文件系统的原始信息,原Ocfs2文件系统数据会遭受一定程度…...

海云安参与制定《信息安全技术 移动互联网应用程序(App)软件开发工具包(SDK)安全要求》标准正式发布
近日,由TC260(全国信息安全标准化技术委员会)归口 ,主管部门为国家标准化管理委员会,深圳海云安网络安全技术有限公司(以下简称“海云安”)等多家相关企事业单位共同参与编制的GB/T 43435-2023《…...

如何调用 API | 学习笔记
开发者学堂课程【阿里云 API 网关使用教程:如何调用 API】学习笔记,与课程紧密联系,让用户快速学习知识。 课程地址:阿里云登录 - 欢迎登录阿里云,安全稳定的云计算服务平台 如何调用 API 调用 API 的三要素 要调用 API 需要三…...
关于云备份项目的HTTP协议字段理解
200状态码 给客户端返回该文件全部内容的响应 304状态码 206状态码 和If-Ranage请求头字段搭配使用,...

掉落的俄罗斯方块
欢迎来到程序小院 掉落的俄罗斯方块 玩法:上键 W↑变换、 左键 A← 左移、右键 D→ 右移、下键S ↓ 加速,两种模式, 可以一个大人玩,也可以两个人一起玩,小鸟经过会撞走方块,快去体验吧^^。开始游戏 html <div idc…...

医院不良事件报告系统源码带鱼骨图分析
医院不良事件上报系统通过 “事前的人员知识培训管理和制度落地促进”、“事中的事件上报和跟进处理”、 以及 “事后的原因分析和工作持续优化”,结合预存上百套已正在使用的模板,帮助医院从对护理事件、药品事件、医疗器械事件、医院感染事件、输血事件…...
数据库相关算法题 V3
订单最多的客户 在考虑多个最多订单客户的情况下可以采用dense_rank()函数,最多则由group by customer_number以及order count(*)得到 select customer_number from (select customer_number,dense_rank() over (order by count(*) desc) as rk from Orders group…...

第二证券:本周3只新股申购,大豆蛋白行业领军企业来了!
截至发稿,本周网上发行有2只新股宣布发行价。创业板新股丰茂股份发行价为31.9元,发行市盈率28.27倍,工作最近一个月平均动态市盈率25.76倍。沪主板新股索宝蛋白发行价为21.29元,发行市盈率26.74倍,工作最近一个月平均动…...
【go语言开发】loglus日志框架的使用
本文将简单介绍loglus框架的基本使用,并给出demo 文章目录 前言Loglus常见用法自定义日志级别使用字段钩子输出到多个位置使用钩子实现自定义日志处理demo 前言 Logrus 是一个用于 Go 语言的结构化日志框架,它提供了丰富的日志级别、钩子和格式化选项。…...
基于算法竞赛的c++编程(28)结构体的进阶应用
结构体的嵌套与复杂数据组织 在C中,结构体可以嵌套使用,形成更复杂的数据结构。例如,可以通过嵌套结构体描述多层级数据关系: struct Address {string city;string street;int zipCode; };struct Employee {string name;int id;…...
【根据当天日期输出明天的日期(需对闰年做判定)。】2022-5-15
缘由根据当天日期输出明天的日期(需对闰年做判定)。日期类型结构体如下: struct data{ int year; int month; int day;};-编程语言-CSDN问答 struct mdata{ int year; int month; int day; }mdata; int 天数(int year, int month) {switch (month){case 1: case 3:…...
rknn优化教程(二)
文章目录 1. 前述2. 三方库的封装2.1 xrepo中的库2.2 xrepo之外的库2.2.1 opencv2.2.2 rknnrt2.2.3 spdlog 3. rknn_engine库 1. 前述 OK,开始写第二篇的内容了。这篇博客主要能写一下: 如何给一些三方库按照xmake方式进行封装,供调用如何按…...

云启出海,智联未来|阿里云网络「企业出海」系列客户沙龙上海站圆满落地
借阿里云中企出海大会的东风,以**「云启出海,智联未来|打造安全可靠的出海云网络引擎」为主题的阿里云企业出海客户沙龙云网络&安全专场于5.28日下午在上海顺利举办,现场吸引了来自携程、小红书、米哈游、哔哩哔哩、波克城市、…...
【磁盘】每天掌握一个Linux命令 - iostat
目录 【磁盘】每天掌握一个Linux命令 - iostat工具概述安装方式核心功能基础用法进阶操作实战案例面试题场景生产场景 注意事项 【磁盘】每天掌握一个Linux命令 - iostat 工具概述 iostat(I/O Statistics)是Linux系统下用于监视系统输入输出设备和CPU使…...

el-switch文字内置
el-switch文字内置 效果 vue <div style"color:#ffffff;font-size:14px;float:left;margin-bottom:5px;margin-right:5px;">自动加载</div> <el-switch v-model"value" active-color"#3E99FB" inactive-color"#DCDFE6"…...

微服务商城-商品微服务
数据表 CREATE TABLE product (id bigint(20) UNSIGNED NOT NULL AUTO_INCREMENT COMMENT 商品id,cateid smallint(6) UNSIGNED NOT NULL DEFAULT 0 COMMENT 类别Id,name varchar(100) NOT NULL DEFAULT COMMENT 商品名称,subtitle varchar(200) NOT NULL DEFAULT COMMENT 商…...
数据库分批入库
今天在工作中,遇到一个问题,就是分批查询的时候,由于批次过大导致出现了一些问题,一下是问题描述和解决方案: 示例: // 假设已有数据列表 dataList 和 PreparedStatement pstmt int batchSize 1000; // …...

用docker来安装部署freeswitch记录
今天刚才测试一个callcenter的项目,所以尝试安装freeswitch 1、使用轩辕镜像 - 中国开发者首选的专业 Docker 镜像加速服务平台 编辑下面/etc/docker/daemon.json文件为 {"registry-mirrors": ["https://docker.xuanyuan.me"] }同时可以进入轩…...
聊一聊接口测试的意义有哪些?
目录 一、隔离性 & 早期测试 二、保障系统集成质量 三、验证业务逻辑的核心层 四、提升测试效率与覆盖度 五、系统稳定性的守护者 六、驱动团队协作与契约管理 七、性能与扩展性的前置评估 八、持续交付的核心支撑 接口测试的意义可以从四个维度展开,首…...