CN110532307A - 一种流滑动窗口的数据存储方法及查询方法 - Google Patents
一种流滑动窗口的数据存储方法及查询方法 Download PDFInfo
- Publication number
- CN110532307A CN110532307A CN201910623453.2A CN201910623453A CN110532307A CN 110532307 A CN110532307 A CN 110532307A CN 201910623453 A CN201910623453 A CN 201910623453A CN 110532307 A CN110532307 A CN 110532307A
- Authority
- CN
- China
- Prior art keywords
- bucket
- timestamp
- time
- mapped
- bit
- Prior art date
- Legal status (The legal status is an assumption and is not a legal conclusion. Google has not performed a legal analysis and makes no representation as to the accuracy of the status listed.)
- Granted
Links
Classifications
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F16/00—Information retrieval; Database structures therefor; File system structures therefor
- G06F16/20—Information retrieval; Database structures therefor; File system structures therefor of structured data, e.g. relational data
- G06F16/24—Querying
- G06F16/245—Query processing
- G06F16/2458—Special types of queries, e.g. statistical queries, fuzzy queries or distributed queries
- G06F16/2477—Temporal data queries
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F16/00—Information retrieval; Database structures therefor; File system structures therefor
- G06F16/20—Information retrieval; Database structures therefor; File system structures therefor of structured data, e.g. relational data
- G06F16/25—Integrating or interfacing systems involving database management systems
- G06F16/258—Data format conversion from or to a database
Landscapes
- Engineering & Computer Science (AREA)
- Databases & Information Systems (AREA)
- Theoretical Computer Science (AREA)
- Physics & Mathematics (AREA)
- General Engineering & Computer Science (AREA)
- General Physics & Mathematics (AREA)
- Data Mining & Analysis (AREA)
- Fuzzy Systems (AREA)
- Mathematical Physics (AREA)
- Probability & Statistics with Applications (AREA)
- Software Systems (AREA)
- Computational Linguistics (AREA)
- Information Retrieval, Db Structures And Fs Structures Therefor (AREA)
Abstract
本发明公开了一种流滑动窗口的数据存储方法及查询方法。数据存储方法,适用于利用m个桶、k个哈希函数进行数据存储的数据结构,其特征在于,首先为数据结构的每个桶中分配一定内存,来记录存入对应桶中元素的时间戳;然后每当一个新的元素被哈希函数映射进一个桶,如果该桶是空的,则用该桶存储该元素,并在该桶对应的内存中写入该元素的时间戳;若该桶已有元素,则按照预设操作对桶内元素和对应时间戳进行更新。当查找元素y是否在距离现在之前的时刻w之后存储过,则将元素y映射到的k个位置存储的时间戳;如果这k个位置有时间戳早于w或者为0,则判定未存储过元素y;如果k个位置的时间戳都大于w,则判定存储过元素y。
Description
技术领域
本发明涉及大数据处理、网络数据分析、分布式数据集等多个领域,涉及一种流滑动窗口的数据存储方法及查询方法。
背景技术
随着5G时代来临,对海量数据的更多处理方法与信息获取格外重要。本发明可以应用于硬件平台与软件平台,对海量数据进行动态存储与查询。传统的数据结构在处理数据时没有对时间特征进行存储记录,只能对数据进行静态存储与查询。
现有的滑动窗口滑动统计算法是用来改善吞吐量的一种技术,通过统计一段时间内的访问次数来进行控制,访问次数达到的某个峰值时进行限流。在每次有访问进来时,判断前N个单位时间内的总访问量是否超过了设置的阈值,并对当前时间片上的请求数+1。但是这种统计算法准确率太低。
发明内容
为解决传统滑动窗口的统计算法准确率太低的问题,本发明提出一种高准确率的“流滑动窗口”数据结构。传统方法不适用于硬件平台,而本发明适用于硬件平台,也适用于软件平台。
本发明在传统的静态数据结构的基础上,对其静态存储、静态查询的功能进行改进,加入时间特征,是可以对动态数据流加以时间区分的数据处理方法。
本发明的技术方案为:
一种流滑动窗口的数据存储方法,适用于利用m个桶、k个哈希函数进行数据存储的数据结构,其特征在于,首先为所述数据结构的每个桶中分配一定内存,来记录存入对应桶中元素的时间戳;然后每当一个新的元素被哈希函数映射进一个桶,如果该桶是空的,则用该桶存储该元素,并在该桶对应的内存中写入该元素的时间戳;若该桶已有元素,则按照所述数据结构预设的操作对该桶内元素进行更新,然后将其对应位置的时间戳更新为当前新元素的时间戳。
进一步的,所述数据结构为Bloom Filter,将长度为m的Bloom Filter替换为长度为m位的b比特时间数组用于存储写入桶中的元素及其对应的时间戳信息,其中每个桶对应一个b比特时间数组作为对应桶所分配的内存;时间数组的初始状态全部清空为0;当往Bloom Filter中增加一个元素时,该元素被映射进k个桶,如果所映射的桶是空的,则将元素的时间戳模去2^b-1后作为时间戳信息写入时间数组的对应位置;如果所映射桶非空,则更新时间数组对应位置的时间戳信息。
进一步的,所述数据结构为Bloom Filter,将长度为m的Bloom Filter每n位为一组分配一个64比特的共享标记时间戳,用于作为对应桶所分配的内存存储写入桶中的时间戳,n<m;当一时间戳为t的元素被映射进k个桶:bucket1,bucket2,…,bucketk,它们分别属于第i1,i2,…ik个组;对该元素执行完Bloom Filter的插入操作时,将该元素的时间戳t与该k个桶中每个桶所归属的组所拥有的时间戳进行比对,如果两者差距大于设定的时间间隔Δt,则将对应组中每一位重新写为0,并更新时间戳为当前元素的时间戳t,否则在所映射桶内写入1。
进一步的,所述数据结构为BitMap,k取值为1;将长度为m的BitMap替换为长度为m位的b比特时间数组用于存储写入桶中的元素及其对应的时间戳信息,其中每个桶对应一个b比特时间数组作为对应桶所分配的内存;时间数组的初始状态全部清空为0;当往BitMap中增加一个元素时,该元素被映射进k个桶,如果所映射的桶是空的,则将元素的时间戳对2^b-1取模后作为时间戳信息写入时间数组的对应位置;如果所映射桶非空,则更新时间数组对应位置的时间戳信息。
进一步的,所述数据结构为BitMap,k取值为1;将长度为m的BitMap每n位为一组分配一个64比特的共享标记时间戳,用于作为对应桶所分配的内存存储写入桶中的时间戳,n<m;当一时间戳为t的元素被映射进k个桶:bucket1,bucket2,…,bucketk,它们分别属于第i1,i2,…ik个组;对该元素执行完Bloom Filter的插入操作时,将该元素的时间戳t与该k个桶中每个桶所归属的组所拥有的时间戳进行比对,如果两者差距大于设定的时间间隔Δt,则将对应组中每一位都重新写为0,并更新时间戳为当前元素的时间戳t,否则在所映射桶内写入1。
进一步的,所述数据结构为Virtual BitMap;将长度为m的Virtual BitMap替换为长度为m位的b比特时间数组用于存储写入桶中的元素及其对应的时间戳信息,其中每个桶对应一个b比特时间数组作为对应桶所分配的内存;时间数组的初始状态全部清空为0;当往Virtual BitMap中增加一个元素时,该元素被映射进k个桶,如果所映射的桶是空的,则将元素的时间戳模去2^b-1后作为时间戳信息写入时间数组的对应位置;如果所映射桶非空,则更新时间数组对应位置的时间戳信息。
进一步的,所述数据结构为Virtual BitMap;对于每一个元素的源地址;在长度为m的Virtual BitMap中为该源地址划分出d个比特位;再将该d个比特位划分为s组,每组分配一个共享时间戳,用于作为对应桶所分配的内存存储写入桶中的时间戳;当一时间戳为t的元素被映射进k个桶:bucket1,bucket2,…,bucketk,它们分别属于第i1,i2,…ik个组;对该元素执行完Bloom Filter的插入操作时,将该元素的时间戳t与该k个桶中每个桶所归属的组所拥有的时间戳进行比对,如果两者差距大于设定的时间间隔Δt,则将对应组中每一位都重新写为0,并更新时间戳为当前元素的时间戳t,否则在所映射桶内写入1。
进一步的,所述数据结构为HyperLogLog;将长度为m的HyperLogLog替换为长度为m位的b比特时间数组用于存储写入桶中的元素及其对应的时间戳信息,其中每个桶对应一个b比特时间数组作为对应桶所分配的内存;时间数组的初始状态全部清空为0;当往HyperLogLog中增加一个元素时,该元素被映射进k个桶,如果所映射的桶是空的,则将元素的时间戳模去2^b-1后作为时间戳信息写入时间数组的对应位置;如果所映射桶非空,则更新时间数组对应位置的时间戳信息。
进一步的,所述数据结构为HyperLogLog;将长度为m的HyperLogLog每n位为一组分配一个64比特的共享标记时间戳,用于作为对应桶所分配的内存存储写入桶中的时间戳,n<m;当一时间戳为t的元素被映射进k个桶:bucket1,bucket2,…,bucketk,它们分别属于第i1,i2,…ik个组;对该元素执行完HyperLogLog的插入操作时,将该元素的时间戳t与该k个桶中每个桶所归属的组所拥有的时间戳进行比对,如果两者差距大于设定的时间间隔Δt,则将对应组中每一位重新写为0,并更新时间戳为当前元素的时间戳t,否则在所映射桶内写入1。
一种数据查询方法,其特征在于,当查找元素y是否在距离现在之前的时刻w之后存储过,则将该元素y映射到的k个位置存储的时间戳;如果这k个位置有时间戳早于w或者为0,则判定未存储过该元素y;如果k个位置的时间戳都大于w,则判定存储过该元素y。
与现有技术相比,本发明的积极效果为:
本发明能够对数据进行准确的动态统计;数据存储时具有时间特征,可以查询指定的时间段内的数据信息。
该发明的应用实例有网络流调度问题。在网络流调度中,保证小流的调度优先于大流,以此提高流量处理效率。通过该数据结构,我们可以对交换机中的网络流进行统计,在调度之前统计出活跃流,并将之实现在硬件、FPGA中。
附图说明
图1为Bloom Filter初始状态图;
图2为Bloom Filter插入示例图;
图3为Bloom Filter查询示例图;
图4为Bloom Filter滑动窗口64-bit时间数组版本的插入示例图;
图5为Bloom Filter滑动窗口共享时间戳版本的插入示例图;
图6为HyperLogLog的插入示例图;
(a)HyperLogLog插入情况一;
(b)HyperLogLog插入情况二;
(c)HyperLogLog插入情况三;
图7为HyperLogLog滑动窗口64-bit时间数组版本的插入示例图;
(a)HyperLogLog滑动窗口版本1第一种插入情况;
(b)HyperLogLog滑动窗口版本1第二种插入情况;
(c)HyperLogLog滑动窗口版本1第三种插入情况。
具体实施方式
下面结合附图和实施步骤对本发明进一步说明。
本发明可以适用于所有具有以下特征的数据结构:通过k个哈希函数,将元素映射并存储进m个桶中(此处元素可以是任意数据)。其中,哈希函数可以将数据元素的关键字作为自变量,映射成一个值,即为该元素的存储地址。k可以取1,2,…n。桶是用于存储元素的结构体,可以由b个比特组成。
本发明针对每一种现有数据结构(一共四种,分别为Bloom Filter,BitMap,Virtual BitMap,HyperLogLog)有三个滑动窗口版本。对于本发明所适用的、由m个桶所组成的基础数据结构上,本发明在每个桶中再分配一定内存,来记录元素的时间戳。滑动窗口宽度w由用户自己设定,时间戳的更新与之后的查询操作取决于已设定的w,时间戳所使用的比特数可以由用户自行设定。每当一个新的元素被哈希函数映射进某个桶,如果该桶是空的,就用该桶存储该元素,并在该桶对应的存储时间戳的位置写入该元素的时间戳;若该桶已有元素,则按照原始数据结构预设的操作对该桶内元素进行更新,然后将其对应位置的时间戳更新为当前新元素的时间戳。在这样的情况下,我们可以保证所有的桶如果一旦已经有元素,都记录着该元素最新出现的时间点。
接下来,我们以常用的四种静态数据结构Bloom Filter,BitMap,VirtualBitMap,HyperLogLog为例,介绍流滑动窗口的三个版本。
1.Bloom Filter
1.1 Bloom Filter介绍
Bloom Filter,即布隆过滤器,1970年由Bloom中提出。它可以用于检索一个元素是否在一个集合中。Bloom Filter是一种空间效率很高的随机数据结构,它利用位数组很简洁地表示一个集合,并能判断一个元素是否属于这个集合。它是一个判断元素是否存在集合的快速的概率算法。Bloom Filter有可能会出现错误判断,但不会漏掉判断。也就是Bloom Filter判断元素不在集合,那肯定不在;但如果判断元素在集合中,有一定的概率是误判。在能容忍低错误率的应用场合下,Bloom Filter极大节省了空间。它的优点是空间效率和查询时间都远远超过一般的算法,缺点是有一定的误识别率和删除困难。
Bloom Filter主要由以下部分构成:
1)位数组:
Bloom Filter使用一个m比特的数组来保存信息,初始状态时,Bloom Filter是一个包含m位的位数组,每一位都置为0。这里的每一位就是一个比特,对应着一个桶。初始状态如图1。
2)k个独立哈希函数
Bloom Filter使用k个相互独立的哈希函数,它们可以将集合S={x1,x2,…,xn}中的每个元素映射到{1,…,m}的范围中。
当我们往Bloom Filter中增加任意一个元素x时候,我们使用k个哈希函数得到k个哈希值,然后将数组中对应的比特位设置为1。即第i个哈希函数映射的位置hashi(x)就会被置为1(1≤i≤k)。如果一个位置多次被置为1,那么只有第一次会起作用,后面几次将不作任何改变,插入过程如图2。
当我们需要查询y是否属于这个集合时,我们只需要对y使用k个哈希函数得到k个哈希值,如果该k个哈希值所对应的位置都是1,我们就认为y是集合中的元素,否则就认为y不是集合中的元素。图3中,y2就不是集合中的元素(因为y2有一处指向了“0”位);而y1被我们认定为属于这个集合,因为它被映射到的所有位置都是1,但这有可能是一个假阳性。我们不能保证查找的结果100%正确。
在此基础上,我们介绍三个版本的流滑动窗口。
1.2 Bloom filter滑动窗口版本1:64-bit时间数组
该版本的流滑动窗口,将长度为m的位数组构成的Bloom Filter替换为一个每一位由64比特构成的时间数组(即替换为一个长度为m的时间数组,时间数组的每一位是64比特),初始状态全部清空为0。当我们往Bloom Filter中增加一个元素时,元素被映射进k个桶。如果原先桶是空的,则将元素的时间戳写入时间数组的对应位置;如果桶非空,则时间数组的对应位置必然也非0,将之更新为更新的时间戳即可,如图4。
查询时,如果我们想查找元素y是否在距离现在之前的时刻w之后进来过,只需查看其通过k个哈希函数映射到的k个位置存储的时间戳。如果这k个位置有时间戳早于w或者为0的,那么一定没有;如果k个位置的时间戳都大于w,我们则可认为元素y在距离现在w时刻之后进来过。
并且,通过此时间数组,我们可以直接删去之前存储元素的长度为m的位数组。因为64比特的时间数组容量足够大,可以保证整型的时间戳不会溢出。那么,我们将时间戳从1开始编号,有效的(非0的)时间戳即证明了原先的比特位非0。
这样,我们相当于是直接用一个长度为m的64比特时间戳数组(即时间数组长度为m位,每位为64比特)代替了原来的m个比特位,从而对元素进行统计,并可以实现根据时间查询。
1.3 Bloom filter滑动窗口版本2:b-bit时间数组
由于64-bit的时间数组空间开销比较大,我们提出第二个版本,将原来的64比特换为b个比特。类似于版本一,我们也对时间戳从1开始计数。当b很小,如b<5时,我们需要把时间戳记为其模去2^b-1后的结果(即当前时间戳模(2^b-1)。“模”的意思是取余数,比如说5模3为2,10模3为1)。这样的循环计数,有可能产生相差恰好为2^b-1的误差。显然,b越大,循环长度越长,造成误差的可能性就越低。用户可以根据对准确性与空间消耗的不同需要,选择不同的比特数。
同样,类似于第一个版本,我们也可以删去原先的m个比特位。插入和查找都类似于版本1,我们可以直接通过时间戳是否为0,来判断这一位上是否已有元素,并且也可根据时间戳信息,查找距离现在之前的时刻w之后的元素。当流的数量较多、时间戳更新较快时,循环所导致的误差会较小,我们的算法表现非常好。
1.4 Bloom filter滑动窗口版本3:共享时间戳
该版本不再是直接构造一个长度为m的时间数组。在该版本中,我们给总长度为m的Bloom Filter的每n位为一个组分配一个64比特的共享标记时间戳(n<m),即每n位被分进同一个组,共享一个时间戳。对于给定的时间间隔Δt,我们在插入时做如下操作:
假设一个时间戳为t的元素被映射进k个桶:bucket1,bucket2,…,bucketk,它们分别属于第i1,i2,…ik个组(其中有可能相等)。我们执行完Bloom Filter的插入操作时,将该元素的时间戳t与该k个桶中每个桶所归属的组所拥有的时间戳进行比对。如果两者差距大于Δt,我们就清空整组(将全组中每一位都重新写为0),并更新时间戳为当前元素的时间戳t;否则在所映射桶内写入1。如图5中,x被映射进第二个组中的桶与第三个组中的桶。在第二个组中,x的时间戳7与该组的时间戳5的差距小于Δt,所以我们在该桶内写入1;而在第三个组中,x的时间戳7与该组的时间戳3时间戳之差大于Δt,故而我们将桶清空,再更新时间戳,如图5。
该版本与前两种最大的区别,就是有“清空”这一项操作。查询时,该结构可以查询某个元素在距离现在之前Δt之后是否进来过。查询操作类似于普通Bloom Filter的查询,即一旦有位置为0,就说明Δt时刻之后没有来过;若全部为1,则可声明其来过。
此版本可以很大程度上减少空间开销,同时保持时间戳的准确性。
2.BitMap
2.1 BitMap介绍
BitMap和Bloom Filter的基本结构一样,也是由长度为m的位数组和k个哈希函数作为基本结构,此处k为1,即只使用一个哈希函数。Bloom Filter的作用是回答元素是否出现过,而BitMap的作用是统计集合中差异元素个数。其基本思路是:哈希函数H,其哈希结果空间有m个值(最小值0,最大值m-1),并且哈希结果服从均匀分布。使用一个长度为m的bitmap(位数组),每一个比特位为一个桶,均初始化为0。对于某个集合,此集合所有元素的插入过程和Bloom Filter类似:每个元素通过哈希函数H映射到bitmap中的第k位,如过这一位为0,则将其置为1;若为1,则不进行操作。当集合所有元素哈希完成后,设BitMap中还有u个位为0。则我们可以根据此公式对集合中元素的基数进行估计:
此公式为n的一个估计,且为最大似然估计(MLE)。
在此基础上,我们介绍流滑动窗口的三个版本。
2.2 BitMap滑动窗口版本1:64-bit时间数组
该结构与Bloom Filter的64-bit时间数组类似,也是直接将长度为m的位数组由一个长度为m的64比特时间数组代替。每个元素被映射进数组中的某一位时,直接在这一位上写入该元素的时间戳。
除了查询集合基数之外,我们也可以利用此时间数组查询从距离现在时刻w到现在的不同元素个数。若现在的时间戳为t0,我们可以统计时间数组中所有时间戳在t0-w之后的个数,再利用刚才的公式,估算出从距离现在时刻w到现在的差异元素个数。
2.3 BitMap滑动窗口版本2:b-bit时间数组
该结构与64-bit时间数组类似,数组中每一位用较少的b个比特代替64比特,时间戳记为其模去2^b-1。同样,我们可以利用它来统计从距离现在w时间到现在的差异元素个数,但是要保证w<2^b-1。
用b=4的时候举例。这种情况下,时间戳可以取1,2,…15,假设当前时刻的时间戳是14,我们希望得到从距离现在5个单位时间到现在的元素总数,那么我们直接记录时间戳大于9、小于等于14的即可;假设当前时刻的时间戳是2,我们希望得到从距离现在5个单位时间到现在的元素总数,那么我们记录时间戳为13,14,15,1,2的时间戳总数。总之,我们所有的操作,都在模2^b-1下进行即可。
但是在统计距离现在w到距离现在0的元素总数时,当b取得较小时(小于6时),容易将属于距离现在w到距离现在2w的元素误记为距离现在w到距离现在0的元素,而距离更远的则不容易被误记。实验结果表明,随着b逐渐增大,w到2w范围内的误报率会很快下降。用户在选择b时,可以根据算法的实际效果与自身需求进行选择,在正确率与空间消耗上寻求平衡。
2.4 BitMap滑动窗口版本3:共享时间戳
该结构同样类似于Bloom filter,对于长度为m位的BitMap,我们将每n位分为一组,每一组中所有桶共享一个时间戳。插入的过程也与之类似,如果时间戳差距小于Δt,则只完成插入操作;否则,对时间戳进行更新,并清空整组中的所有桶。
统计在距离现在Δt之后到来的元素个数时,我们也可以通过类似的方法,找到对应的时间戳所在的组,数出1的个数,通过BitMap的公式得到结果。
3.Virtual BitMap
3.1 Virtual BitMap介绍
Virtual BitMap为了解决问题:查看源地址向多少目的地址发送了元素。其基本结构也是m个比特位和k个哈希函数。对于每一个元素,先获得其源地址,用哈希函数将之映射到k个位置;对于映射到的每个位置,接下来在m个比特位中再选择d个位置,用以存储该源地址发出的所有元素的目的地址。这d个位置可以是连续的,也可以是间断的,但要保证对于每个源地址,其目的地址所能被哈希函数映射到的位置可获知。这要求提前预知每个源地址所能发出的目的地址的数量,以更好地给每个源地址分配目的地址所能使用的位置。在这种情况下,对每个源地址,可以对分配给它的d位使用BitMap的差异元素统计公式,即这d个位中还有u个位为0。则根据此公式对集合中元素的基数进行估计:
在此基础上,我们介绍流滑动窗口的三个版本。
3.2 Virtual BitMap滑动窗口版本1:64-bit时间数组
类似地,对于某个元素的源地址,每次基于该元素的目的地址插入新的元素时,对时间戳进行更新。并且,我们也可以省去原先的m个比特位,将之由每一位由64比特构成的时间数组代替,初始状态全部清空为0。当我们往该数据结构中增加一个元素时,元素被映射进k个桶。如果原先桶是空的,则将元素的时间戳写入对应位置(由于已给每个桶内分配一定的内存来存时间戳,根据桶地址可以直接得到时间戳位置);如果桶非空,将之更新为新元素的时间戳即可。在此基础上,我们可以根据统计从距离现在w时刻到当前时刻,某个起始地址发出的不同目的地址的元素的个数。
3.3 Virtual BitMap滑动窗口版本2:b-bit时间数组
此版本也使用长度为m的b比特时间数组,在模2^b-1的条件下进行64-bit时间数组的各项操作。我们对时间戳从1开始计数。当b很小,如b<5时,我们需要把时间戳记为其模去2^b-1后的结果。这样的循环计数,有可能产生相差恰好为2^b-1的误差。显然,b越大,循环长度越长,造成误差的可能性就越低。用户可以根据对准确性与空间消耗的不同需要,选择不同的比特数。同样,删去原先的m个比特位后,我们可以直接通过时间戳是否为0,来判断这一位上是否已有元素,并且也可根据时间戳信息,查找距离现在之前的时刻w之后的元素。
3.4 Virtual BitMap滑动窗口版本3:共享时间戳
对于每一个元素的源地址,我们会在长度为m的位数组中,给其划分出d个比特位以供使用,而对于这d个比特位,我们也可将之再划分为s组,每组分配一个时间戳,执行BitMap的操作即可。即每次插入时,如果时间戳差距小于Δt,则只完成插入操作;否则,对时间戳进行更新,并清空整组中的所有桶。
统计在距离现在Δt之后到来的元素个数时,我们也可以通过类似的方法,找到对应的时间戳所在的组,数出1的个数,通过BitMap的公式得到结果。
4.HyperLogLog
4.1 HyperLogLog介绍
HyperLogLog和BitMap的目的类似,都是计算集合的基数。它的结构为一个长度为m位的数组,每个位置用6比特。在HyperLogLog中,数组的每一位来存储一个整数,为一个整形数中末尾连续0的个数,故而使用6比特即可,刚好可存下2^6=64个数。同样地,HyperLogLog也使用k个哈希函数,此处k为1。
插入时,对于每一个元素,用哈希函数得到一个二进制串。该二进制串的第一个作用是将元素映射进某个桶i,第二个作用是对桶进行更新:如果桶是空的,则在该二进制串中计算连续0的个数s,将s存入桶中;如果桶非空,则在当前的s与桶中已存的s中,选取较大的并存储。
元素的三种插入情况如图6(a)~图6(c)。为了简便,我们将x的哈希值只展示尾11位。
如果只有一个桶,在所有元素插入结束后,可以认为,该集合的基数为N=2^k。显然,桶的个数越多,统计结果就能更准确,对于m个桶的情况,取这m个桶的调和平均值(倒数平均)。普通的平均法可能因为个别离群值对平均结果产生较大的影响,调和平均可以有效平滑离群值的影响。最后,用平均值k′带入基数计算公式,估算得到N=2^k′。
在此基础上,我们介绍流滑动窗口的三个版本。
4.2 HyperLogLog滑动窗口版本1:64-bit时间数组
类似地,本发明给位数组中的每一个桶都附加一个64比特的位,以存储时间戳。对于每一个元素插入,本发明都执行如下操作:
首先,判断当前元素所要存入的桶的时间戳是否过期,即该位桶时间戳与现在时间的差距是否已经大于w。如果已过期,就直接将该元素的哈希值结尾连续0的个数s写入桶中,时间戳写成当前时间。如果未过期,判断该元素的哈希值结尾连续0的个数是否大于计数器,如果大于,就更新桶内s的值、更新时间戳;否则不改变桶内s的值、不改变时间戳。
本发明将易混淆的三种情况展示于图7(a)~图7(c)。
如此,本发明始终能够得到时间窗口长度稳定为w的HyperLogLog数组。需要统计时,我们直接使用普通的公式,即可得到距离现在w到现在的差异元素个数。
4.3 HyperLogLog滑动窗口版本2:b-bit时间数组
此版本的所有操作都与64-bit类似,只不过都在模2^b-1之下完成。我们对时间戳从1开始计数。当b很小,如b<5时,我们需要把时间戳记为其模去2^b-1后的结果。这样的循环计数,有可能产生相差恰好为2^b-1的误差。显然,b越大,循环长度越长,造成误差的可能性就越低。用户可以根据对准确性与空间消耗的不同需要,选择不同的比特数。同样,删去原先的m个比特位后,我们可以直接通过时间戳是否为0,来判断这一位上是否已有元素,并且也可根据时间戳信息,查找距离现在之前的时刻w之后的元素。同样,我们对元素进行插入时,需要判断现在的时间戳与桶对应的时间戳之差是否已大于时间窗口的宽度。
统计差异元素个数时,也是对所有位置做调和平均之后,利用公式即可。
4.4 HyperLogLog滑动窗口版本3:共享时间戳
类似地,我们对m个桶分组,将之每n位分配一个64比特的标记时间戳(n<m),即每n位被分进同一个组,每一组分配一个时间戳。每次插入元素时,对于给定的Δt,一旦新到的元素的时间戳与其映射位置所在组的时间戳差距超过Δt,就直接将整组的桶清空,再插入该元素。如果差距没有超过Δt,我们依旧保持时间窗口宽度为w,即与64-bit的插入方式相同,只不过如果要更新时间戳,则更新的是整组的时间戳。
在此基础上,我们可以计算在距离现在Δt之后差异元素个数。直接对复合相应时间戳的组取全组的调和平均再使用公式即可。
Claims (13)
1.一种流滑动窗口的数据存储方法,适用于利用m个桶、k个哈希函数进行数据存储的数据结构,其特征在于,首先为所述数据结构的每个桶中分配一定内存,来记录存入对应桶中元素的时间戳;然后每当一个新的元素被哈希函数映射进一个桶,如果该桶是空的,则用该桶存储该元素,并在该桶对应的内存中写入该元素的时间戳;若该桶已有元素,则按照所述数据结构预设的操作对该桶内元素进行更新,然后将其对应位置的时间戳更新为当前新元素的时间戳。
2.如权利要求1所述的方法,其特征在于,所述数据结构为Bloom Filter,将长度为m的Bloom Filter替换为长度为m位的b比特时间数组用于存储写入桶中的元素及其对应的时间戳信息,其中每个桶对应一个b比特时间数组作为对应桶所分配的内存;时间数组的初始状态全部清空为0;当往Bloom Filter中增加一个元素时,该元素被映射进k个桶,如果所映射的桶是空的,则将元素的时间戳模去2^b-1后作为时间戳信息写入时间数组的对应位置;如果所映射桶非空,则更新时间数组对应位置的时间戳信息。
3.如权利要求1所述的方法,其特征在于,所述数据结构为Bloom Filter,将长度为m的Bloom Filter每n位为一组分配一个64比特的共享标记时间戳,用于作为对应桶所分配的内存存储写入桶中的时间戳,n<m;当一时间戳为t的元素被映射进k个桶:bucket1,bucket2,…,bucketk,它们分别属于第i1,i2,…ik个组;对该元素执行完Bloom Filter的插入操作时,将该元素的时间戳t与该k个桶中每个桶所归属的组所拥有的时间戳进行比对,如果两者差距大于设定的时间间隔Δt,则将对应组中每一位都重新写为0,并更新时间戳为当前元素的时间戳t,否则在所映射桶内写入1。
4.一种基于权利要求2或3所述数据存储方法所存储数据的数据查询方法,其特征在于,当查找元素y是否在距离现在之前的时刻w之后存储过,则将该元素y映射到的k个位置存储的时间戳;如果这k个位置有时间戳早于w或者为0,则判定未存储过该元素y;如果k个位置的时间戳都大于w,则判定存储过该元素y。
5.如权利要求1所述的方法,其特征在于,所述数据结构为BitMap,k取值为1;将长度为m的BitMap替换为长度为m位的b比特时间数组用于存储写入桶中的元素及其对应的时间戳信息,其中每个桶对应一个b比特时间数组作为对应桶所分配的内存;时间数组的初始状态全部清空为0;当往BitMap中增加一个元素时,该元素被映射进k个桶,如果所映射的桶是空的,则将元素的时间戳对2^b-1取模后作为时间戳信息写入时间数组的对应位置;如果所映射桶非空,则更新时间数组对应位置的时间戳信息。
6.如权利要求1所述的方法,其特征在于,所述数据结构为BitMap,k取值为1;将长度为m的BitMap每n位为一组分配一个64比特的共享标记时间戳,用于作为对应桶所分配的内存存储写入桶中的时间戳,n<m;当一时间戳为t的元素被映射进k个桶:bucket1,bucket2,…,bucketk,它们分别属于第i1,i2,…ik个组;对该元素执行完Bloom Filter的插入操作时,将该元素的时间戳t与该k个桶中每个桶所归属的组所拥有的时间戳进行比对,如果两者差距大于设定的时间间隔Δt,则将对应组中每一位都重新写为0,并更新时间戳为当前元素的时间戳t,否则在所映射桶内写入1。
7.一种基于权利要求5或6所述数据存储方法所存储数据的数据查询方法,其特征在于,当查找元素y是否在距离现在之前的时刻w之后存储过,则将该元素y映射到的k个位置存储的时间戳;如果这k个位置有时间戳早于w或者为0,则判定未存储过该元素y;如果k个位置的时间戳都大于w,则判定存储过该元素y。
8.如权利要求1所述的方法,其特征在于,所述数据结构为Virtual BitMap;将长度为m的Virtual BitMap替换为长度为m位的b比特时间数组用于存储写入桶中的元素及其对应的时间戳信息,其中每个桶对应一个b比特时间数组作为对应桶所分配的内存;时间数组的初始状态全部清空为0;当往Virtual BitMap中增加一个元素时,该元素被映射进k个桶,如果所映射的桶是空的,则将元素的时间戳模去2^b-1后作为时间戳信息写入时间数组的对应位置;如果所映射桶非空,则更新时间数组对应位置的时间戳信息。
9.如权利要求1所述的方法,其特征在于,所述数据结构为Virtual BitMap;对于每一个元素的源地址;在长度为m的Virtual BitMap中为该源地址划分出d个比特位;再将该d个比特位划分为s组,每组分配一个共享时间戳,用于作为对应桶所分配的内存存储写入桶中的时间戳;当一时间戳为t的元素被映射进k个桶:bucket1,bucket2,…,bucketk,它们分别属于第i1,i2,…ik个组;对该元素执行完Bloom Filter的插入操作时,将该元素的时间戳t与该k个桶中每个桶所归属的组所拥有的时间戳进行比对,如果两者差距大于设定的时间间隔Δt,则将对应组中每一位都重新写为0,并更新时间戳为当前元素的时间戳t,否则在所映射桶内写入1。
10.一种基于权利要求8或9所述数据存储方法所存储数据的数据查询方法,其特征在于,当查找元素y是否在距离现在之前的时刻w之后存储过,则将该元素y映射到的k个位置存储的时间戳;如果这k个位置有时间戳早于w或者为0,则判定未存储过该元素y;如果k个位置的时间戳都大于w,则判定存储过该元素y。
11.如权利要求1所述的方法,其特征在于,所述数据结构为HyperLogLog;将长度为m的HyperLogLog替换为长度为m位的b比特时间数组用于存储写入桶中的元素及其对应的时间戳信息,其中每个桶对应一个b比特时间数组作为对应桶所分配的内存;时间数组的初始状态全部清空为0;当往HyperLogLog中增加一个元素时,该元素被映射进k个桶,如果所映射的桶是空的,则将元素的时间戳模去2^b-1后作为时间戳信息写入时间数组的对应位置;如果所映射桶非空,则更新时间数组对应位置的时间戳信息。
12.如权利要求1所述的方法,其特征在于,所述数据结构为HyperLogLog;将长度为m的HyperLogLog每n位为一组分配一个64比特的共享标记时间戳,用于作为对应桶所分配的内存存储写入桶中的时间戳,n<m;当一时间戳为t的元素被映射进k个桶:bucket1,bucket2,…,bucketk,它们分别属于第i1,i2,…ik个组;对该元素执行完HyperLogLog的插入操作时,将该元素的时间戳t与该k个桶中每个桶所归属的组所拥有的时间戳进行比对,如果两者差距大于设定的时间间隔Δt,则将对应组中每一位都重新写为0,并更新时间戳为当前元素的时间戳t,否则在所映射桶内写入1。
13.一种基于权利要求11或12所述数据存储方法所存储数据的数据查询方法,其特征在于,当查找元素y是否在距离现在之前的时刻w之后存储过,则将该元素y映射到的k个位置存储的时间戳;如果这k个位置有时间戳早于w或者为0,则判定未存储过该元素y;如果k个位置的时间戳都大于w,则判定存储过该元素y。
Priority Applications (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN201910623453.2A CN110532307B (zh) | 2019-07-11 | 2019-07-11 | 一种流滑动窗口的数据存储方法及查询方法 |
Applications Claiming Priority (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN201910623453.2A CN110532307B (zh) | 2019-07-11 | 2019-07-11 | 一种流滑动窗口的数据存储方法及查询方法 |
Publications (2)
Publication Number | Publication Date |
---|---|
CN110532307A true CN110532307A (zh) | 2019-12-03 |
CN110532307B CN110532307B (zh) | 2022-05-03 |
Family
ID=68659629
Family Applications (1)
Application Number | Title | Priority Date | Filing Date |
---|---|---|---|
CN201910623453.2A Active CN110532307B (zh) | 2019-07-11 | 2019-07-11 | 一种流滑动窗口的数据存储方法及查询方法 |
Country Status (1)
Country | Link |
---|---|
CN (1) | CN110532307B (zh) |
Cited By (4)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN114189478A (zh) * | 2021-12-01 | 2022-03-15 | 浪潮云信息技术股份公司 | 一种基于滑动窗口算法的分布式限流实现方法及系统 |
CN114595280A (zh) * | 2022-05-10 | 2022-06-07 | 鹏城实验室 | 基于滑动窗口的时间成员查询方法、装置、终端及介质 |
CN115102907A (zh) * | 2022-06-17 | 2022-09-23 | 长沙理工大学 | 一种基于小流过滤的活跃大流精确识别方法和系统 |
CN116800637A (zh) * | 2023-08-28 | 2023-09-22 | 北京傲星科技有限公司 | 数据流中数据项基数的估算方法及相关设备 |
Citations (7)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
US20070294314A1 (en) * | 2006-06-16 | 2007-12-20 | Michael Padovano | Bitmap based synchronization |
CN102253820A (zh) * | 2011-06-16 | 2011-11-23 | 华中科技大学 | 一种流式重复数据检测方法 |
US8260909B2 (en) * | 2006-09-19 | 2012-09-04 | Oracle America, Inc. | Method and apparatus for monitoring a data stream |
CN104579974A (zh) * | 2014-12-22 | 2015-04-29 | 湖南大学 | 面向ndn中名字查找的哈希布鲁姆过滤器及数据转发方法 |
CN104794162A (zh) * | 2015-03-25 | 2015-07-22 | 中国人民大学 | 实时数据存储与查询方法 |
CN108304409A (zh) * | 2017-01-13 | 2018-07-20 | 北京大学 | 一种基于进位的Sketch数据结构的数据频度估计方法 |
CN109669929A (zh) * | 2018-12-14 | 2019-04-23 | 江苏瑞中数据股份有限公司 | 基于分布式并行数据库的实时数据存储方法和系统 |
-
2019
- 2019-07-11 CN CN201910623453.2A patent/CN110532307B/zh active Active
Patent Citations (7)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
US20070294314A1 (en) * | 2006-06-16 | 2007-12-20 | Michael Padovano | Bitmap based synchronization |
US8260909B2 (en) * | 2006-09-19 | 2012-09-04 | Oracle America, Inc. | Method and apparatus for monitoring a data stream |
CN102253820A (zh) * | 2011-06-16 | 2011-11-23 | 华中科技大学 | 一种流式重复数据检测方法 |
CN104579974A (zh) * | 2014-12-22 | 2015-04-29 | 湖南大学 | 面向ndn中名字查找的哈希布鲁姆过滤器及数据转发方法 |
CN104794162A (zh) * | 2015-03-25 | 2015-07-22 | 中国人民大学 | 实时数据存储与查询方法 |
CN108304409A (zh) * | 2017-01-13 | 2018-07-20 | 北京大学 | 一种基于进位的Sketch数据结构的数据频度估计方法 |
CN109669929A (zh) * | 2018-12-14 | 2019-04-23 | 江苏瑞中数据股份有限公司 | 基于分布式并行数据库的实时数据存储方法和系统 |
Non-Patent Citations (3)
Title |
---|
K. SARAVANAN 等: "Modified whirlpool hash based bloom filter for networking and security applications", 《2014 2ND INTERNATIONAL CONFERENCE ON DEVICES, CIRCUITS AND SYSTEMS (ICDCS)》 * |
蒋捷 等: "DCuckoo:基于片内摘要的高性能散列表", 《计算机研究与发展》 * |
魏建生: "高性能重复数据检测与删除技术研究", 《中国优秀博硕士学位论文全文数据库(博士) 信息科技辑》 * |
Cited By (8)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN114189478A (zh) * | 2021-12-01 | 2022-03-15 | 浪潮云信息技术股份公司 | 一种基于滑动窗口算法的分布式限流实现方法及系统 |
CN114189478B (zh) * | 2021-12-01 | 2024-04-16 | 浪潮云信息技术股份公司 | 一种基于滑动窗口算法的分布式限流实现方法及系统 |
CN114595280A (zh) * | 2022-05-10 | 2022-06-07 | 鹏城实验室 | 基于滑动窗口的时间成员查询方法、装置、终端及介质 |
CN114595280B (zh) * | 2022-05-10 | 2022-08-02 | 鹏城实验室 | 基于滑动窗口的时间成员查询方法、装置、终端及介质 |
CN115102907A (zh) * | 2022-06-17 | 2022-09-23 | 长沙理工大学 | 一种基于小流过滤的活跃大流精确识别方法和系统 |
CN115102907B (zh) * | 2022-06-17 | 2024-01-26 | 长沙理工大学 | 一种基于小流过滤的活跃大流精确识别方法和系统 |
CN116800637A (zh) * | 2023-08-28 | 2023-09-22 | 北京傲星科技有限公司 | 数据流中数据项基数的估算方法及相关设备 |
CN116800637B (zh) * | 2023-08-28 | 2023-10-24 | 北京傲星科技有限公司 | 数据流中数据项基数的估算方法及相关设备 |
Also Published As
Publication number | Publication date |
---|---|
CN110532307B (zh) | 2022-05-03 |
Similar Documents
Publication | Publication Date | Title |
---|---|---|
CN110532307A (zh) | 一种流滑动窗口的数据存储方法及查询方法 | |
CN102915347B (zh) | 一种分布式数据流聚类方法及系统 | |
CN104156380B (zh) | 一种分布式存储器哈希索引方法及系统 | |
CN102929936B (zh) | 日志记录方法、日志查询方法及系统 | |
CN105630955B (zh) | 一种高效动态的数据集合成员管理方法 | |
CN108337172A (zh) | 大规模OpenFlow流表分级存储架构与加速查找方法 | |
CN109471905B (zh) | 一种支持时间范围和属性范围复合查询的区块链索引方法 | |
WO2020034757A1 (zh) | 数据处理方法和装置、存储介质及电子装置 | |
CN104426770A (zh) | 路由查找方法及装置、B-Tree树结构的构建方法 | |
EP3251033B1 (en) | Hybrid data distribution in a massively parallel processing architecture | |
CN109521962A (zh) | 一种元数据查询方法、装置、设备及计算机可读存储介质 | |
CN105515997B (zh) | 基于bf_tcam实现零范围扩张的高效范围匹配方法 | |
Yang et al. | Sf-sketch: A fast, accurate, and memory efficient data structure to store frequencies of data items | |
CN113839835B (zh) | 一种基于小流过滤的Top-k流精确监控系统 | |
CN107766445B (zh) | 一种支持多维度检索的高效快速数据检索方法 | |
CN103440249A (zh) | 一种非结构化数据快速检索的系统及方法 | |
CN108304404B (zh) | 一种基于改进的Sketch结构的数据频率估计方法 | |
CN106776810B (zh) | 一种大数据的数据处理系统及方法 | |
CN109522242A (zh) | 一种搜索Cache数据的方法和装置 | |
CN105574076A (zh) | 一种基于Bloom Filter的键值对存储结构及方法 | |
US20140067751A1 (en) | Compressed set representation for sets as measures in olap cubes | |
CN116578589A (zh) | 一种基于连续内存的高速数据查询方法及系统 | |
CN111190545B (zh) | 一种基于软件实现的trie结构进行LPM规则压缩存储的方法 | |
US8533167B1 (en) | Compressed set representation for sets as measures in OLAP cubes | |
CN114416737B (zh) | 基于动态权重均衡时序数据库集群的时序数据存储方法 |
Legal Events
Date | Code | Title | Description |
---|---|---|---|
PB01 | Publication | ||
PB01 | Publication | ||
SE01 | Entry into force of request for substantive examination | ||
SE01 | Entry into force of request for substantive examination | ||
GR01 | Patent grant | ||
GR01 | Patent grant |