大数据变长存储算法 - 实践

news/2025/10/3 21:10:38/文章来源:https://www.cnblogs.com/tlnshuju/p/19124995

大数据变长存储算法 - 实践

2025-10-03 21:03  tlnshuju  阅读(0)  评论(0)    收藏  举报

1、应用场景

对于高精度采样结果,其数值最大可能需要3字节,最少1字节,采用标准C的基础数据类型,U16太小无法满足需求,U32则浪费内存。当样本量很大时,其占用的空间问题便突显出来。能否采用变长数据类型存储呢?对小数据采用U8,大数据采用U32,随着数值大小动态分配存储空间。

2、数据去冗余

U32的空间其数值范围最大接近2^32,该值非常大,实际数值范围远小于它,高位必然为0。例如U32表示1使用0x00000001,前面位都是0,其表达的数值和U8的0x01是一样的,前面重复的一串0属于冗余数据区,是可以剔除的。

假设5个数据D0..4,原本每个数据固定为U32类型,将其高位冗余0去掉,再拼接到U8的一维数组,则占用的空间和大大缩小。思路的核心是把 U32 或者U64 数组裁剪后拼接成U8 数组,同时确保使用时可根据U8 数组中存储的信息将对应的数值还原。

假设有0x00000001、0x00000101、0x00000001三个数据,其有效部分是0x01、0x0101、0x01,如果直接拼接在一起,则没法区分0x01010101的含义。因此数据在去掉高位0之后,还需进行编码标记,便于后续解析还原。

3、数据编码

数据编码的主要作用是标记当前数据占用多少连续字节,有两种方案:

1、固定位来定义字节长度(2位可以表示4字节)

一字节:00******
二字节:01******,00******
三字节:10******,01******,00******
四字节:11******,10******,01******,00******
五字节:使用2位不支持

每个字节的最高2位表示属于原始数据的第几个(从0开始),前面举例的3个字节可以表示为: 

0x01  编码后二进制为 00-000001,最高2位为0,表示当前是编码后的数据的最后一个字节; 

0x0101 编码后二进制为 01-000001--00-000001 解析时取每个字节的2位判断,若为00则表示一个编码数值结束。 

因为前面2位固定用于标记字节数,每个字节实际可用范围只有6位,如果原数据位1000 0001,则最高两位的10需要再占用一个字节表示,最终编码为 01-000010--00-000001。 

这种编码方式,所有字节有效位是固定的,编解码实现容易。缺点是4字节只有24位有效数据,假如原数据最大到25位,则每个字节分配3位来表示,不过这种大数据一般嵌入式很少使用。

2、字节最高位表示还有剩余数据,借鉴UTF8的编码方式

一字节:0*******
两字节:110*****,10******
三字节:1110****,10******,10******
四字节:11110***,10******,10******,10******
五字节:111110**,10******,10******,10******,10******
六字节:1111110*,10******,10******,10******,10******,10******
七字节:不支持

这种编码方式,最高字节的有效位是变化的,其它字节有效位是6位。 

两种编码方式的选取,主要是依据原始数据分布概率,如果原数据范围在24位内,则前面固定位的方式占优,超过32位内则动态的合适,如果数据范围在16位内则没必要如此折腾。

4、数据访问

原数据每个值占用固定字节长度,可以方便的使用数组下标遍历,即地址偏移为(单个数字占用的字节数)*(第几个),编码为变长数据后,要想取到某个原数据编码后的值,如果从数组头开始遍历效率是相当低的,有没有更好的办法呢? 

将前面一维数组转为二维数组,每行数组按前面的编码实现,数据中预留4个字节,每行占满时尾部标记当前行结束累计包括多少个原始数据,下个编码值则存入下一行,依次类推。

如上图,二维数组的一行就退化为一维数组,每行在固定位置标记存储的数量。如果需要查找C10,先按标记数目的字节地址遍历,则可以找到第2行(从0开始)为13,表示需要查找的数据在本行,只需要遍历该行,从C9开始往后查询。

选择合适的数据类型的减小存储空间,对大范围的数据使用变长的类型拼接存储,牺牲了部分时间,但节约了ram或flash空间,对资源紧缺的嵌入式设备具有一定的价值。

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

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

相关文章

5 qoj14553 序列与整数对 题解

序列与整数对 题面 给定一个长度为 \(n\) 的正整数序列 \(A_1, A_2, \cdots,A_n\) ,有 \(m\) 次询问,每次给定两个正整数 \(x, y\) ,求有多少个整数对 \((i,j)\) 满足 \(1 \le i < j \le n,A_i = x, A_j = y\)。…

AT_arc064_d [ARC064F] Rotated Palindromes

比较好的题。 首先你考虑一个回文串,什么时候会循环的时候重复计算。当且仅当其有一个最小循环节 \(t\),移动 \(t\) 次后就会相同。 我们要将这种东西给减掉,同样的,这种贡献我们可以在计算长度 \(\le n\) 的回文串…

vscode代码块格式转换器

介绍 在我们使用vscode时,我们会用到代码块。 代码块十分好用,可以帮我们自动补全代码,也可以存各种板子。虽然会损失人的代码能力,但能提升做题效率。但我们注意到,vscode的代码块是使用json编辑的,对于不会jso…

C语言速成秘籍——跳转语句(goto) - 实践

C语言速成秘籍——跳转语句(goto) - 实践pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "M…

常州城乡和住房建设厅网站简述建设企业网站可信度的具体策略

作者&#xff1a;vivo 互联网服务器团队- Li Gang 本文介绍了一次排查Dubbo线程池耗尽问题的过程。通过查看Dubbo线程状态、分析Jedis连接池获取连接的源码、排查死锁条件等方面&#xff0c;最终确认是因为使用了cluster pipeline模式且没有设置超时时间导致死锁问题。 一、背…

从免疫原性突破到技术迭代:全人源抗体如何重塑靶向治疗格局?

在治疗性抗体领域,“降低免疫原性” 始终是研发的核心追求 —— 人源化抗体虽通过框架区改造将鼠源序列占比降至 5% 以下(如阿达木单抗),但临床数据显示仍有 3.2% 患者产生抗药抗体(ADA),导致药物清除率提升 50…

实用指南:OpenAI Sora 2重磅发布:AI视频生成进入“GPT-3.5时刻”

pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", …

商业网站的规划和设计linux wordpress 升级

在C语言中&#xff0c;flock 是一个用于文件锁定的函数&#xff0c;定义在 sys/file.h 头文件中。它的主要目的是在对文件进行读写操作时&#xff0c;避免其他进程同时访问文件&#xff0c;以实现文件的并发控制。 flock 函数的原型 #include <sys/file.h>int flock(in…

无锡做网站哪家公司好延庆上海网站建设

题目大意&#xff1a; 有边权点权的树&#xff0c;动态修改点权 每次修改后求带权重心x (\(minimize\) \(S\sum_i val[i]*dist[x][i]\)) 分析&#xff1a; 从暴力找突破口&#xff1a; 对于边x,y&#xff0c;设长度为len&#xff0c;切断后x半边树权值和为\(w_1\)&#xff0c;y…

工作感受月记(202510月)

国庆节在毕节上班一天中...... 2025年10月03号 1/ 值班完成手中TODO list,icm,case,blog,和墨墨记单词270 2/ 整理心态,看queue中 今日关键字:挣钱中

域名就是网站名吗wordpress 消息推送

这里将介绍如何使用 OpenCV 与 Python 来作彩色影像转HSV(RGB to HSV 或 BGR to HSV)&#xff0c;在写 Python 影像处理程序时常会用到 OpenCV cvtColor 作颜色空间转换的功能&#xff0c;接下来介绍怎么使用 Python 搭配 OpenCV 模块来进行 RGB/BGR 转 HSV 彩色转HSV空间。 H…

欧几里得算法与扩展欧几里得算法详解

在数论和密码学中,欧几里得算法(Euclidean Algorithm)是一个古老而重要的算法,用于计算两个整数的最大公约数(GCD)。 欧几里得算法(更相减损法) 欧几里得算法基于以下原理:两个整数的最大公约数等于其中较小的…

网站承建乐山网站公众号建设

前置操作 如果是在 spring-config 中添加 bean 标签来注册内容&#xff0c;每个类都要弄一次就显得麻烦和臃肿了&#xff0c;对于 new 操作而言就没有什么优势了。因此 spring 就引入了注解操作来实现对 Bean 对象的存储。 配置扫描路径 想要将对象成功的存储到 Spring 中&…

网站建设交流发言稿如何建立网站模板

简介: CSDN博客专家,专注Android/Linux系统,分享多mic语音方案、音视频、编解码等技术,与大家一起成长! 优质专栏:Audio工程师进阶系列【原创干货持续更新中……】🚀 人生格言: 人生从来没有捷径,只有行动才是治疗恐惧和懒惰的唯一良药. 更多原创,欢迎关注:Android…

题解:AT_agc038_f [AGC038F] Two Permutations

题目: 置换环是显然的,一个环有旋一下和不旋两种状态。 \((P_i=i,Q_i=i,P_i=Q_i)\) 无非这三个限制。\((0,0,0)\):旋一个以上就有贡献。 \((0,0,1)\):旋一个才有贡献。 \((0,1,0)\):旋 P 才有贡献。 \((1,0,0)\):…

完整教程:flink批处理-时间和窗口

完整教程:flink批处理-时间和窗口2025-10-03 20:43 tlnshuju 阅读(0) 评论(0) 收藏 举报pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !impo…

详细介绍:Java基础

pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", …

10.3 考试总结

10.3 考试总结10.3 考试总结 题面下载 得分情况 悲痛爆零 时间分配(大概) 8:30 $ \ $ -- $ \ $T1第一版dp写了出来,大样例没过,开始打dfs 9:20 $ \ $ -- $ \ $T1 dfs好像过了,感觉T3更简单,想去打T3 10:10 --…

国庆集训-JDAY3

国庆集训-JDAY3T1 love思路 暴力枚举 解法 枚举天数,累加即可 归纳总结解题策略 枚举 结果 100pts 时间分配 10minT2 square思路 递推,从\(s_1\)推到\(s_n\) 解法 \(s\)每次变成\(s+n个.+s\) 归纳总结解题策略 递归/…