发明内容
针对相关技术中在处理大量的历史行为数据时查询速度过慢,导致数据库压力过大、服务器性能差的问题,而提出本申请,为此,本申请的主要目的在于提供一种数据的处理方法、装置及***,以解决上述问题。
为了实现上述目的,根据本申请的一个方面,提供了一种数据的处理方法,该方法包括:服务器接收客户端输出的一组或多组操作数据;服务器按照预设的时间窗口长度对每组操作数据中的数据进行筛选,以获取一组或多组备份数据;将所有的备份数据保存至服务器的内存中。
进一步地,每组备份数据的属性包括:关键字、数据字段、时间窗口以及计算函数,且每组备份数据对应唯一的一类计算函数,计算函数按照类型划分包括普通算术函数、比较函数以及统计函数,其中,在将所有的备份数据保存至服务器的内存中之后,方法还包括:接收用于查询的查询条件,查询条件包括:查询时间、查询属性对以及复杂计算函数,查询属性对包括关键字和数据字段;根据计算函数的类型对复杂计算函数进行划分,得到一类或多类计算函数;根据查询属性对以及当前得到的每类计算函数在内存中进行查询操作,以获取N组备份数据;对获取到的每组备份数据按照其对应的一类计算函数进行计算处理,并对计算结果进行合并以获取计算结果。
进一步地,对获取到的每组备份数据按照其对应的计算函数进行计算处理,并对计算结果进行合并以获取计算结果包括:步骤A,获取第一组备份数据中每个数据的时间窗口;步骤B,根据时间窗口对查询时间进行划分,以获取一个或多个连续的时间区间作为有效时间区间;步骤C,通过第一组备份数据对应的计算函数对每个有效时间区间内的数据进行计算处理,并对每个数据的计算结果进行合计得到第一组备份数据的第一处理结果;步骤D,对获取到的每组备份数据执行步骤A到步骤C,以获取每组备份数据的处理结果,将所有的处理结果进行合并后得到计算结果。
进一步地,在根据时间窗口对查询时间进行划分之前,方法还包括:判断查询时间是否小于等于第一阈值,其中,在查询时间小于等于第一阈值的情况下,执行根据时间窗口对查询时间进行划分;在查询时间大于第一阈值的情况下,返回查询结果为空。
进一步地,服务器按照预设的时间窗口长度对每组操作数据中的数据进行筛选,以获取一组或多组备份数据包括:判断每组操作数据中连续的两个数据之间的时间差是否处于预设的时间窗口长度之内,其中,在时间差处于预设的时间窗口长度之内的情况下,确定两个数据为该组操作数据对应的备份数据;在时间差处于预设的时间窗口长度之外的情况下,抛弃两个数据。
进一步地,在将所有的备份数据保存至服务器的内存之后,方法还包括:判断备份数据的数目是否大于第二阈值,其中,在备份数据的数目大于第二阈值的情况下,服务器按照内存中所有备份数据的保存时间,依次删除保存时间最早的备份数据,直至内存中保存的备份数据的数目小于等于第二阈值;在备份数据的数目小于等于第二阈值的情况下,保持内存中备份数据的数目不变。
为了实现上述目的,根据本申请的另一方面,提供了一种数据的处理装置,该装置包括:第一接收模块,用于接收客户端输出的一组或多组操作数据;第一处理模块,用于按照预设的时间窗口长度对每组操作数据中的数据进行筛选,以获取一组或多组备份数据;保存模块,用于将所有的备份数据保存至服务器的内存中。
进一步地,每组备份数据的属性包括:关键字、数据字段、时间窗口以及计算函数,且每组备份数据对应唯一的一类计算函数,计算函数按照类型划分包括普通算术函数、比较函数以及统计函数,其中,装置还包括:第二接收模块,用于接收用于查询的查询条件,查询条件包括:查询时间、查询属性对以及复杂计算函数,查询属性对包括关键字和数据字段;第一划分模块,用于根据计算函数的类型对复杂计算函数进行划分,得到一类或多类计算函数;查询模块,用于根据查询属性对以及当前得到的每类计算函数在内存中进行查询操作,以获取N组备份数据;第二处理模块,用于对获取到的每组备份数据按照其对应的一类计算函数进行计算处理,并对计算结果进行合并以获取计算结果。
进一步地,第二处理模块包括:获取模块,用于获取第一组备份数据中每个数据的时间窗口;第二划分模块,用于根据时间窗口对查询时间进行划分,以获取一个或多个连续的时间区间作为有效时间区间;计算模块,用于通过第一组备份数据对应的计算函数对每个有效时间区间内的数据进行计算处理,并对每个数据的计算结果进行合计得到第一组备份数据的第一处理结果;循环执行模块,用于对获取到的每组备份数据执行获取模块、第二划分模块以及计算模块,以获取每组备份数据的处理结果,将所有的处理结果进行合并后得到计算结果。
进一步地,装置还包括:第一判断模块,用于判断查询时间是否小于等于第一阈值;第一执行模块,用于在查询时间小于等于第一阈值的情况下,执行根据时间窗口对查询时间进行划分;返回模块,用于在查询时间大于第一阈值的情况下,返回查询结果为空。
进一步地,第一处理模块包括:第二判断模块,用于判断每组操作数据中连续的两个数据之间的时间差是否处于预设的时间窗口长度之内;第二执行模块,用于在时间差处于预设的时间窗口长度之内的情况下,确定两个数据为该组操作数据对应的备份数据;丢弃模块,用于在时间差处于预设的时间窗口长度之外的情况下,抛弃两个数据。
进一步地,装置还包括:第三判断模块,用于判断备份数据的数目是否大于第二阈值;第三执行模块,用于在备份数据的数目大于第二阈值的情况下,服务器按照内存中所有备份数据的保存时间,依次删除保存时间最早的备份数据,直至内存中保存的备份数据的数目小于等于第二阈值;保持模块,用于在备份数据的数目小于等于第二阈值的情况下,保持内存中备份数据的数目不变。
为了实现上述目的,根据本申请的另一方面,提供了一种数据的处理***,该***包括:客户端,用于输出一组或多组操作数据;服务器群,用于接收客户端输出的一组或多组操作数据,按照预设的时间窗口长度对每组操作数据中的数据进行筛选,以获取一组或多组备份数据,并将所有的备份数据保存至服务器的内存中。
进一步地,服务器群还用于接收客户端输出的查询条件,并根据查询条件中的查询属性对以及计算函数在内存中进行查询操作,以获取一组或多组备份数据,在对获取到的每组备份数据按照其对应的计算函数进行计算处理,并对计算结果进行合并之后得到查询结果。
通过本申请,采用服务器接收客户端输出的一组或多组操作数据;服务器按照预设的时间窗口长度对每组操作数据中的数据进行筛选,以获取一组或多组备份数据;将所有的备份数据保存至服务器的内存中,上述方案基于内存可以对数据进行缓存的功能,将客户端产生的历史操作数据保存在服务器的内存中,使得服务器在处理海量的操作数据时可以快速的读取操作数据,并进行相关的查询及计算处理,快速得到处理结果,此时数据库的压力大大减少,从而解决了相关现有技术中在处理大量的历史行为数据时查询速度过慢,导致数据库压力过大、服务器性能差的问题,进而实现服务器对操作数据处理的过程中,大大加快了数据处理速度,从而达到了降低了数据库的处理压力,提高服务器***的性能的效果。另外,数据库可以作为数据备份的手段,来提高***的可用性。
具体实施方式
需要说明的是,在不冲突的情况下,本申请中的实施例及实施例中的特征可以相互组合。下面将参考附图并结合实施例来详细说明本申请。
图1是根据本申请实施例的数据的处理***的结构示意图。
如图1所示,该数据的处理***包括:客户端1,用于输出一组或多组操作数据;服务器群2,用于接收客户端1输出的一组或多组操作数据,按照预设的时间窗口长度对每组操作数据中的数据进行筛选,以获取一组或多组备份数据,并将所有的备份数据保存至服务器。这里的服务器的数目不限。
在本申请的上述实施例中,基于内存可以对数据进行缓存的功能,将客户端1产生的历史操作数据保存在服务器的内存中,使得服务器在处理海量的操作数据时可以快速的读取操作数据,并进行相关的查询及计算处理,快速得到处理结果,此时数据库的压力大大减少,从而解决了相关现有技术中在处理大量的历史行为数据时查询速度过慢,导致数据库压力过大、服务器性能差的问题,进而实现服务器对操作数据处理的过程中,大大加快了数据处理速度,从而达到了降低了数据库的处理压力,提高服务器***的性能的效果。同时,本申请利用时间窗口以及合理的数据切换方式,将内存中存储的数据减小到最低程度,防止出现内存不足的情况。另外,数据库可以作为数据备份的手段,来提高***的可用性。
优选地,服务器群2还用于接收客户端1输出的查询条件,并根据查询条件中的查询属性对以及计算函数在内存中进行查询操作,以获取一组或多组备份数据,在对获取到的每组备份数据按照其对应的计算函数进行计算处理,并对计算结果进行合并之后得到查询结果。上述实施例中,由于备份数据存储在内存中,使得读取和计算数据的速度比数据库快很多,从而减少了查询及计算的时间。
具体的,本申请上述实施例中数据的存储方式可以采用二叉树的存储方式,利用二叉树的结构特点,将查询及计算时所需要的数据进行预先处理,在真正需要进行查询及计算的时候,只需要将已经计算好的中间结果进行简单的运算即可,从很大程度上提高了处理效率。
本申请上述实施例可以应用在电子商务领域和其他需要分析用户行为数据的领域,实现了对数据处理过程的优化。
由上可知,本申请提供的历史行为数据的处理***主要包括数据***和数据查询(及计算)两个步骤。***指的是服务器将客户端1生成的行为数据进行保存,可以是新的数据集合的创建,也可以是根据数据的内容更新其对应的数据存储。查询及计算处理是指在设定查询条件之后(包括时间窗口,对应的关键字key和数据字段value等),服务器根据查询条件在已经保存的所有操作数据进行查询得到查询结果并对查询结果做相应的计算,得到最终计算结果。在实际的数据处理中这两个步骤可能相互独立,也可能有一定的关系。本申请涉及到的处理模式可以包括回溯模式和自由模式。自由模式是指***和查询(及计算)完全独立的模式;回溯模式是指数据***之后立即以当前数据为基准数据向过去推进一段时间进行查询的模式。在本申请中只有回溯模式支持去重函数,而非去重函数是两种模式都支持的。
图2是根据本申请实施例的数据的处理方法的流程图,如图2所示该方法包括如下步骤:
步骤S102,通过图1中所示的服务器来接收客户端1输出的一组或多组操作数据。
步骤S104,服务器按照预设的时间窗口长度对每组操作数据中的数据进行筛选,以获取一组或多组备份数据。
步骤S106,将所有的备份数据保存至服务器的内存中。
在本申请的上述实施例中,服务器基于内存可以对数据进行缓存的功能,将客户端1产生的历史操作数据保存在服务器的内存中,使得服务器在处理海量的操作数据时可以快速的读取操作数据,并进行相关的查询及计算处理,快速得到处理结果,此时数据库的压力大大减少,从而解决了相关现有技术中在处理大量的历史行为数据时查询速度过慢,导致数据库压力过大、服务器性能差的问题,进而实现服务器对操作数据处理的过程中,大大加快了数据处理速度,从而达到了降低了数据库的处理压力,提高服务器***的性能的效果。同时,本申请利用时间窗口以及合理的数据切换方式,将内存中存储的数据减小到最低程度,防止出现内存不足的情况。另外,数据库可以作为数据备份的手段,来提高***的可用性。
上述实施例中,用于表征历史行为的操作数据可以包括时间字段和若干数据字段。以表1所示的数据为例对本申请进行详细描述:
表1:
表中的time即为时间字段,user_id(用户ID)、bill_amount(交易金额)、ip(IP地址)为数据字段。通常情况下,操作数据会按照一定的顺序进行处理,但时间字段不一定是有序的。
本申请中客户端1产生了多组操作数据,将它们以历史行为数据保存至服务器的内存中,如表1所示,本申请中涉及到的历史行为数据的处理可以包括数据的存储和数据的统计计算。其中,统计处理的过程中有几个概念:key,value,时间窗口,计算函数。
key是统计的基准字段,value是统计的目标字段,时间窗口是统计的时间范围,计算函数是指对统计出来的目标值的计算方法。例如,在表1中要统计ID号为111111111的用户在19:50至20:00之间的交易金额总和,则key是user_id=111111111,value是交易金额,时间窗口是(19:50至20:00),计算函数为求和函数:f=sum()。统计过程中,key可以不指定,即统计的对象为所有的value;key也可以是多维向量,例如key=(user_id,ip)。
value通常分为连续值(例如交易金额)和离散值(例如IP地址)。对于连续值和离散值,其计算函数是不同的。连续值的计算函数通常有sum(求和),square_sum(平方和),max(最大值),min(最小值),count(数量)等等。离散值的计算函数通常有count(数量),distinct_count(去重后数量)等等。由此,本申请按照计算函数类型对操作数据进行划分,每组操作数据对应唯一的一类计算函数,即每组操作数据中的各个数据都采用一类计算函数进行处理。在服务器保存操作数据的过程中,也是按照每组操作数据的形式进行保存的。
一般来说,计算函数可以包括以下几种:普通算术函数、比较函数、统计函数。其中,sum(求和)和square_sum(平方和)等函数为普通算术函数(以下称为A类函数),max(最大值)和min(最小值)等为比较函数(以下称为B类函数),count(数量)和distinct_count(去重后数量)等为统计函数(以下称为C类函数)。通常情况下所有的计算函数都可以归入这三类中。另外,去重与否在统计中有着重要的意义,所以也可以将计算函数分为去重函数和非去重函数两类。
具体的,本申请上述实施例中服务器保存的备份数据在内存中以二叉树的结构进行存储,具体的存储结构详细描述如下:假设某个key有一个值key0,那么对于一个特定的(key0,value,计算函数)三元组,其对应有一组完全二叉树。例如(用户ID-111111118,交易金额,求和函数)这一个三元组,表示一个二叉树组,其中的每一棵二叉树都用于计算111111118这个用户的交易金额,且都只用于计算金额之和。需要注意的是key0是一个具体的值而value是一个字段的名称。每一组二叉树中的每棵树的大小和结构完全相同,区别只是表示的时间区间不同,并且所有的时间区间是连续的。每棵二叉树的每个叶子节点表示一个时间窗口基本单位。这个基本单位的大小tw根据精确度的需要而定。例如设成1秒,而某个节点表示的时间范围可以是2011-01-01 00:00:00到2011-01-01 00:00:01,等等。二叉树的高度由tw以及最大时间窗口决定。高度定为:ceil(ln(Wmax/tw)/ln2),其中Wmax为最大时间窗口的大小,ceil为向上取整函数。初始状态下整棵树所有节点值均为0。当树建立时,第一个叶子节点的时间就已经确定,后续的每个叶子节点都一次往后推一个tw。例如,如果tw为1秒,且第一个叶子节点的起始时间为2011-01-01 00:00:00,则第二个叶子节点的起始时间为2011-01-0100:00:01,以此类推。
本申请上述实施例中,服务器按照预设的时间窗口长度对每组操作数据中的数据进行筛选,以获取一组或多组备份数据的步骤可以包括:判断每组操作数据中连续的两个数据之间的时间差是否处于预设的时间窗口长度之内,其中,在时间差处于预设的时间窗口长度之内的情况下,确定两个数据为该组操作数据对应的备份数据;在时间差处于预设的时间窗口长度之外的情况下,抛弃两个数据。本申请上述实施例实现了服务器对待存储的操作数据进行刷选的过程,在客户端1产生的两个操作数据的时间差超过了预定时间窗口长度时,服务器可以确定这两个操作数据不具备实际意义,因此,将这两个待存储的操作数据视为无效数据而抛弃,仅将满足条件的操作数据作为备份数据进行保存。具体的,如表1所示,操作数据的时间最优选是有序递增的,或者允许有一定程度的乱序,但需要相邻的两条数据的时间差必须在(-Wmax,Wmax)内,其中Wmax表示预设的时间窗口长度。
本申请上述实施例中,在将所有的备份数据保存至服务器的内存之后,方法还可以包括:判断备份数据的数目是否大于第二阈值,其中,在备份数据的数目大于第二阈值的情况下,服务器按照内存中所有备份数据的保存时间,依次删除保存时间最早的备份数据,直至内存中保存的备份数据的数目小于等于第二阈值;在备份数据的数目小于等于第二阈值的情况下,保持内存中备份数据的数目不变。本申请上述实施例中实现随着时间的推进不断地删除过老的备份数据,保证了内存占有量始终保持在一个稳定的值,不会出现内存无限增长的情况,提高了服务器的处理效率。
具体的,以在服务器中***客户端1生成的操作数据为例详细描述本申请的实施例,其中,数据以二叉树的形式进行保存:
***的操作数据的记录会有一个时间窗口,以及若干个数据字段。需要根据需求,事先确定好需要保存哪些(key0,value,计算函数)组合,以便确定建立多少个二叉树组,即建立多少组操作数据。每次***一条操作数据,需要对所有的二叉树组进行同样的操作。以下步骤假定是针对某个二叉树组G0进行操作,且这组二叉树的对应的key0为K0,value为V0。假设这条数据的时间为t。
某一个时间区间G0内可能会有多棵树存在,假设树按起始时间从小到大排列,共有m棵树,T1,T2,..,Tm,每棵树的起始时间为t1,t2,…,tm。建议每棵树的高度设置为h=ceil(ln(Wmax/tw)/ln2),则每棵树有2h个个叶子节点,其代表的时间区间的长度Wtree=2h*tw本申请中设定的树的高度可以调整,不做严格限制。此处显然Wtree=t2-t1=t3-t2=……
对G0的操作步骤如下。
步骤1,如果G0内一棵树都没有,那么为G0新建一棵树,这棵树的起始时间设为t,其余叶子节点依次类推。执行步骤3。
步骤2,如果G0内有树,那么执行以下步骤:
步骤a,如果t正好落在某棵树的时间范围内,那么直接在这棵树内执行***操作即可。执行步骤3。
步骤b,如果没有一棵树包含t,且t<t1,那么:
(b1)令tb=t1-Wtree。
(b2)创建一棵树,其起始时间为tb。
(b3)如果tb<=t,则将t***这棵树,结束;否则,继续执行步骤(b1)至(b3),直到tb<=t,执行步骤3。
步骤c,如果t不满足步骤a或步骤b的条件,那么:
(c1)令tb=tm+Wtree。
(c2)创建一棵树,其起始时间为tb。
(c3)如果tb<=t<tb+Wtree,则将t***这棵树,结束;否则,继续执行(c1)-(c3),直到tb<=t<tb+Wtree,执行步骤3。
步骤3,根据每棵树的高度h,令G0中树的最大数目为m,则m须满足m>=ceil(Wmax0/(2h*tw))+1,其中ceil是向上取整函数。这里一般m取理论最小值即可。如果树的个数大于m,则去掉起始时间最早的若干棵树,直到剩下树的数目等于m为止。
以上步骤中的(a)、(b3)和(c3)中都有将一条数据***一棵树中的操作。具体的***操作如下步骤A至步骤D所示,假设需要***的树为B0:
步骤A,根据t寻找到B0中对应的叶子节点。假设两个相邻叶子节点N1和N2的时间分别为tN1和tN2,且tN1<=t<tN2,则这条记录对应节点N1。
步骤B,如果计算函数是去重函数,也就意味着使用了回溯模式。此时需要为二叉树组G0事先建立一个哈希表H存储每个value上次出现的位置。H的键是出现过的value值,H的值是该value上次出现过的节点位置,比如节点N1等。
步骤C,假设步骤A中找到的对应的叶子节点为Nt,包括如下情况。
(a),如果计算函数是非去重函数,则对Nt运用计算函数更新其值。如果计算函数为A类函数f=A(),现有节点值为a,新记录的值为b,则Nt的新值为A(a,b);如果计算函数为B类函数f=B(),现有节点值为a,新记录的值为b,则Nt的新值为B(a,b);如果计算函数为C类函数f=C(),现有节点值为a,则新值为a+1。接着直接执行步骤D。
(b),如果计算函数是去重函数,则首先需要更新二叉树组G0附带的哈希表H。设新记录的值为v0。其中,(b1)如果H不包含一个值为v0的键,则直接更新Nt的值,将其+1即可,直接执行步骤D;(b2)否则,假设在H中v0对应的节点位置为N0。如果当前的二叉树组G0里面不包括N0(说明N0所在的树已经被去除),则不进行任何操作;否则对N0的值执行-1操作,并且对N0所有的父节点进行递归的值-1操作,直到根节点。转(b3)。(b3)将Nt的值执行+1操作,接着执行步骤D。
步骤D,更新完毕Nt后,从Nt开始,执行以下操作重新计算每个父节点的值,包括如下步骤:
步骤(D1),令Nt为Nt的父节点,如果此时Nt为B0的根节点,则结束,否则执行(b)。
步骤(D2),如果计算函数为A类函数f=A(),左孩子的值为a,右孩子的值为b,则Nt的新值为(a+b);如果计算函数为B类函数f=B(),左孩子的值为a,右孩子的值为b,则Nt的新值为B(a,b);如果计算函数为C类函数f=C(),左孩子的值为a,右孩子的值为b,则Nt的新值为(a+b)。继续执行(a)。
本申请上述实施例中,每组备份数据的属性可以包括:关键字、数据字段、时间窗口以及计算函数,且每组备份数据对应唯一的一类计算函数,计算函数按照类型划分包括普通算术函数、比较函数以及统计函数,其中,在将所有的备份数据保存至服务器的内存中之后,方法还包括:接收用于查询的查询条件,查询条件包括:查询时间、查询属性对以及复杂计算函数,查询属性对包括关键字和数据字段;根据计算函数的类型对复杂计算函数进行划分,得到一类或多类计算函数;根据查询属性对以及当前得到的每类计算函数在内存中进行查询操作,以获取N组备份数据,此处实现了根据查询条件对所有的备份数据进行回溯查询处理而得到的查询结果;对获取到的每组备份数据按照其对应的一类计算函数进行计算处理,并对计算结果进行合并以获取计算结果。
本申请上述各个实施例可以实现自由模式或回溯模式的查询,在自由模式的查询过程中,可以给定一个时间窗口(t1,t2)、查询属性(关键字key0,数据字段value)对,以及实际查询所需要的复杂计算函数(例如方差)之后,可以得到查询结果。另外,对于回溯模式的查询与自由模式的查询类似,只不过查询前已经执行过***操作,因此查询的几个条件中,除了计算函数外,其他的都在***的时候就已经确定了。
具体的,查询及计算的步骤如下:
首先,拆分计算函数。将计算函数拆分成基本的A类、B类、C类函数。比如计算标准差,其中∑x2为平方和(即square_sum,A类函数),∑x为和(即sum,A类函数),n为计数(即count,C类函数)。拆分后,每一个计算函数都对应一个(key0,value,计算函数)组合,也就是对应一个确定的二叉树组。
然后,根据(key0,value,计算函数)组合找到对应的二叉树组,对每个二叉树组进行查询及计算,将分别查询每个二叉树组得到的查询结果带入拆分后的计算函数式中,计算得到的结果即为查询(及计算)的最终结果。例如上式中的例子,假设sum对应的二叉树组结果为Rsum,count对应的二叉树组结果为Rcount,square_sum对应的二叉树组结果为Rsquare_sum,则最终的查询结果为
进一步的,上述实施例中,对获取到的每组备份数据按照其对应的计算函数进行计算处理,并对计算结果进行合并以获取计算结果包括:步骤A,获取第一组备份数据中每个数据的时间窗口;步骤B,根据时间窗口对查询时间进行划分,以获取一个或多个连续的时间区间作为有效时间区间;步骤C,通过第一组备份数据对应的计算函数对每个有效时间区间内的数据进行计算处理,并对每个数据的计算结果进行合计得到第一组备份数据的第一处理结果;步骤D,对获取到的每组备份数据执行步骤A到步骤C,以获取每组备份数据的处理结果,将所有的处理结果进行合并后得到计算结果。
上述实施例可以实现对每个二叉树组进行查询(及计算)的方法。具体的,每个二叉树组进行查询(及计算)的方法如下:
首先,拆分时间窗口,根据每棵树的时间窗口,将(T1,T2)拆分成多个连续区间,使得每个区间只落在一棵特定的树内,且每棵树至多只对应一个区间。如果(T1,T2)中有部分区间不属于任何一棵树,则更新(T1,T2),丢弃无效区间,使其只保留有效的区间(即可属于某一棵树的区间)。
然后,对每棵树执行单棵树的计算步骤,分别得到计算结果,最后将每次的结果进行合计。假设每棵树计算的结果分别为R1,R2,…Rn。因为在同一个二叉树组中,所以对应同一个计算函数),如果计算函数为A类函数或C类函数,则该二叉树组的计算结果为(R1+R2+…+Rn);如果计算函数为B类函数f=B(),则该二叉树组的计算结果为B(R1,R2,…,Rn)。
上述实施例中,针对单棵树的计算步骤如下(假设在这棵树的时间查询区间为(t1,t2)):
步骤S1,在这棵树中根据时间窗口(t1,t2)找到对应的叶子节点区间。假设t1对应起始节点N1,t2对应结束节点为N2。此处的对应方法同上文中对G0树执行***时的步骤1。接着继续执行步骤S2。
步骤S2,定义一个函数v(N),其结果为节点N的值。再定义一个函数F(V1,V2),用于对两个数值V1和V2进行计算。如果计算函数为A类函数或C类函数,则F的值为(V1+V2);如果计算函数为B类函数f=B(),则F的值为B(V1,V2)。继续执行步骤S3。
步骤S3,定义两个数值变量R1和R2,令R1=v(N1),R2=v(N2)。
步骤S4,如果N1有右兄弟节点N1r,令R1=F(R1,v(N1r));否则R1不变。如果N2有左兄弟节点N2l,令R2=F(R2,v(N2l));否则R2不变。继续执行步骤S5。
步骤S5,N1置为N1的父节点,N2置为N2的父节点。如果N1和N2的父节点是同一个,或者N1和N2的父节点是兄弟节点关系且N1是其父节点的右孩子N2是其父节点的左孩子,令R=F(R1,R2)并作为这棵树的计算结果返回,结束。否则继续执行步骤S4。
优选地,本申请上述实施例中,在根据时间窗口对查询时间进行划分之前,方法还可以包括:判断查询时间是否小于等于第一阈值,其中,在查询时间小于等于第一阈值的情况下,执行根据时间窗口对查询时间进行划分;在查询时间大于第一阈值的情况下,返回查询结果为空。上述实施例实现了对查询所使用的查询时间窗口的大小进行限定,例如,可以将查询时间确定一个最大值Wmax(例如一个月),在数据处理的过程中,当前已处理过的数据其时间最大值(假设为tmax)与当前待处理的记录的时间(假设为t0),其差值(即tmax-t0)应当有一个确定最大值Wmax0(例如两个月),不能超过这个值。由上可知,本申请中用于查询所使用的时间窗口,其上限不应超过tmax,其下限应当不超过(tmax-Wmax0)。
图3是根据本申请实施例的数据的处理装置的结构示意图。
如图3所示的数据的处理装置可以包括:第一接收模块10,用于接收客户端输出的一组或多组操作数据;第一处理模块30,用于按照预设的时间窗口长度对每组操作数据中的数据进行筛选,以获取一组或多组备份数据;保存模块50,用于将所有的备份数据保存至服务器的内存中。
在本申请的上述实施例中,服务器基于内存可以对数据进行缓存的功能,将客户端产生的历史操作数据保存在服务器的内存中,使得在服务器在处理海量的操作数据时可以快速的读取操作数据,并进行相关的查询及计算处理,快速得到处理结果,此时数据库的压力大大减少,从而解决了相关现有技术中在处理大量的历史行为数据时查询速度过慢,导致数据库压力过大、服务器性能差的问题,进而实现服务器对操作数据处理的过程中,大大加快了数据处理速度,从而达到了降低了数据库的处理压力,提高服务器***的性能的效果。同时,本申请利用时间窗口以及合理的数据切换方式,将内存中存储的数据减小到最低程度,防止出现内存不足的情况。另外,数据库可以作为数据备份的手段,来提高***的可用性。
本申请上述实施例中的每组备份数据的属性可以包括:关键字、数据字段、时间窗口以及计算函数,且每组备份数据对应唯一的一类计算函数,计算函数按照类型划分包括普通算术函数、比较函数以及统计函数,其中,装置还包括:第二接收模块70,用于接收用于查询的查询条件,查询条件包括:查询时间、查询属性对以及复杂计算函数,所述查询属性对包括关键字和数据字段;第一划分模块90,用于根据计算函数的类型对复杂计算函数进行划分,得到一类或多类计算函数;查询模块110,用于根据查询属性对以及当前得到的每类计算函数在内存中进行查询操作,以获取N组备份数据;第二处理模块130,用于对获取到的每组备份数据按照其对应的一类计算函数进行计算处理,并对计算结果进行合并以获取计算结果。本申请该实施例实现了根据查询条件在内存中已经保存的备份数据中执行查询操作,具体的,在给定时间窗口(t1,t2)内,查询属性对(关键字key0,数据字段value)以及实际查询所需要的复杂计算函数(例如方差)之后,可以得到查询结果。其中,在查询复杂函数的情况下,可以将复杂函数划分为简单的计算函数,然后对划分后得到的每类计算函数进行查询操作,最后将查询结果进行合并,大大提高了查询效率。
优选地,本申请上述实施例中的第二处理模块130可以包括:获取模块,用于获取第一组备份数据中每个数据的时间窗口;第二划分模块,用于根据时间窗口对查询时间进行划分,以获取一个或多个连续的时间区间作为有效时间区间;计算模块,用于通过第一组备份数据对应的计算函数对每个有效时间区间内的数据进行计算处理,并对每个数据的计算结果进行合计得到第一组备份数据的第一处理结果;循环执行模块,用于对获取到的每组备份数据执行获取模块、第二划分模块以及计算模块,以获取每组备份数据的处理结果,将所有的处理结果进行合并后得到查询结果。该实施例具体实现了对每组备份数据(二叉树组)进行查询(及计算)的过程,由于对时间区间进一步确定为有效时间区间,因此,减轻了***的运算负担,提高了查询效率。
优选地,本申请上述实施例中的装置还可以包括:第一判断模块,用于判断查询时间是否小于等于第一阈值;第一执行模块,用于在查询时间小于等于第一阈值的情况下,执行根据时间窗口对查询时间进行划分;返回模块,用于在查询时间大于第一阈值的情况下,返回查询结果为空。上述实施例实现了在对查询时间进行划分之间,对查询时间窗口的大小进行进一步限定,不符合限定的查询时间被认为是无效时间,所得到的查询结果不具备实际意义,因此对不满足限定条件的查询时间不进入对查询时间进行划分的步骤,提高了查询效率,使得查询结果更精确。
本申请上述实施例中的第一处理模块30可以包括:第二判断模块301,用于判断每组操作数据中连续的两个数据之间的时间差是否处于预设的时间窗口长度之内;第二执行模块302,用于在时间差处于预设的时间窗口长度之内的情况下,确定两个数据为该组操作数据对应的备份数据;丢弃模块303,用于在时间差处于预设的时间窗口长度之外的情况下,抛弃两个数据。本申请上述实施例通过第一处理模块30实现了对待存储的操作数据进行刷选的过程,在客户端1产生的两个操作数据的时间差超过了预定时间窗口长度时,服务器可以确定这两个操作数据不具备实际意义,因此,将这两个待存储的操作数据视为无效数据而抛弃,仅将满足条件的操作数据作为备份数据进行保存。具体的,如表1所示,操作数据的时间最优选是有序递增的,或者允许有一定程度的乱序,但需要相邻的两条数据的时间差必须在(-Wmax,Wmax)内,其中Wmax表示预设的时间窗口长度。
优选地,本申请上述实施例中的装置还可以包括:第三判断模块,用于判断备份数据的数目是否大于第二阈值;第三执行模块,用于在备份数据的数目大于第二阈值的情况下,服务器按照内存中所有备份数据的保存时间,依次删除保存时间最早的备份数据,直至内存中保存的备份数据的数目小于等于第二阈值;保持模块,用于在备份数据的数目小于等于第二阈值的情况下,保持内存中备份数据的数目不变。本申请上述实施例中实现随着时间的推进不断地删除过老的备份数据,保证了内存占有量始终保持在一个稳定的值,不会出现内存无限增长的情况,提高了服务器的处理效率。
需要说明的是,在附图的流程图示出的步骤可以在诸如一个计算机可执行指令的计算机***中执行,并且,虽然在流程图中示出了逻辑顺序,但是在某些情况下,可以以不同于此处的顺序执行所示出或描述的步骤。
从以上的描述中,可以看出,本申请实现了如下技术效果:本申请基于内存数据缓存,将历史数据存在内存中,大大加快了数据处理的速度。同时,数据库可以作为数据备份的手段,来提高***的可用性。由于数据存在内存中,数据库压力大大减小,可以适应海量数据的处理。同时,本申请利用时间窗口以及合理的数据切换方式,将内存中存储的数据减小到最低程度,防止出现内存不足的情况。另外,由于会随着时间的推进不断地删除过老的二叉树,保证了内存占有量始终保持在一个稳定的值,不会出现内存无限增长的情况。
显然,本领域的技术人员应该明白,上述的本申请的各模块或各步骤可以用通用的计算装置来实现,它们可以集中在单个的计算装置上,或者分布在多个计算装置所构成的网络上,可选地,它们可以用计算装置可执行的程序代码来实现,从而,可以将它们存储在存储装置中由计算装置来执行,或者将它们分别制作成各个集成电路模块,或者将它们中的多个模块或步骤制作成单个集成电路模块来实现。这样,本申请不限制于任何特定的硬件和软件结合。
以上所述仅为本申请的优选实施例而已,并不用于限制本申请,对于本领域的技术人员来说,本申请可以有各种更改和变化。凡在本申请的精神和原则之内,所作的任何修改、等同替换、改进等,均应包含在本申请的保护范围之内。