一种基于回归分析的时序数据索引方法
技术领域
本发明涉及一种数据存贮及索引技术,具体来说是一种基于回归分析的时序数据索引方法。
背景技术
时序数据是指同一指标按时间顺序记录的数据。随着大数据时代的到来,计算机技术迅速发展并被广泛应用于工业自动化领域。由于工业自动化领域的控制、管理水平的提升以及规模的不断扩大,越来越多的时序数据正被更广范围、更大密度的采集存贮,形成TB级甚至 PB级的海量时序数据。如何在这些海量时序数据中快速检索出用户需要的数据,是时序数据块亟待解决的主要问题。
为了实现时序数据的快速查询,目前普遍采用B-Tree索引、 B+Tree索引等技术,这些索引方法在数据量不大的情况下效率较好,能够满足时序数据快速检索的需求,但随着时序数据存贮量的不断增长,查询效率会逐渐下降。在时序数据达到TB级甚至更大的级别的时候,传统索引方法无论在存贮空间还是查询效率方面,都难以满足需求。
发明内容
本发明提出了一种基于回归分析的时序数据索引方法,其目的是:(1)提高海量时序数据的查询速度,避免由于存贮量的快速增长而出现查询效率降低的情况;(2)减少时序数据的空间占用。
一种基于回归分析的时序数据索引方法,步骤为:
所述时序数据依次存贮在数据块中,每个数据块只存贮一个数据列的时序数据,当前数据块存满后创建新的数据块继续存放;
每新建一个数据块时,对应该数据块新建一个结构体变量,结构体变量中记录数据块的全局编号、数据块中时序数据的最小时间以及最大时间;数据块中每存入一条新记录时,更改结构体变量中的最大时间值;
每存贮一个新的数据列的时序数据时,对应该数据列新建一个有序的容器并定义一个回归方程;
所述回归方程的自变量为结构体变量中的最小时间,因变量为对应的结构体变量序号;
同一数据列所对应的结构体变量均存放在该数据列所对应的容器中,每次新建结构体变量后,将新增结构体变量添加到对应的容器中;容器中每次新增结构体变量后,依据当前所包含的各结构体变量的最小时间及序号,重新构造所述的回归方程;
执行上述步骤直至存贮过程完成;
查询时,将查询条件中的起始时间和终止时间代入查询目标数据列所对应的回归方程,确定目标数据所在的数据块,然后从数据块中提取起始时间和终止时间之间的数据。
进一步的,当数据块中存贮的记录条数为1时,把当前存入的时序数据的时间作为对应的结构体变量的最小时间值;当数据块中存贮的记录条数大于1时,把当前存入的时序数据的时间作为对应的结构体变量的最大时间值。
进一步的,使用最小二乘法构造回归方程。
进一步的,第i个数据列所对应的回归方程F[i]为y=ax+b,式中:a、b为根据各结构体变量的最小时间及序号进行拟合所求得的参数值,y为时间值,x为根据时间值y求得的结构体变量序号的计算值。
进一步的,a、b初始值设为0。
进一步的,构造回归方程的步骤为:
1)按序获取容器中所有结构体变量中的序号,得到矢量 其中xj为容器中第j个结构体变量的序号,n为容器中最后一个结构体变量的序号;并且,按序获取容器中所有结构体变量中的最小时间值,得到矢量其中yj为容器中第j个结构体变量中记录的最小时间值;
2)计算
3)计算
4)计算
5)计算
进一步的,查询的具体步骤为:
1)将查询条件中的起始时间记为start_t,终止时间记为end_t;
2)将start_t作为自变量带入回归方程,求得的因变量向下取整记为x_min,将序号x_min对应的结构体变量中的最小时间值记为 start_min_t、最大时间值记为start_max_t;并且,将end_t作为自变量带入回归方程,求得的因变量向下取整记为x_max,将序号x_max对应的结构体变量中的最小时间值记为end_min_t、最大时间值记为end_max_t;
3)将“start_t在start_min_t与start_max_t之间”作为判断准则A:
如果start_t<start_min_t,则x_min=x_min-1,然后重新计算 start_min_t与start_max_t,再次判断准则A,直至满足准则A,或 x_min与容器中第一个结构体变量的序号为止;
如果start_t>start_max_t,则x_min=x_min+1,然后重新计算 start_min_t与start_max_t,再次判断准则A,直至满足准则A,或 x_min与容器中最后一个结构体变量的序号相等为止;
将“end_t在end_min_t与end_max_t之间”作为判断准则B:
如果end_t<end_min_t,则x_max=x_max-1,然后重新计算 end_min_t与end_max_t,再次判断准则B,直至满足准则B,或x_max 与容器中第一个结构体变量的序号相等为止;
如果end_t>end_max_t,则x_max=x_max+1,然后重新计算 end_min_t与end_max_t并再次判断准则B,直至满足准则B,或x_max 与容器中最后一个结构体变量的序号相等为止;
4)从x_min至x_max所对应的数据块中提取符合查询条件的时序数据。
相对于现有技术,本发明具有以下积极效果:(1)本发明结合时序数据时序性、规律性的特点,利用时序数据时间关键字与存贮数据块号的线性关系,采用回归方程索引时序数据,代替传统的索引方法,提高了时序数据的查询效率,并且不会因为时序数据存贮量的快速增长而著降低查询效率;(2)本发明通过一个回归方程和一个自定义容器实现索引的存贮,与传统索引方法相比,显著降低了空间占用;(3)本发明的索引数据,即回归方程和容器中的数据,可以利用数据块重新计算生成,因此在灾难恢复时相比传统方法更容易快速恢复。
附图说明
图1为采用最小二乘法拟合出的回归方程的示意图。
具体实施方式
下面详细说明本发明的技术方案:
一种基于回归分析的时序数据索引方法,用于不同测点的时序数据的存贮和索引查询。
首先进行数据的存贮:
将时序数据依次存贮在数据块中,每个数据块只存贮一个数据列即同一个测点的时序数据,当前数据块存满后创建新的数据块继续存放。
每新建一个数据块时,对应该数据块新建一个结构体变量,结构体的定义为:
struct tIndex{
unsigned int g_no;
unsigned int max_t
unsigned int min_t;
};
结构体变量中记录对应的数据块的全局编号g_no、数据块中时序数据的最小时间min_t以及最大时间max_t;数据块中每存入一条新记录时,需要更改结构体变量中的最大时间值max_t:当数据块中存贮的记录条数为1时,把当前存入的时序数据的时间作为对应的结构体变量的最小时间值min_t;当数据块中存贮的记录条数大于1时,把当前存入的时序数据的时间作为对应的结构体变量的最大时间值 max_t。
每存贮一个新的测点的时序数据时,对应该测点新建一个有序的容器vector<struct tIndex>B[i],并定义一个回归方程F[i],i 表示测点的ID号。所述回归方程的自变量为结构体变量中的最小时间min_t,因变量为对应的结构体变量序号,该序号从0开始编号,显然最大值为B[i].size()-1。
优选的,回归方程F[i]为y=ax+b,用于拟合各数据块最小时间值与数据块序号之间的线性关系。其中,a、b为根据各结构体变量的最小时间min_t及序号进行拟合所求得的参数值,初始值均为0; y为自变量时间值,x为因变量,即根据时间值y求得的结构体变量序号的计算值。
同一测点i所对应的结构体变量均存放在该测点所对应的容器 B[i]中作为其元素,每次新建结构体变量后,将新增结构体变量添加到B[i]中;容器B[i]中每次新增结构体变量后,依据当前所包含的各结构体变量的最小时间及序号,重新构造线性回归方程。如果B[i] 只有一个结构体变量,此时无法计算回归方程,a、b保留初始值0。
回归方程使用最小二乘法构造:
1)按序获取容器中所有结构体变量中的序号,得到矢量 其中xj为容器中第j个结构体变量的序号,n为容器中最后一个结构体变量的序号;并且,按序获取容器中所有结构体变量中的最小时间值,得到矢量其中yj为容器中第j个结构体变量中记录的最小时间值min_t;
2)计算
3)计算
4)计算
5)计算
执行上述步骤直至存贮过程完成。某次拟合后的回归方程如图1 所示。
查询时,将查询条件中的起始时间和终止时间代入查询目标测点所对应的回归方程,确定目标数据所在的数据块,然后从数据块中提取起始时间和终止时间之间的数据。具体方法为:
首先,查询目标测点对应的回归方程中的a、b是否为0,如果为0,则查看当前容器中是否只有一个结构体变量:如果只有一个结构体变量,则查询其所对应的数据块;如果没有结构体变量,则返回无记录结果。如果a、b不为0,说明容器中包含两个以上的结构体变量,需要借助线性回归方程进行查询:
1)将查询条件中的起始时间记为start_t,终止时间记为end_t;
2)将start_t作为自变量y带入回归方程,求得的因变量x向下取整记为x_min,将序号x_min对应的结构体变量中的最小时间值记为start_min_t、最大时间值记为start_max_t;并且,将end_t 作为自变量y带入回归方程,求得的因变量x向下取整记为x_max,将序号x_max对应的结构体变量中的最小时间值记为end_min_t、最大时间值记为end_max_t;
3)将“start_t在start_min_t与start_max_t之间”作为判断准则A:
如果start_t<start_min_t,则x_min=x_min-1,然后重新计算 start_min_t与start_max_t,再次判断准则A,直至满足准则A,或 x_min=0为止;
如果start_t>start_max_t,则x_min=x_min+1,然后重新计算 start_min_t与start_max_t,再次判断准则A,直至满足准则A,或 x_min=B[i].size()-1为止;
将“end_t在end_min_t与end_max_t之间”作为判断准则B:
如果end_t<end_min_t,则x_max=x_max-1,然后重新计算 end_min_t与end_max_t,再次判断准则B,直至满足准则B,或x_max=0 为止;
如果end_t>end_max_t,则x_max=x_max+1,然后重新计算 end_min_t与end_max_t并再次判断准则B,直至满足准则B,或 x_max=B[i].size()-1为止;
4)依据结构体变量中的数据块编号g_no,从x_min至x_max所对应的数据块中提取符合查询条件的时序数据。如果没有符合条件的时序数据,返回错误信息。