一种多源时间序列数据压缩存储方法
技术领域
本发明涉及一种数据压缩存储方法,尤其涉及一种多源时间序列数据压缩存储方法。
背景技术
对于电力、石油和连锁经营等大型企业,其分站或经营场所分布在全国、甚至全球各地,它们的每个分站或经营场所又包含许多的量测点,这些大型企业的数据中心,随时随刻都要对这些量测点产生的数据进行存储,需要的时候,还要从存储的众多数据中读取所需的数据。而这些工业数据有一个共同点:数据量比较大、数据来源比较广泛。通常,工业数据是各个量测点一段连续的量,其存储的数据都带有时间戳。工业数据具有明显的时间特性,其结构可以用VQT(Value、Quality、Timestamp,数据值、质量码、时间戳)来表示。同时工业数据是不断产生的,从而具有海量数据、以及来源广泛的特点。针对这些特点,怎样更快速地对数据进行存储,而且有效地利用存储空间是需要亟待解决的问题。
在实时数据库中,索引策略决定数据库快速定位数据的效率,索引可以提高数据存储和查询的效率。索引的作用相当于图书的目录,可以根据目录中的页码快速找到所需的内容。当表中有大量记录时,若要对表进行查询,第一种搜索信息方式是全表搜索,是将所有记录一一取出,和查询条件进行一一对比,然后返回满足条件的记录,这样做会消耗大量数据库系统时间,并造成大量磁盘I/O操作;第二种就是在表中建立索引,然后在索引中找到符合查询条件的索引值,最后通过保存在索引中的ROWID(相当于页码)快速找到表中对应的记录。
高效的索引不仅取决于索引策略,还取决于数据的存储方式,以及待存储的数据的特性。对于数量大、来源范围广的工业数据,采用通用的存储和索引方式存在以下问题:
由于工业数据是随着时间推移逐渐产生、进行存储的,即不同的数据源(量测点)均是陆续不规律地生成数据;传统的存储方式一般都是预先为每个量测点分配一较大的存储空间,在收到属于该量测点的数据时,将其存到对应空间。然而这种数据存储方式所需预留的存储空间极大,而每个量测点的数据量是不可预测的,在部分量测点没有数据需要存储、或存储数据比较少时,会造成存储空间的很大浪费。并且,在量测点的数量是成千上万、甚至更多的情况下,采用这种存储方式,所需要的索引时间依然较多,需要进一步改进。
为了节省存储空间提高存储效率,现有技术还会通过数据压缩和自定义存储结构的方式来提高存储效率,从而提高系统整体处理速度及性能。对实时数据库而言,数据压缩可以带来两方面的好处:一是,占用硬盘容量减小;二是,系统整体处理速度提高。目前,很多实时数据库的存储方案大多采用二级压缩技术。通常的具体做法是第一级采用有损压缩,如PI中使用的旋转门压缩算法,IH中使用的死区压缩算法;第二级采用无损压缩,针对具体的量测点数据项(VQT),对相邻的数据项之间的值(Value)、质量码(Quality)、时间戳(Timestamp)采用适当降低数据精度以及编码压缩等方法。在实际系统中,这类方法也存在制约因素,如压缩、解压的难度和时间消耗,数据压缩率与数据量大小有一定关系,即在一定量范围内,压缩率顺着数据量的增大而迅速增大,超过一定范围后,压缩率增大不明显。
另外,由于上述方法常结合自定义格式的文件来实现自定义结构的存储,自定义存储结构虽然能够提高存储速度降低存储空间,但其查询速度通常要比传统的关系型数据库慢,在一定程度上限制了数据读取的速度。
发明内容
本发明主要解决的技术问题是提供一种多源时间序列数据压缩存储方法,使得提高了数据压缩存储过程中的缓存效率和压缩效率,从而提高了数据整体存储效率,并且有效地节约了硬盘容量,加快了数据查询速度。
为了解决上述技术问题,本发明提供了一种多源时间序列数据压缩存储方法,多源时间序列数据来自不同部署对象的不同量测点,包含以下步骤:
根据各部署对象所包含的量测点数量,对各部署对象分组,将所包含量测点数量总和小于预设值的至少两个部署对象分为一组,将其余的每个部署对象分别分为一组;
对各部署对象组进行组内划分,以预设值为界限,每达到预设值数量的量测点划分为一内部组,对应一组内标识,其余不足预设值数量的量测点划分为一内部组;
在内存中为每个部署对象组中的每个内部组分配一个用于缓存的内存文件,并进行内存镜像处理;
在收到来自一部署对象辖下量测点的时间序列数据时,对该数据进行第一级有损压缩,并根据该量测点所属的部署对象组和内部组,找到该量测点对应的内存文件,将该压缩后的时间序列数据缓存到该内存文件中;
在内存文件写满或达到预设的时间限制时,对该内存文件进行第二级无损压缩,将压缩后的数据块存储到关系型数据库中。
作为进一步改进,第二级无损压缩为LZW压缩;和/或内存文件对应的存储空间为512K至2M之间;和/或预设的时间限制为30分钟。
作为进一步改进,内存文件的文件体由固定大小、连续的数据片组成,包含索引区和数据区,索引区中保存每个量测点在该内存文件中存储位置的索引,数据区中各连续的数据片对应不同的量测点,单个数据片保存同一量测点的数据。
作为进一步改进,将压缩后的时间序列数据缓存到内存文件中的步骤中,包含以下子步骤:
根据该数据所属量测点的本地标识找到该量测点对应的存储位置索引,如果该索引表示当前未在数据区中为该量测点分配数据片、或所分配的数据片已存满,则在数据区中为该量测点分配一空白数据片,所分配的数据片与该数据区中已分配的数据片连续,将量测点数据存储在该新分配的数据片中;反之,则将量测点的数据存储在该索引指示的数据片的相应位置;
如果在存储过程中,当前数据片已存满,则为该量测点新分配一数据片进行存储,所分配的数据片与该数据区中已分配的数据片连续。
作为进一步改进,该方法还包含以下步骤:
在接收到来自部署对象辖下量测点的时间序列数据之前,在内存文件的数据区中为该内存文件对应的内部组的所有量测点预分配一数据片进行数据缓存,在索引区中保存各量测点对应的数据片的位置;或者
在初次收到一量测点数据时,在内存文件数据区中为该量测点分配一数据片进行数据缓存,在索引区中保存该量测点对应的数据片的位置。
作为进一步改进,该方法还包含以下步骤:
为每个部署对象组的内部组中的各量测点分配唯一对应一本地标识,该本地标识为连续的序列;
索引区中以本地标识为顺序,依次保存每个量测点在该存储文件中存储位置的索引;
根据该数据所属量测点的本地标识找到该量测点对应的存储位置索引的步骤中,根据量测点的本地标识和单个索引的长度直接定位该量测点对应的索引位置、确定该量测点数据在该内存文件中的存储位置。
作为进一步改进,待存储的量测点数据包含:数据值、质量码、和时间戳;
数据片包含页面头和页面体,将量测点数据存储在数据片的步骤中,将量测点数据存储在数据片的页面体中;在将量测点数据存储在数据片中的步骤之后,将该数据片中保存的数据的起始时间和结束时间存储在该数据片的页面头中。
作为进一步改进,对内存文件进行第二级无损压缩的步骤中,以数据片为单位分别进行无损压缩,得到压缩后的各数据块;
将压缩后的数据块存储到关系型数据库中的步骤中,在关系型数据库中保存该数据块对应的量测点的标识、该数据块中所存储数据的起始时间、结束时间或相对于起始时间的时间跨度、数据块长度、和该压缩后的数据块。
作为进一步改进,将量测点的数据存储在该索引指示的数据片或新分配的数据片的步骤之后,还包含以下步骤:
提取该数据片的统计数据,统计数据至少包含以下之一:该数据片对应的量测点标识、该数据片中保存的数据的起始时间和结束时间、结束时间或相对于起始时间的时间跨度、数据片中保存的最大值、该最大值对应的时间、数据片中保存的最小值、该最小值对应的时间、数据片中保存的平均值、数据片中保存的值总和;
将压缩后的数据块存储到关系型数据库中的步骤中,还在关系型数据库中保存该数据块对应的数据片的统计数据。
作为进一步改进,该方法还包含以下步骤:在部署对象新增量测点时,优先将新增的量测点分配到其所属部署对象组中已有的不足预设值数量的内部组,超出预设值数量的部分量测点,划分为该部署对象组中一新内部组,对应一新存储文件。
本发明实施方式与现有技术相比,主要区别及其效果在于:根据各部署对象所包含的量测点数量,对各部署对象分组,将所包含量测点数量总和小于预设值的至少两个部署对象分为一组,将其余的每个部署对象分别分为一组;对各部署对象组进行组内划分,以预设值为界限,每达到预设值数量的量测点划分为一内部组,对应一组内标识,其余不足预设值数量的量测点划分为一内部组;在内存中为每个部署对象组中的每个内部组分配一个用于缓存的内存文件;在收到来自一部署对象辖下量测点的时间序列数据时,对该数据进行第一级有损压缩,并根据该量测点所属的部署对象组和内部组,找到该量测点对应的内存文件,将该压缩后的时间序列数据缓存到该内存文件中;在内存文件写满或达到预设的时间限制时,对内存文件进行第二级无损压缩,将压缩后的数据块存储到关系型数据库中。通过部署对象组和内部组的划分,能够快速找到每个量测点所对应的缓存文件,从而提高了量测点数据缓存的效率;通过将内存中自定义格式文件存储与硬盘上关系型数据库存储相结合,使得在实现快速缓存的同时,提高了后期数据查询速度;通过在将数据存储到关系型数据库之前,先进行分块的第二级无损压缩,使得在提高了压缩效率、节约存储空间的同时,为数据库后期的数据查询提供了便利。
通过为每个部署对象组的内部组中的各量测点分配一连续序列的本地标识,并且在索引区中以该本地标识为顺序,依次保存每个量测点在内存文件中存储位置的索引的方式,使得在进行数据缓存时,能够根据量测点本地标识快速定位每个量测点在内存文件中的存储位置,从而进一步提高了量测点数据缓存的效率。
按需为量测点分配数据片进行数据存储,每次分配的数据片很小,一般只有4K左右,在当前数据片存储满后再分配新的数据片,使得每个量测点对应的存储空间与其对应的数据量成正比,有效利用了内存存储空间,不会造成存储空间的浪费。
在将数据存储到关系型数据库之前,对内存文件进行第二级无损压缩时,以数据片为单位分别进行无损压缩,使得在用户进行数据查询时,可以从关系型数据库中直接检索到符合查询条件的数据块,将压缩的数据块直接传输到客户端进行解压读取,而无需先进行解压再判断是否符合查询条件,从而提高了数据读取速度。
附图说明
图1是本发明一较佳实施方式中的一种多源时间序列数据压缩存储方法的流程图。
具体实施方式
为使本发明的目的、技术方案和优点更加清楚,下面将结合附图对本发明的实施方式作进一步地详细描述。
本发明一较佳实施方式涉及一种多源时间序列数据压缩存储方法,多源时间序列数据来自不同部署对象的不同量测点,该方法的具体流程图如图1所示。
步骤101中,根据各部署对象所包含的量测点数量,对各部署对象分组。本步骤中,将所包含量测点数量总和小于预设值的两个或两个以上部署对象分为一组,将其余的每个部署对象分别分为一组。
举例而言,预设值为20000,部署对象1有量测点10000个,部署对象2有量测点9000个,部署对象3有量测点6000个,部署对象4有量测点7000个,部署对象5有量测点5000个,部署对象6有量测点30000个,部署对象7有量测点18000个……,就可以把部署对象1和部署对象2分为一组,即部署对象组1;部署对象3、部署对象4和部署对象5分为一组,即部署对象组2;部署对象6为一组,即部署对象组3;部署对象7为一组,即部署对象组4;……
步骤102中,对各部署对象组进行组内划分。本步骤中,以预设值为界限,每达到预设值数量的量测点划分为一内部组,对应一组内标识,其余不足预设值数量的量测点划分为一内部组。
针对步骤101中的例子,部署对象组1中共有19000个量测点,没有达到预设值20000个,故部署对象组1只能划分一个内部组,即部署对象组1-内部组1;同样,部署对象组2和部署对象组4也只能划分一个内部组,即部署对象组2-内部组1和部署对象组4-内部组1;部署对象组3中有30000个量测点,超过了预设值20000个,但少于40000个,故部署对象组3划分两个内部组,其中前20000个为一个内部组,即部署对象组3-内部组1,后10000个为一个内部组,即部署对象组3-内部组2。……
步骤103中,为每个部署对象组的内部组中的各量测点分配唯一对应一本地标识。本步骤中,为每个部署对象组的内部组中的各量测点分配的本地标识为连续的;各量测点标识由部署对象组标识、内部组标识和本地标识三部分构成,例如,部署对象组1的内部组1中有20000个量测点,则这20000个量测点的标识依次为:部署对象组1-内部组1-1,部署对象组1-内部组1-2,……,部署对象组1-内部组1-20000。
需要进一步说明的是,在部署对象新增量测点时,优先将新增的量测点分配到其所属部署对象组中已有的不足预设值数量的内部组,超出预设值数量的部分量测点,划分为该部署对象组中一新内部组。
步骤104中,在内存中为每个部署对象组中的每个内部组分配一个用于缓存的内存文件,并采用内存镜像文件来进行临时持久化处理,设置块缓存与镜像文件共用内存区。
需要进一步说明的是,各部署对象组中各内部组对应的内存文件的名称中包含该部署对象组和该内部组标识;内存文件的文件体由固定大小、连续的数据片组成,包含索引区和数据区,索引区中保存每个量测点在该内存文件中存储位置的索引,数据区中各连续的数据片对应不同的量测点,单个数据片保存同一量测点的数据。
针对步骤103,若部署对象中新增量测点时划分了新的内部组,则新的内部组对应新的内存文件。
步骤105中,在内存文件的数据区中为该内存文件对应的内部组的所有量测点预分配一数据片进行数据缓存。本步骤中,由于每个数据片的大小只有4K,所以即使部分量测点在一定时间内没有存入数据,也不会造成内存空间的浪费。
步骤106中,在索引区中保存各量测点对应的数据片的位置。本步骤中,索引区中以本地标识为顺序,依次保存每个量测点在该存储文件中存储位置的索引。
针对步骤103中的例子,量测点:部署对象组1-内部组1-1,部署对象组1-内部组1-2,……,部署对象组1-内部组1-20000在该存储文件索引区中的索引依次为:第一个8字节(即0至8字节),第二个8字节(即9至16字节),……,第20000个8字节(即159993至160000字节)。
在具体实施过程中,也可以在初次收到一量测点数据时,在内存文件数据区中为该量测点分配一数据片进行数据缓存,在索引区中保存该量测点对应的数据片的位置。
步骤107中,收到来自一部署对象辖下量测点的时间序列数据。该数据包含:数据值、质量码、和时间戳。
步骤108中,对该数据进行第一级有损压缩。
步骤109中,根据该量测点所属的部署对象组和内部组,找到该量测点对应的内存文件。
通过这种方式,使得在数据存储过程中能够快速找到对应的存储文件对数据进行存储,从而提高了数据存储效率。
步骤110中,根据该数据所属量测点的本地标识找到该量测点对应的存储位置索引。本步骤中,根据量测点的本地标识和单个索引的长度直接定位该量测点对应的索引位置、确定该量测点数据在该内存文件中的存储位置。
针对步骤106中的例子,本地标识为部署对象组1-内部组1-n(1≤n≤20000)的量测点索引开始位置为:索引区中第[(n-1)×8+1]个字节。比如,本地标识为部署对象组1-内部组1-30的量测点,其索引在索引区中的开始位置为:第[(30-1)×8+1]=233个字节。
通过这种方式,使得能够快速定位量测点在存储文件中的存储位置,从而进一步提高了数据存储效率。
步骤111中,将该压缩后的时间序列数据缓存到该内存文件中,并采用内存镜像的方式进行持久化处理。通过设置块缓存与镜像文件共用内存区,既简化缓存管理,又满足实时数据库对数据灾难恢复的设计需要,也兼顾系统的存储性能要求。
需要进一步说明的是,如果步骤110中量测点索引表示当前未在数据区中为该量测点分配数据片、或所分配的数据片已存满,则在数据区中为该量测点分配一空白数据片,所分配的数据片与该数据区中已分配的数据片连续,将量测点数据存储在该新分配的数据片中;反之,则将量测点的数据存储在索引指示的数据片的相应位置;如果在存储过程中,当前数据片已存满,则为该量测点新分配一数据片进行存储,所分配的数据片与该数据区中已分配的数据片连续。
本实施方式中,数据片包含页面头和页面体,将量测点数据存储在数据片的页面体中;在将量测点数据存储在数据片中后,将该数据片中保存的数据的起始时间和结束时间存储在该数据片的页面头中;而后,提取该数据片的统计数据,统计数据可以包含:该数据片对应的量测点标识、该数据片中保存的数据的起始时间和结束时间、结束时间或相对于起始时间的时间跨度、数据片中保存的最大值、该最大值对应的时间、数据片中保存的最小值、该最小值对应的时间、数据片中保存的平均值、数据片中保存的值总和等。
由于缓存的时间序列数据具有不稳定性,本实施方式对这些数据采用内存镜像的方式进行持久化处理。
步骤112中,判断内存文件是否写满或达到预设的时间限制。如果是,进入步骤113,如果不是,则进入步骤110。由于数据压缩率与数据量大小有一定关系,即在一定量范围内,压缩率顺着数据量的增大而迅速增大,超过一定范围后,压缩率增大不明显。考虑到实时数据库系统整体的性能需求,本实施方式中数据块的大小控制在512K-2M,数据块时间跨度控制在30分钟左右。
步骤113中,将内存文件拷入压缩区。
举例而言,步骤112中,内存文件对应的存储空间为1M,预设的时间限制为30分钟,则当内存文件已写入1M数据时,或内存文件虽然没有写入1M数据,但从该内存文件上次拷入压缩区已达到30分钟的时间限制,就会将该内存文件拷入压缩区。
通过这种方式,可以提高数据压缩存储过程中的压缩效率,从而又可以进一步提高数据存储效率,并且有效地节约硬盘容量。
步骤114中,以数据片为单位,对压缩区内的数据进行第二级无损压缩。
需要进一步说明的是,每个数据片的大小只有4K,拷入压缩区的内存文件中可能包含几百个数据片,第二级无损压缩以每个数据片为单位分别进行LZW压缩,得到压缩后的各数据块,即该内存文件中有多少个数据片,就会压缩成多少个数据块,压缩后各数据块信息的基本表如表1所示。
字段 |
数据类型 |
说明 |
ID |
UINT |
测点编码,ID+begintime为联合主键 |
begintime |
Timestamp |
块起始时间 |
timespan |
UINT |
相对于起始时间的时间跨度 |
length |
UINT |
数据块长度 |
chunk |
BLOB |
数据压缩块 |
表1——数据块基本表
通过这种方式,每个存储在数据库中的压缩块对应一个量测点的一个时间段的数据,使得用户读取数据时,可以根据查询条件,如量测点标识、以及待查询的时间段,直接找到符合条件的数据块,从而将压缩的数据块直接传输到客户端进行解压读取,而无需先进行解压再判断是否符合查询条件,从而提高了数据读取速度。
步骤115中,将压缩后的数据块存储到关系型数据库中。本步骤中,在关系型数据库中保存该数据块对应的量测点的标识、该数据块中所存储数据的起始时间、结束时间或相对于起始时间的时间跨度、数据块长度、和该压缩后的数据块、以及该数据块对应的数据片的统计数据,该统计数据信息具体如表2所示。
字段 |
数据类型 |
说明 |
ID |
UINT |
测点编码,ID+begintime为联合主键 |
begintime |
Timestamp |
块起始时间 |
timespan |
UINT |
相对于起始时间的时间跨度 |
maxValue |
double |
区间最大值 |
maxTime |
Timestamp |
最大值时间 |
minValue |
double |
区间最小值 |
minTime |
Timestamp |
最小值时间 |
avgValue |
double |
区间平均值 |
totalValue |
double |
区间总和 |
表2——数据块统计表
虽然通过参照本发明的某些优选实施方式,已经对本发明进行了图示和描述,但本领域的普通技术人员应该明白,可以在形式上和细节上对其作各种改变,而不偏离本发明的精神和范围。