发明内容
本发明主要解决的技术问题是提供一种多源数据存储及读取方法,使得在对数据量比较大、来源比较广泛的数据进行存储时,能够快速找到对应的存储文件进行存储,并且几乎不浪费存储空间;在读取所需数据时,能够在众多的存储文件中快速找到所要读取数据所在的存储文件和存储位置,对数据进行读取。
为了解决上述技术问题,本发明提供了一种多源数据存储方法,多源数据来自不同部署对象的不同量测点,包含以下步骤:
对部署对象进行分组,形成各部署对象组,并对各部署对象组包含的量测点进行划分,形成内部组;
为每个部署对象组的内部组中的各量测点分配唯一对应的本地标识;
每个部署对象组中的每个内部组包含一个或多个存储文件,存储文件包含文件头和文件体,文件体由固定大小、连续的数据片组成,该文件体中包含索引区和数据区,索引区中保存每个量测点在该存储文件中存储位置的索引;
在收到来自一部署对象辖下量测点的数据时,根据该量测点所属的部署对象组和内部组,找到该量测点对应的存储文件,根据该量测点的本地标识找到该量测点对应的存储位置索引,如果该索引表示当前未在数据区中为该量测点分配数据片、或所分配的数据片已存满,则在数据区中为该量测点分配一空白数据片,所分配的数据片与该数据区中已分配的数据片连续,将量测点数据存储在该新分配的数据片中;反之,则将量测点的数据存储在该索引指示的数据片的相应位置;
如果在存储过程中,当前数据片已存满,则为该量测点新分配一数据片进行存储,所分配的数据片与该数据区中已分配的数据片连续。
作为进一步改进,对部署对象进行分组,形成各部署对象组的方式为:根据各部署对象所包含的量测点数量,对各部署对象分组,将所包含量测点数量总和小于预设值的两个或以上部署对象分为一组,将其余的每个部署对象分别分为一组;
对各部署对象组包含的量测点进行划分,形成内部组的方式为:对各部署对象组进行组内划分,以预设值为界限,每达到预设值数量的量测点划分为一内部组,对应一组内标识,其余不足预设值数量的量测点划分为一内部组。
作为进一步改进,为每个部署对象组的内部组中的各量测点分配唯一对应的本地标识的步骤中,本地标识为连续的;
索引区中以本地标识为顺序,依次保存每个量测点在该存储文件中存储位置的索引;
根据该量测点的本地标识找到该量测点对应的存储位置索引的步骤中,由该量测点的本地标识和单个索引的长度直接定位该量测点对应的索引位置。
作为进一步改进,量测点在存储文件中存储位置的索引包含:该量测点在该存储文件中保存的第一条记录的指针和最后一条记录的指针;
将量测点的数据存储在该索引指示的数据片的相应位置的步骤中,根据最后一条记录的指针进行存储。
作为进一步改进,待存储的量测点数据包含:数据值、质量码、和时间戳;
数据片包含页面头和页面体,将量测点数据存储在数据片的步骤中,将量测点数据存储在数据片的页面体中;将量测点数据存储在数据片中的步骤之后,将该数据片中保存的数据的起始时间和结束时间存储在该数据片的页面头中。
作为进一步改进,页面头中还保存有本量测点对应的上一数据片的页面号和/或下一数据片的页面号。
作为进一步改进,各部署对象组中各内部组对应的存储文件的名称中包含该部署对象组和该内部组标识;
根据该量测点所属的部署对象组和内部组,找到该量测点对应的存储文件的步骤中,查找包含该部署对象组标识和该内部组标识名称的文件。
作为进一步改进,各部署对象组中各内部组对应的存储文件的名称中还包含:该存储文件所保存数据的起始时间和结束时间;
在部署对象组中内部组对应的存储文件存满时,为该内部组分配新的存储文件,新分配的存储文件的名称中同样包含该部署对象组和该内部组标识,以及所保存数据的起始时间和结束时间。
作为进一步改进,该方法还包含以下步骤:在部署对象新增量测点时,优先将新增的量测点分配到其所属部署对象组中已有的不足预设值数量的内部组,超出预设值数量的部分量测点,划分为该部署对象组中一新内部组,对应一新存储文件。
本发明还提供了一种多源数据读取方法,包含以下步骤:
在需要读取一个或多个部署对象中一个或多个量测点某一时间段的数据时,根据该部署对象所属的部署对象组、和该量测点所属的内部组,找到该部署对象组和该内部组对应的所有存储文件;
将待查找的时间段和存储文件名称中包含的起始时间和结束时间进行比较,选择相匹配的存储文件;
在匹配的存储文件中,根据该量测点的本地标识和单个索引长度定位该量测点对应的存储位置索引,找到该量测点对应的第一个数据片,根据数据片中保存的本量测点对应的上一数据片的页面号和/或下一数据片的页面号,确定该量测点对应的其他数据片;
将各数据片中保存的数据起始时间和结束时间信息与待查找的时间段相比较,读取所需的数据。
本发明实施方式与现有技术相比,主要区别及其效果在于:对于来自不同部署对象的不同量测点的多源数据,通过对部署对象进行分组,形成各部署对象组,并对各部署对象组包含的量测点进行划分,形成内部组;每个内部组包含一个或多个存储文件,其文件体由固定大小、连续的数据片组成,包含索引区和数据区,索引区中保存每个量测点在该存储文件中存储位置的索引;在收到来自一部署对象辖下量测点的数据时,根据该量测点所属的部署对象组和内部组,找到该量测点对应的存储文件,根据该量测点的本地标识找到该量测点对应的存储位置索引,如果该索引表示当前未在数据区中为该量测点分配数据片、或所分配的数据片已存满,则在数据区中为该量测点分配一空白数据片,所分配的数据片与该数据区中已分配的数据片连续,将量测点数据存储在该新分配的数据片中;反之,则将量测点的数据存储在该索引指示的数据片的相应位置;如果在存储过程中,当前数据片已存满,则为该量测点新分配一数据片进行存储,所分配的数据片与该数据区中已分配的数据片连续。本发明通过划分部署对象组和内部组的方式,使得进行量测点数据存储/读取时能够快速找到存储数据所在的文件,从而加快了数据存储及读取速率;通过将量测点本地标识和其索引位置依次对应的方式,可以直接定位量测点索引的位置,无需对索引位置进行其他映射操作,从而进一步加快了数据存储速率;通过为量测点动态分配数据片的方式,使得存储空间得到了充分利用,不会造成存储空间的浪费。
具体实施方式
为使本发明的目的、技术方案和优点更加清楚,下面将结合附图对本发明的实施方式作进一步地详细描述。
本发明第一实施方式涉及一种多源数据存储方法,多源数据来自不同部署对象的不同量测点,其具体流程图如图1所示。
步骤101中,对部署对象进行分组,形成各部署对象组;具体方式为:根据各部署对象所包含的量测点数量,对各部署对象分组,将所包含量测点数量总和小于预设值的至少两个部署对象分为一组,将其余的每个部署对象分别分为一组;为这些部署对象组命名为:部署对象组1,部署对象组2,......
步骤102中,对各部署对象组包含的量测点进行划分,形成内部组;具体方式为:对各部署对象组进行组内划分,以预设值为界限,每达到预设值数量的量测点划分为一内部组,对应一组内标识,其余不足预设值数量的量测点划分为一内部组。为这些部署对象组中的内部组命名为:部署对象组1-内部组1,部署对象组1-内部组2,......,部署对象组2-内部组1,部署对象组2-内部组2,......
需要进一步说明的是,在部署对象新增量测点时,优先将新增的量测点分配到其所属部署对象组中已有的不足预设值数量的内部组,超出预设值数量的部分量测点,划分为该部署对象组中一新内部组。
步骤103中,为每个部署对象组的内部组中的各量测点分配唯一对应的本地标识。
本步骤中,为每个部署对象组的内部组中的各量测点分配的本地标识为连续的;每个量测点唯一对应一量测点标识,由部署对象组标识、内部组标识和本地标识三部分构成,例如,部署对象组1的内部组1中有20000个量测点,则这20000个量测点的标识依次为:部署对象组1-内部组1-1,部署对象组1-内部组1-2,......,部署对象组1-内部组1-20000。
步骤104中,为每个部署对象组中的每个内部组预分配一个存储文件。
针对步骤102,若部署对象中新增量测点时划分了新的内部组,则新的内部组对应新的存储文件。
需要进一步说明的是,各部署对象组中各内部组对应的存储文件的名称中包含该部署对象组和该内部组标识、以及该存储文件所保存数据的起始时间和结束时间;即存储文件的名称格式为:部署对象组(一级文件名)+内部组(二级文件名)+文件起始时间~文件结束时间(三级文件名),其中,文件起始时间~文件结束时间是在存储数据过程中自动更新的。
在部署对象组中内部组对应的存储文件存满时,为该内部组分配新的存储文件,新分配的存储文件的名称中同样包含该部署对象组和该内部组标识,以及所保存数据的起始时间和结束时间。
针对步骤102中的例子,为部署对象组1中的内部组1分配的存储文件名称为“部署对象组1-内部组1-T1~T2”,T1为该文件保存数据的起始时间,T2为该文件保存数据的结束时间,在该文件存储数据的过程中,T1、T2会自动更新;当该存储文件存满后,为部署对象组1中的内部组1分配新的存储文件“部署对象组1-内部组1-T3~T4”,以此类推。
因此,对于每个部署对象组中的每个内部组来说,它们对应一个或者多个一级文件名和二级文件名不变的的存储文件(一级文件名为部署对象组标识、二级文件名为内部组标识)。
通过这种文件命名方式,使得进行量测点数据存储/读取时能够快速找到存储数据所在的文件,从而加快了数据存储及读取速率。
本实施方式中,存储文件的结构图如图3所示,包含文件头和文件体;其中文件头由固定长度的数据块构成,为64字节。具体如下:
数据类型 |
变量名 |
变量长度(字节) |
含义 |
uint16 |
typeId |
2 |
文件类型ID |
uint8 |
version |
1 |
文件版本ID |
uint8 |
reserve |
1 |
|
uint16 |
itemBaseNo |
2 |
索引区起始页面 |
uint32 |
itemCount |
4 |
索引区包含索引个数 |
uint32 |
pageSize |
4 |
数据页面大小 |
uint32 |
pageCount |
4 |
数据页面总数 |
uint32 |
itemPages |
4 |
索引区包含页面个数 |
uint32 |
dataPages |
4 |
数据区包含页面个数 |
uint32 |
currPagePos |
4 |
当前数据页面 |
uint64 |
begin_time |
8 |
文件开始记录时间 |
uint64 |
end_time |
8 |
文件结束记录时间 |
uint16 |
checksum |
2 |
校验和 |
文件体由固定大小、连续的页面组成,包含索引区和数据区。索引区中保存每个量测点在该存储文件中存储位置的索引,包含:该量测点在该存储文件中保存的第一条记录的指针和最后一条记录的指针。
本实施方式中索引区由40片大小为4096字节(4KB)的页面组成,每个量测点的索引为8个字节,每个数据片可以保存4096÷8=512个量测点的索引。整个索引区可以保存512×40=20480个量测点的索引。对于每个量测点的索引,前4个字节为第一条记录指针,后4个字节为最后一条记录指针。
需要进一步说明的是,在索引区中以本地标识为顺序,依次保存每个量测点在该存储文件中存储位置的索引;针对步骤103中的例子,量测点:部署对象组1-内部组1-1,部署对象组1-内部组1-2,......,部署对象组1-内部组1-20000在该存储文件索引区中的索引依次为:第一个8字节(即0至8字节),第二个8字节(即9至16字节),......,第20000个8字节(即159993至160000字节)。通过这种方式,可以直接定位量测点索引的位置,无需对索引位置进行其他映射操作,从而进一步加快了数据存储速率。
数据区由32728片大小为4096字节(4KB)的数据片组成。每个数据片包含页面头和页面体。页面头为16字节,页面体中每个量测点数据的长度为16字节。每个数据片中最多保存(4096-16)÷16=255个量测点数据。
其中,页面头用于记录该数据片的索引等信息,包含:该数据片相对文件头时间的起始时间、相对文件头时间的结束时间、当前页面号、数据片的当前记录数、以及本量测点对应的上一数据片的页面号和/或下一数据片的页面号;页面体用于保存量测点数据,包含:数据值、质量码、和时间戳。
步骤105中,收到来自一部署对象辖下量测点的数据。
步骤106中,根据该量测点所属的部署对象组和内部组,找到该量测点对应的存储文件。本步骤中,查找包含该部署对象组标识和该内部组标识名称的文件。
步骤107中,根据该量测点的本地标识找到该量测点对应的存储位置索引。
本步骤中,由该量测点的本地标识和单个索引的长度直接定位该量测点对应的索引位置。针对步骤104中的对于索引区的说明,本地标识为部署对象组1-内部组1-n(1≤n≤20000)的量测点索引开始位置为:索引区中第[(n-1)×8+1]个字节。比如,本地标识为部署对象组1-内部组1-30的量测点,其索引在索引区中的开始位置为:第[(30-1)×8+1]=233个字节。
通过这种方式,可以直接定位量测点索引的位置,无需对索引位置进行其他映射操作,从而进一步加快了数据存储速率。
步骤108中,判断该索引是否表示已在数据区为该量测点分配数据片。如果已分配数据片,则进入步骤109;如果没有分配数据片,则进入步骤112。
需要进一步说明的是,在具体实施过程中,也可以为每个量测点预分配一个数据片,在收到量测点数据时,直接存储到对应的数据片中,由于每个数据片的大小只有4K,即使有部分量测点在一定时间内没有进行数据存储,也不会造成存储空间明显的浪费。
步骤109中,找到该量测点索引最后一条数据记录指针指示的数据片。
步骤110中,判断所分配的数据片是否已存满;如果已存满,则进入步骤112;如果没有存满,则进入步骤111。
步骤111中,将量测点的数据存储在该索引中最后一条记录的指针指示的的相应位置,更新该量测点的索引。
需要进一步说明的是,如果在存储过程中,当前数据片已存满,则为该量测点新分配一数据片进行存储,所分配的数据片与该数据区中已分配的数据片连续。
步骤112中,在数据区中为该量测点分配一空白数据片;本步骤中所分配的数据片与该数据区中已分配的数据片连续。
步骤113中,将量测点数据存储在该新分配的数据片中,更新该量测点的索引。
需要进一步说明的是,将量测点的数据存储在数据片中后,该数据片中保存的数据的起始时间和结束时间存储在该数据片的页面头中。
通过这种为量测点动态分配数据片方式,使得存储空间得到了充分利用,不会造成存储空间的浪费。
本发明第二实施方式涉及一种多源数据读取方法,其具体流程图如图2所示。
步骤201中,收到需要读取一个或多个部署对象中一个或多个量测点某一时间段的数据的请求。本实施方式中,用户查询量测点的数据时,需要输入量测点的标识(由部署对象组标识、内部组标识和本地标识构成)、所查询数据的起始时间和结束时间。
步骤202中,根据该量测点所属的部署对象组、和内部组,找到该部署对象组和该内部组对应的所有存储文件。
通过这种方式,在读取所需数据时,能够在众多的存储文件中快速找到所要读取数据所在的存储文件,提高了读取数据的效率。
步骤203中,判断待查找的时间段和存储文件名称中包含的起始时间和结束时间是否有重叠或部分重叠;如果有,则进入步骤204;如果没有,则结束查找。
步骤204中,根据比较结果,选择相匹配的存储文件。本步骤中,相匹配的存储文件可能为一个,也可能为两个或以上。
举例而言,部署对象组1-内部组1按文件起始时间从早到晚有三个存储文件:部署对象组1-内部组1-T1~T2、部署对象组1-内部组1-T3~T4,和部署对象组1-内部组1-T5~T6。现要查询部署对象组1-内部组1-量测点100在时间段t1~t2内的数据,如果T1≦t2≦T2,则相匹配的存储文件只有部署对象组1-内部组1-T1~T2;如果T3≦t1≦t2≦T4,则相匹配的存储文件只有部署对象组1-内部组1-T3~T4;如果T5≦t1≦T6,则相匹配的存储文件只有部署对象组1-内部组1-T5~T6;如果t1≦T2且T3≦t2≦T4,则相匹配的存储文件为部署对象组1-内部组1-T1~T2、和部署对象组1-内部组1-T3~T4;如果T3≦t1≦T4且t2≧T5,则相匹配的存储文件为部署对象组1-内部组1-T3~T4、和部署对象组1-内部组1-T5~T6;如果t1≦T2且t2≧T5,则相匹配的存储文件为部署对象组1-内部组1-T1~T2、部署对象组1-内部组1-T3~T4、和部署对象组1-内部组1-T5~T6。
需要进一步说明的是,当t2<T1、或t1>T6时,是没有相匹配的存储文件的,直接结束查找。
步骤205中,在匹配的存储文件中,根据该量测点的本地标识和单个索引长度定位该量测点对应的存储位置索引。本步骤中,定位该量测点对应的存储位置索引的方法和第一实施方式中步骤107中相同。
通过这种方式,能够快速定位量测点数据在存储文件中存储位置,从而进一步提高了读取数据的效率。
步骤206中,判断该存储文件中该量测点的索引记录是否为空。如果是,则结束该文件中该量测点的查找;如果不是,则进入步骤207。
步骤207中,根据索引中第一条记录指针,找到该量测点对应的第一个数据片。
步骤208中,判断待查询时间段与该数据片保存数据的起止时间是否完全不重合;如果是,则进入步骤210;如果不是,则进入步骤209。
针对步骤204中的例子,部署对象组1-内部组1-量测点100对应的该数据片保存数据的起始时间为x1,结束时间为x2;待查询时间段与该数据片保存数据的起止时间完全不重合的情况有两种:(1)t2<x1;(2)t1>x2。
步骤209中,读取相重合时间段内的数据。
步骤210中,判断待查找的时间段的结束时间是否晚于该数据片保存数据的结束时间;如果是,则进入步骤211;如果不是,则结束查找。
针对步骤208中的例子,在待查询时间段与第一片数据片保存数据的起止时间完全不重合的情况下(t2<x1或者t1>x2),如果t2>x2,则说明待查询时间段与该数据片保存数据的起止时间完全不重合的情况为第二种:t1>x2,这种情况说明当前数据片没有保存该量测点在待查找时间段内的数据,但下一数据片可能保存了该量测点在待查找时间段内的数据;如果t2≦x2,说明待查询时间段与该数据片保存数据的起止时间完全不重合的情况为第一种:t2<x1,这种情况说明该量测点在待查询时间段内没有保存数据,结束查找。
步骤211中,判断该数据片是否有对应的下一数据片。如果有,则进入步骤212;如果没有,则结束查找。
步骤212中,根据该数据片中保存的下一数据片的页面号,找到下一数据片。然后回到步骤208,继续循环判断查找。
本实施方式中,如果步骤204中匹配的存储文件为两个或以上,可以从开始时间最早的存储文件开始按步骤205到步骤212逐个文件进行查找,也可以对所有匹配的存储文件按步骤205到步骤212进行并行查找。比如,相匹配的存储文件为部署对象组1-内部组1-T1~T2、部署对象组1-内部组1-T3~T4、和部署对象组1-内部组1-T5~T6,则可以先从文件部署对象组1-内部组1-T1~T2开始进行查找,待其查找结束后,再从文件部署对象组1-内部组1-T3~T4进行查找,待其查找结束后,最后从文件部署对象组1-内部组1-T5~T6进行查找;也可以从文件部署对象组1-内部组1-T1~T2、部署对象组1-内部组1-T3~T4、和部署对象组1-内部组1-T5~T6并行开始进行查找。
虽然通过参照本发明的某些优选实施方式,已经对本发明进行了图示和描述,但本领域的普通技术人员应该明白,可以在形式上和细节上对其作各种改变,而不偏离本发明的精神和范围。