1.面向混合固态存储系统的嵌入式IoT时序数据库设计方法,其特征在于,具体步骤如下:步骤1)在存储器驱动中建立时序数据存储引擎;
步骤2)在写入数据时根据IoT源的不同对时序数据进行分区;
步骤3)将时序数据以4KB的块为单位进行删冗压缩后存储在非易失性存储器NVM中;
步骤4)当NVM内数据块数量达到一定阈值时,将时效性较低的时序数据块迁移到固态硬盘SSD中,并且在NVM上保存其摘要;
步骤5)在查询数据时根据分级异构的时序数据索引机制索引NVM和SSD中的时序数据;
所述步骤2),具体步骤如下:
步骤2.1:在NVM中为IoT源建立信息区,包括IoT源的名称name、产生数据的时间间隔interval、数值精度precision、频繁查询时间范围range,迁移阈值threshold,并为此IoT源分配一个独立的时序数据存储区;
步骤2.2:为IoT源信息区建立Hash索引结构,将IoT源名称由字符串转换为唯一的纯数字字符串,以该纯数字字符串为Key,以该IoT源信息区地址为Value,使用平方取中法为每个IoT源分配Hash值;
所述步骤3),具体步骤如下:
步骤3.1:在时序数据存储区内,检查所含数据块的数量;
步骤3.2:若数据块的数量为零,建立一个大小为4KB的数据块,它由块首的(start_stime,start_value,p_num,next,pre)和块的主体D数组构成,start_stime表示数据块的起始时间,start_value表示起始数值,p_num表示start_value连续重复出现的个数,next表示下一个块的地址,pre表示下一个块的地址,D数组用来存储一个个压缩后的数值d;将待存储的时序数据的时间戳和数值保存在块首的start_time和start_value位置;
步骤3.3:若数据块的数量不为零,检查第一个数据块是否还有空间容纳新值,若没有,则以步骤3.2的方法生成一个新块,并使next指针指向目前第一个块,然后让目前第一个块的pre指针指向这个新建的块,从而使新建的块永远在第一个块;
步骤3.4:若第一个数据块还有空间容纳新值,则将待存储的时序数据点的数值Value与start_value进行对比,若相等,则仅让数据块块首的p_num变量自加,若不相等,则对Value进行计算得到一个数正整数d,将d存入D数组,d的计算公式为:precision
d=(Value–start_value)*10 ;
所述步骤5),具体步骤如下:
步骤5.1:首先根据用户输入的IoT源名称,通过哈希索引查找到该IoT源信息;
步骤5.2:获取其时序数据存储区的首地址,即数据块链表的头节点,再根据用户输入的时间起点和终点,判断用户所需要的数据位于哪个或哪些数据块,判断公式如下:同时满足(1)式和(2)则表示当前数据块包含所需数据,其中search_time_start和search_time_end分别表示用户要查询的时间段的起始时间点和结束时间点;
步骤5.3:定位到目标数据块,根据如下公式定位到目标数据在块内的起始位置x:其中search_time表示要获取的具体时序数据的时间戳;
步骤5.4:根据x的大小获取时序数据的值或者提取D数组中的元素后解压得到时序数据的值,公式如下:其中value表示要获取的具体时序数据的数值;
步骤5.5:连续获取后续的数组元素内值并解压,每进行一次计算后search_time加interval,直到search_time等于search_time_end;
步骤5.6:若用户输入的查询时间范围超出了迁移阈值内所包含的时序数据时间范围,则说明数据位于SSD上或者不存在;
步骤5.7:索引NVM上的低时效时序数据的摘要,若在摘要中找到了包含目标时序数据的条目Lblock_key,则根据Lblock_value定位到SSD中的目标数据块,利用步骤5.3和5.4中的公式计算出起始点数据的位置和值并继续往后获取剩下的数据。
2.根据权利要求1所述的方法,其特征在于,所述步骤1),具体步骤如下:步骤1.1:在内核的系统调用库中申明时序数据库引擎系统调用函数sys_call_TSNSM(name,interval,precision,range),参数name代表传感器的名称,在存储系统中称之为IoT源的名称,interval代表该设备发送数据的时间间隔,precision表示该设备所发送的数据值的小数位数字个数,range表示用户需要对这个设备的数据经常访问的时间范围;
步骤1.2:在内核的存储器驱动中实现时序数据库所需要的读写函数;
put_tsnsm(name,timestamp,value,batch)写函数,name表示IoT源的名称,timestamp表示时间戳,value表示数值,batch表示插入模式是普通插入还是批量插入,默认为普通插入;
read_tsnsm(name,time_start,time_end)读函数,name表示IoT源的名称,time_start和time_end分别表示要读取的时间段的起点和终点;
步骤1.3:在内核中为上述函数指定系统调用号,函数sys_call_TSNSM(),put_tsnsm(),read_tsnsm()的系统调用号分别为330、331、332。
3.根据权利要求1所述的方法,其特征在于,所述步骤4),具体步骤如下:步骤4.1:在每次新建一个数据块后,检查该IoT源所拥有的数据块的数量是否达到其迁移阈值threshold,阈值的计算公式如下:步骤4.2:若达到迁移阈值,则将其数据存储区的最后一个数据块迁移至SSD中,并将SSD的地址用变量Lblock_value保存,将该数据块的起始时间戳、p_num、所属IoT源名称拼接成一个字符串用变量Lblock_key保存;
步骤4.3:将(Lblock_key,Lblock_value)作为键值对插入到NVM上的低时效时序数据的摘要B树中。