一种基于时间节点的时序数据存储方法与流程

文档序号:15492503发布日期:2018-09-21 20:54阅读:155来源:国知局
本发明涉及数据管理
技术领域
,具体涉及一种基于时间节点的时序数据存储方法。
背景技术
:历史数据是带有时间标志的模拟量或者数字量,这些数据原始出处多是前端设备采集到的诸如环境温度、湿度、压力值等数据量。历史数据具有如下特征:1、海量数据。在工程应用中,设备的使用周期很长,一般是三到五年,并且随着应用的拓展,设备的数量还会进一步增加。设备长年运行,持续采集数据,数据被处理后成为历史数据。以12字节代表一个浮点数据记录,则100000个浮点数据在采集周期为1秒的情况下,一天产生的数据量为4gb,一年的数据量则为tb级别。2、数据存储格式简单。尽管实际应用环境中数据量的意义纷繁复杂,但是在历史数据存储结构内部都只是存储字节上的区别,除了时间戳上的连续性,历史数据不存在关系数据那样的形式多样的关系连接。3、时间特性差异明显。虽然数据存储的格式相对简单,但是由于加入了时间的特性,对于时间的处理是必须考虑的一个关键点。现场采集的数据点所上传的数据周期会依据不同使用情况而相差很大。数据存储时需要处理好不同点之间的时间差异。因为历史数据的这些特点,传统关系型数据库很难适应这种海量数据场景。目前可以用来存储海量历史数据的berkeleydb等数据库是使用单一的数据库文件来存储数据,数据库文件随数据量的增加而变大,难以对特定数据备份和迁移。技术实现要素:为了解决现有技术的不足,本发明提供了一种基于时间节点的时序数据存储方法,本发明通过研究时序数据存储技术,依据面向对象的软件思想,将海量历史数据按照采样对象和采样指标的不同,分为不同的条目,并采用文件存储方式将海量历史数据按照一个文件存储一个条目的数据方式进行存储,该方法具备存取速度快、压缩率高、容易备份和迁移的特点。为了实现上述目的,本发明的技术方案如下:一种基于时间节点的时序数据存储方法,包括以下步骤:1)将海量历史数据按照采样对象和采样指标的不同,分为不同条目;2)将每个条目的数据采用文件存储方式存储为一个文件,其中每个条目的数据以固定的时间间隔依次存储,且在创建存储文件的同时预先分配数据存储空间;3)采用存储映射方式对文件中的数据进行读取和写入,其中数据起止位置根据数据起止时间进行计算。进一步的,所述步骤2)中,每个条目对应一个唯一id,每个文件采用对应条目id进行命名。进一步的,所述步骤2)中,每个所述文件都包括文件头和数据区,其中所述文件头包括总记录数、记录时间间隔、数据类型、基准值、步进值和最后记录时间;所述数据区中,一个数据记录使用4个字节来存储,其内容根据数据品质的不同而有所不同。进一步的,所述总记录数为该条目的最大数据个数;所述记录时间间隔为相邻两个记录的时间差;所述数据类型包括模拟值和离散值;所述基准值和步进值用于同值偏移量一起组成条目的实际值;所述最后记录时间为最后一条记录中值的实际时间。进一步的,所述步骤3)包括获取原始数据流程和写入数据流程;所述获取原始数据流程包括:根据数据的起止时间计算数据起止位置;采用内存映射文件方法映射数据文件;读取数据;所述写入数据流程包括:根据数据的起止时间计算数据起止位置;采用内存映射文件方法映射数据文件;写入数据。进一步的,所述读取数据包括直接读取原始数据和使用聚集操作读取数据。进一步的,所述直接读取原始数据的实现包括以下步骤:3-1-1)根据数据时间,计算开始点数据的索引;3-1-2)根据开始点数据的索引计算要映射的数据在文件中的偏移量,并将偏移量调整为内存分页大小的整数倍;3-1-3)将调整后的偏移量的值作为映射区的起始地址,映射数据文件,每次映射的大小为内存分页大小;3-1-4)依次对映射区中的每一个数据进行分析,具体方法如下:(1)令p=映射区的起始地址;(2)分析p地址存储的数据:如果p不在映射区内,将p作为映射区的起始地址,跳转至步骤3-1-3);如果p指示的数据时间>结束时间,跳入步骤3-1-5);如果p指示的数据点无值或该数据点周期校验错误,进入步骤(3);否则解析p指示的数据值、品质及时间后,进入步骤(3);(3)令p=p+4,跳入步骤(2);3-1-5)取消存储映射。进一步的,所述使用聚集操作读取数据的实现包括以下步骤:3-2-1)根据数据时间,计算开始点数据的索引;3-2-2)根据开始点数据的索引计算要映射的数据在文件中的偏移量,并将偏移量调整为内存分页大小的整数倍;3-2-3)将调整后的偏移量的值作为映射区的起始地址,映射数据文件,每次映射的大小为内存分页大小;3-2-4)依次对映射区中的每一个数据进行分析,具体方法如下:(1)令p=映射区的起始地址;(2)分析p地址存储的数据:如果p不在映射区内,将p作为映射区的起始地址,跳转至步骤3-2-3);如果p指示的数据时间>结束时间,跳入步骤3-2-5);如果p指示的数据点无值或该数据点周期校验错误,进入步骤(3);否则解析p指示的数据值、品质及时间后,进入步骤(3);(3)令p=p+4(字节),跳入步骤(2);3-2-5)遍历解析到的数据,并调用聚集函数进行计算,得到计算结果;3-2-6)取消存储映射。进一步的,所述写入数据采用数据插入接口函数实现,所述数据插入接口函数的实现包括以下步骤:3-3-1)将要写入的数据按时间排序;3-3-2)根据第一个数据时间创建映射区,映射数据文件;3-3-3)对每一个要写入的数据:如果数据索引不在映射区内,重新映射数据区;如果数据索引在映射区内,编码数据,写入;3-3-4)同步文件,取消存储映射。进一步的,采用时序数据存储方法存储的数据文件通过直接复制进行文件备份,通过修改服务配置中数据库文件的存放地址来实现数据库的迁移。与现有技术相比,本发明的有益效果是:(1)压缩率高该方法存储海量数据,预先分配存储空间防止产生磁盘碎片,对数据进行优化,比其他数据库系统具有更高的存储密度。(2)管理简单该方法在数据存储方式上采用每个数据对象一个数据库文件,可以方面的实现数据备份和迁移,方便数据的管理。(3)性能高效该方法通过存储映射方式对数据文件进行读写,比传统的先连接数据库、再查找表格遍历记录、最后返回查询结果的过程更加简单,从而提高访问效率。附图说明构成本申请的一部分的说明书附图用来提供对本申请的进一步理解,本申请的示意性实施例及其说明用于解释本申请,并不构成对本申请的不当限定。图1为时序数据存储方法数据存储的某一种情况;图2为时序数据存储方法数据读取的流程图;图3为时序数据存储方法数据写入的流程图;图4为插入数据界面显示图;图5为直接读取历史数据界面显示图;图6为调用聚集函数读取历史数据界面显示图。具体实施方式下面结合附图与具体实施例对本发明做进一步的说明。应该指出,以下详细说明都是例示性的,旨在对本申请提供进一步的说明。除非另有指明,本文使用的所有技术和科学术语具有与本申请所属
技术领域
的普通技术人员通常理解的相同含义。需要注意的是,这里所使用的术语仅是为了描述具体实施方式,而非意图限制根据本申请的示例性实施方式。如在这里所使用的,除非上下文另外明确指出,否则单数形式也意图包括复数形式,此外,还应当理解的是,当在本说明书中使用术语“包含”和/或“包括”时,其指明存在特征、步骤、操作、器件、组件和/或它们的组合。在本发明中,术语如“上”、“下”、“左”、“右”、“前”、“后”、“竖直”、“水平”、“侧”、“底”等指示的方位或位置关系为基于附图所示的方位或位置关系,只是为了便于叙述本发明各部件或元件结构关系而确定的关系词,并非特指本发明中任一部件或元件,不能理解为对本发明的限制。本发明中,术语如“固接”、“相连”、“连接”等应做广义理解,表示可以是固定连接,也可以是一体地连接或可拆卸连接;可以是直接相连,也可以通过中间媒介间接相连。对于本领域的相关科研或技术人员,可以根据具体情况确定上述术语在本发明中的具体含义,不能理解为对本发明的限制。正如
背景技术
所介绍的,现有技术中传统关系型数据库使用单一的数据库文件来存储数据,数据库文件随数据量的增加而变大,难以对特定数据备份和迁移的问题,为了解决如上的技术问题,本申请提供了一种基于时间节点的时序数据存储方法,本发明通过研究时序数据存储技术,依据面向对象的软件思想,将海量历史数据按照采样对象和采样指标的不同,分为不同的条目,并采用文件存储方式将海量历史数据按照一个文件存储一个条目的数据方式进行存储,该方法具备存取速度快、压缩率高、容易备份和迁移的特点。为了实现上述目的,本发明的技术方案如下:一种基于时间节点的时序数据存储方法,包括以下步骤:1)将海量历史数据按照采样对象和采样指标的不同,分为不同条目;2)将每个条目的数据采用文件存储方式存储为一个文件,其中每个条目的数据以固定的时间间隔依次存储,且在创建存储文件的同时预先分配数据存储空间;3)采用存储映射方式对文件中的数据进行读取和写入,其中数据起止位置根据数据起止时间进行计算。所述步骤2)中,每个条目对应一个唯一id,每个文件采用对应条目id进行命名。所述步骤2)中,每个所述文件都包括文件头和数据区,其中所述文件头包括总记录数、记录时间间隔、数据类型、基准值、步进值和最后记录时间。具体实施中,文件格式如表1所示:表1表1中,所述总记录数指示该条目的最大数据个数。所述记录时间间隔是指相邻两个记录的时间差,即采样间隔,具体的数据时间间隔可根据要求配置。具体实施中,值的位置索引从0开始,如:时间间隔为1分钟,第0个值的时间为2011年1月1日0时0分,则第1个值的时间为2011年1月1日0时1分,第2个值的时间为2011年1月1日0时2分,依次类推。(第0个值的时间为2011年1月1日0时0分是假设值,第一个值的具体时间要根据记录数推算);实际上,本发明遵循以下计算公式:值的位置索引=值的实际时间%总时间区间/记录时间间隔。时间修正量=值的实际时间%总时间区间%记录时间间隔*256/记录时间间隔。总时间区间=(总记录数-1)*记录时间间隔。其中,%是求余符号,*代表乘法符号,/为除法符号。从公式可以看出,数据存储的时候是通过求余来计算存储位置的,也就是说数据存储是循环的。可能出现如图1所示的存储情况。所述数据类型表示条目数据值的类型,其中1为模拟值,2为离散值;所述基准值和步进值用于同值偏移量一起组成条目的实际值,要求步进值不能小于基准值的1/65535,具体换算公式如下:实际值=基准值+值偏移量*步进值其中基准值取最小值,值偏移量为无符号定点数;且当数据类型为离散值时,不使用基准值和步进值这两项,即值偏移量为实际值;所述最后记录时间是指最后一条记录中值的实际时间。所述数据区中,一个数据记录使用4个字节来存储,其内容根据数据品质的不同而有所不同,具体如下所示:一个品质好的数据记录包含一个t(8位)、一个v(22位)、一个q(1位)和一个c(1位);一个品质一般的数据记录包含一个t(8位)、一个v(18位)、一个q(5位)和一个c(1位);一个品质坏的数据记录包含一个t(8位)、一个v(17位)、一个q(6位)和一个c(1位);其中,t是时间偏移量;v是值偏移量;q是品质;c是周期较验位。根据字节顺序的不同,数据记录中v,q,c的位置会有所不同。在小端字节顺序的系统中,数据记录的布局如下(vl表示v的低16位,vh表示v的高数据位,根据不同的数据品质,vh可能为1位、2位或6位):tvlcqvh在大端字节顺序的系统中,数据记录的布局如下(vh表示v的高16位,vl表示v的低数据位,根据不同的数据品质,vl可能为1位、2位或6位):tvhvlqc具体实施中,不同数据品质对应的q取值和v的位数表2所示。表2如图2和图3所示,所述步骤3)包括获取原始数据流程和写入数据流程;所述获取原始数据流程包括:根据数据的起止时间计算数据起止位置;采用内存映射文件方法mmap映射数据文件;读取数据;其中mmap的参数flags=map_shared,参数prot=prot_read;所述写入数据流程包括:根据数据的起止时间计算数据起止位置;采用内存映射文件方法mmap映射数据文件;写入数据;其中mmap的参数flags=map_shared。所述读取数据包括直接读取原始数据和使用聚集操作读取数据。如图2所示,所述直接读取原始数据的实现包括以下步骤:3-1-1)根据数据时间,计算开始点数据的索引,标记为start_index;3-1-2)根据开始点数据的索引计算要映射的数据在文件中的偏移量,标记为offset,所述偏移量的计算公式为:offset=512+start_index*4,并将偏移量offset通过getpagesize()函数调整为内存分页大小的整数倍,比如offset=7字节,内存分页大小为3字节,则将offset调整为6字节;3-1-3)将调整后的偏移量的值作为映射区的起始地址start_addr,映射数据文件,每次映射的大小为内存分页大小;3-1-4)依次对映射区中的每一个数据进行分析,具体方法如下:(1)令p=start_addr;(2)分析p地址存储的数据:如果p不在映射区内,将p作为映射区的起始地址,即令start_addr=p,跳转至步骤3-1-3),;如果p指示的数据时间>结束时间,跳入步骤3-1-5);如果p指示的数据点无值或该数据点周期校验错误,进入步骤(3);否则解析p指示的数据值、品质及时间后,进入步骤(3);(3)令p=p+4,跳入步骤(2);3-1-5)取消存储映射。所述使用聚集操作读取数据的实现包括以下步骤:3-2-1)根据数据时间,计算开始点数据的索引,标记为start_index;3-2-2)根据开始点数据的索引计算要映射的数据在文件中的偏移量,标记为offset,所述偏移量的计算公式为:offset=512+start_index*4,并将偏移量offset通过getpagesize()函数调整为内存分页大小的整数倍,比如offset=7字节,内存分页大小为3字节,则将offset调整为6字节;3-2-3)将调整后的偏移量的值作为映射区的起始地址start_addr,映射数据文件,每次映射的大小为内存分页大小;3-2-4)依次对映射区中的每一个数据进行分析,具体方法如下:(1)令p=start_addr;(2)分析p地址存储的数据:如果p不在映射区内,将p作为映射区的起始地址,即令start_addr=p,跳转至步骤3-2-3);如果p指示的数据时间>结束时间,跳入步骤3-2-5);如果p指示的数据点无值或该数据点周期校验错误,进入步骤(3);否则解析p指示的数据值、品质及时间后,进入步骤(3);(3)令p=p+4(字节),跳入步骤(2);;3-2-5)遍历解析到的数据,并调用聚集函数进行计算,得到计算结果;3-2-6)取消存储映射。如图3所示,所述写入数据采用数据插入接口函数实现,所述数据插入接口函数的实现包括以下步骤:3-3-1)将要写入的数据按时间排序;3-3-2)根据第一个数据时间创建映射区,映射数据文件;3-3-3)对每一个要写入的数据:如果数据索引不在映射区内,重新映射数据区;如果数据索引在映射区内,编码数据,写入;3-3-4)同步文件,取消存储映射。采用时序数据存储方法存储的数据文件通过直接复制进行文件备份,通过修改服务配置中数据库文件的存放地址来实现数据库的迁移。因为数据存储在许多的文件当中,每个文件都不会很大(例如每分钟一个数据,每个数据4个字节,3年的数据约3m大小),且每个数据文件之间是互相独立的,备份这个数据文件时,不会影响其他的数据文件使用。另外因为时序数据的特点,数据只会写入,不会修改,数据之间也没有依赖关系,因此可以在服务开启的情况下,直接复制数据文件来完成备份。备份好的数据文件放到相应目录下,然后修改服务配置中数据库文件的存放地址,修改成前面放置数据文件的目录,重启服务,即可实现数据库的迁移操作。实施例一,利用corba技术实现对数据文件的读取和写入,包括:1)安装历史数据服务程序,建立数据文件1,1,1,1(1,1,1,1是数据文件的名字也是条目的id);2)打开历史数据客户端,在insert选项卡中输入历史数据的item(数据文件的名字也是条目的id)、time(时间)、value(值)和quality(品质),点击insert,插入历史数据,如图4所示;3)在read选项卡中,输入item(数据文件的名字也是条目的id)、start(起始时间)和end(结束时间),点击read,可以看到刚才插入的数据,如图5所示;4)在read_process选项卡中,输入item(数据文件的名字也是条目的id)、start(起始时间)、end(结束时间)、processid(聚集函数,此处选择的是求最大值)和sampleinterval(采样间隔),点击read,可以看到刚才插入的数据,没有插入数据的时间点值为0,如图6所示。因为这个采样间隔(这里是60秒内)内只有这一个值,因此求得的最大值和插入的数据一样,其他采样间隔因为没有数据,求得的最大值为0。以上所述仅为本申请的优选实施例而已,并不用于限制本申请,对于本领域的技术人员来说,本申请可以有各种更改和变化。凡在本申请的精神和原则之内,所作的任何修改、等同替换、改进等,均应包含在本申请的保护范围之内。上述虽然结合附图对本发明的具体实施方式进行了描述,但并非对本发明保护范围的限制,所属领域技术人员应该明白,在本发明的技术方案的基础上,本领域技术人员不需要付出创造性劳动即可做出的各种修改或变形仍在本发明的保护范围以内。当前第1页12
当前第1页1 2 
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1