一种结构紧凑的键值对存储结构及快速键值对查找方法与流程

文档序号:14403154阅读:200来源:国知局
本发明涉及一种结构紧凑的键值对存储结构及快速键值(key-value)对查找方法,特别涉及一种基于多层次哈希表(hashtable)和布鲁姆过滤器(bloomfilter,bf)的键值对存储和查找方法,属于实时大数据处理及键值查询
技术领域
:。
背景技术
::随着互联网规模的日益扩大,网络流量日益增长,计算机
技术领域
:对大数据存储和查找速率的要求越来越高。键值对查找问题在计算机领域的各个方向如大数据处理和高速网络中应用颇广。然而,键值对查找方法的性能严重受限于硬件资源,因此,在网络功能虚拟化的趋势下,适应软件平台更为重要且更加适应互联网发展。在一个软件平台中会同时处理多种任务,存储和查找方法不能独自占用一整个高速缓存(cache),因此,该方法要谨慎地控制放入cache中的结构大小,且避免频繁替换。然而,现有方法大多数更适应硬件平台,且在查找速度和cache使用效率方面不够高。现在已有的键值对查找方法主要分为哈希表查找,树形查找,以及基于布鲁姆过滤器的查找方法。哈希表方法是较为传统的方法,可以通过确定的时间复杂度o(1)执行键值对的插入,删除,查找,但是哈希表的重要缺点是它需要处理哈希冲突,以至于无法每次都在o(1)复杂度完成。因此,单纯使用哈希表进行方法的基础数据结构设计无法满足当前对键值对查找速度的要求,而减少哈希冲突又需要更大的存储空间,从而导致空间利用率较低。基于布鲁姆过滤器数据结构的方法主要依赖于布鲁姆过滤器结构简单、紧凑的特性。主要方法有多个布鲁姆过滤器组合的方法,布鲁姆过滤器结合数据编码的方法,基于布鲁姆过滤器变形后的数据结构等。这些结构改变了原有布鲁姆过滤器的结构,提升了一定的空间使用率,但是破坏了布鲁姆过滤器原有的简单、紧凑的特性,因此并没有发挥出bloomfilter应有的效果。本发明涉及一种具有紧凑且快速特点的键值对查找方法,提供了一种结构紧凑的键值对存储结构,提高了传统哈希表方法的空间利用率,通过确定的时间复杂度完成键值对的查找,所提出的结构紧凑的键值对存储结构和快速键值对查找方法主要涉及以下两个问题:(1)基于多层哈希表设计,使用2-lefthashing哈希结构为多层次哈希表的首层,保证结构的紧密和空间的高利用率,同时减少哈希冲突;(2)通过多层的布鲁姆过滤器存储对应层哈希表中冲突数据,及提供被查找键是否存在当前层冲突数据集的结果作为查找索引,提高查找速度,减少内存访问次数。技术实现要素:本发明的目的是为了克服现有方法的键值对存储结构不够紧凑的缺陷以及为了解决当前大规模键值对存储和查找时间不确定性,软件实现运行速度过慢达不到应用要求等问题,满足合理利用高速缓存争取更少地进行数据替换的要求,提出一种结构紧凑的键值对存储结构及快速键值对查找方法。本发明的思想是基于分层哈希表和布鲁姆过滤器相结合的结构,通过首层使用2-lefthashing哈希结构存储,每层哈希表都作为辅助表保存在上层表中发生存储冲突的数据,并结合布鲁姆过滤器进行冲突数据的保存,将“布鲁姆过滤器判断所查找的键是否存在当前集合中的结果”作为索引提高查找速度,从而提高存储空间利用率使结构紧凑并实现快速查找的软件平台要求。一种结构紧凑的键值对存储结构及快速键值对查找方法,包括一种结构紧凑的键值对存储结构及一种快速键值对查找方法;其中,一种结构紧凑的键值对存储结构,简称存储结构包括λ层哈希表,从第二层哈希表开始,每层哈希表中包含的总存储块数量呈等比序列递减,其中,优选的等比因子为10;其中,首层哈希表,即第一层哈希表,使用2-lefthashing哈希表,该哈希表存在左右两个子表,每个子表中包含相同个数的存储块;对于其余层哈希表,不存在子表的概念;其中,每个存储块包含n个存储单元,每个存储单元的大小为m比特;其中,m*n的范围小于使用该存储结构的计算机缓存行的大小,优选的n为8,优选的m为32或64比特;每个存储块中第一个存储单元保存该存储块中已被占用的存储单元个数,其余存储单元中存储的是键值对;其中,键值对包括键和值;具体存储时存储的是键的“值”和键的“校验值”;其中,存储的“值”部分可以存储该值本身或者指向值本身存储位置的指针,后文统称为值;键的“校验值”的计算可使用常用的校验算法,如crc循环冗余校验或md5校验算法;除最后一层哈希表外,每层哈希表对应一个布鲁姆过滤器,从第一层布鲁姆过滤器开始,每层布鲁姆过滤器的所占空间大小呈等比序列递减,其中,优选的等比因子为10;一种快速键值对查找方法,包括键值对数据存储过程和键值对查找过程;其中,键值对数据存储过程,即键值对插入过程,简称插入过程;键值对查找过程简称查找过程;其中,插入过程的具体步骤如下:步骤1,设置哈希表层数以及每一层哈希表包含存储块的个数,同时设置每一层哈希表对应的布鲁姆过滤器的大小;步骤2,设置哈希表每个存储块中包含的存储单元的个数n,设置每个存储单元的大小为m比特;步骤2优选的方案是保证存储块的大小m*n比特等于或小于计算机缓存行大小,由此使访问存储块时将整个存储块调入缓存中,避免访问存储块的不同单元时进行多次缓存替换,从而加快查找时间;步骤3,向第一层哈希表,即2-lefthashing,中插入数据,若不冲突,则该键值对插入成功,跳至步骤5;若冲突,则将数据标记在第一层对应的bloomfilter中,并执行步骤4;其中,插入的数据就是键值对的“值”部分,同时也存储了键的“校验值”;步骤3的具体过程为:对键值对中的键进行两次哈希运算,使用两个哈希计算结果在2-lefthashing的左右子表中分别确定一个存储块;其中,每层哈希表的哈希运算是固定的,此处第一层的两次哈希运算也是固定的;当出现如下两种情况,表明插入数据冲突,需要跳至步骤4:3.1a两处存储块中存储单元均被占满,即两处存储块中存储单元个数相同,均为n-1,等于该块中能存储的最大键值对个数,则表明发生插入冲突,进入步骤4;3.1b两处存储块中所有存储单元中保存的校验值存在和欲插入数据或欲插入键值对的“校验值”相同的存储单元,则表明发生插入冲突,进入步骤4;当不满足3.1a和3.1b的两种插入数据冲突情况,即插入数据不冲突时,存在如下两种情况:3.2a两处存储块中单元被占用的个数不同,则将插入数据,即该键的值和该键的校验值保存到被占用单元个数较少的存储块的第一个空闲的存储单元中,跳至步骤6;3.2b两处存储块中单元被占用的个数相同,则将插入数据,即将该键对应的值和该键的校验值保存到左侧存储块的第一个空闲的存储单元中,跳至步骤6;步骤4,判断当前层是否为最后一层,并根据判断结果,若为最后一层,则跳入步骤7,若当前层不是哈希表结构中的最后一层,应向当前层对应的布鲁姆过滤器集合中添加当前键,跳至步骤5;步骤5跳入下一层哈希表中,进行一次哈希运算,使用此哈希运算的结果确定一个存储块位置,通过判断该存储块和当前键是否存在冲突来进行如下操作:当出现插入数据冲突时,需要跳至步骤4:当插入数据不冲突时,将插入数据,即将该键的值和该键的校验值保存到该存储块的第一个空闲的存储单元中,进入步骤6;其中,插入数据冲突,需要跳至步骤4的两种情况如下:5.1a存储块中存储单元被占满,即存储块中存储单元个数为n-1,等于该块中能存储的最大键值对个数,则表明发生插入冲突,需跳至步骤4;5.1b存储块中所有存储单元中保存的校验值存在和欲插入数据或欲插入键值对的“校验值”相同的存储单元,则表明发生插入冲突,需跳至步骤4;步骤6,数据插入成功,即键值对插入函数调用成功,函数返回1,结束插入过程;步骤7,数据插入失败,即键值对插入函数调用失败,函数返回0,结束插入过程;至此,从步骤1到步骤6或步骤7,完成了插入过程;第二部分键值对查找过程,即对于给出键值对中的键,查找对应键值对中的值的过程,简称查找过程,具体步骤如下:步骤8,在第一层布鲁姆过滤器集合中对给出键值对中的键进行查找,通过判断该键是否在该集合中保存,决定跳至步骤10还是步骤9,具体为:8.1若该键不存在第一层布鲁姆过滤器集合中,执行步骤9;8.2若该键存在于第一层布鲁姆过滤器集合中,执行步骤10;步骤9,在2-lefthashing中进行两次哈希计算,其结果在左右子表中分别确定一个存储块;将两个存储块中每个非空单元内的校验值和“根据当前键计算出的校验值”比较,查看是否存在相等的情况,根据判断结果进行如下操作:9.1若存在相等的情况,则表示该单元保存的值即为所查找的键对应的值,跳至步骤14;9.2若不存在相等的情况,则键对应的值不存在于本存储结构中,跳至步骤15;步骤10,进入下一层布鲁姆过滤器,在下一层布鲁姆过滤器集合中对给出的键进行查找,通过判断该键是否在该布鲁姆过滤器集合中来进行如下操作:10.1若该键存在于该布鲁姆过滤器集合中,通过判断当前布鲁姆过滤器所在层是否为最后一层,决定跳至步骤11还是步骤10,具体为:10.1a若当前布鲁姆过滤器所在层不是最后一层,跳至步骤10;10.1b若当前布鲁姆过滤器所在层是最后一层,跳至步骤11;10.2若该键不存在于该层布鲁姆过滤器集合中,进入当前布鲁姆过滤器对应层的哈希表,跳至步骤12;步骤11,进入最后一层哈希表;步骤12,在当前层哈希表中查找键对应的校验值,对键进行一次哈希运算,通过哈希运算的结果在哈希表中确定一个存储块,在存储块中遍历每个非空单元的校验值并比较是否与当前键的校验值相等,根据是否存在相等的情况,判断跳至步骤13还是步骤14,具体为:12.1若存在相等的情况,即找到了相等的校验值,则进入步骤13;12.2若不存在相等的情况,即没找到相等的校验值,则进入步骤14;步骤13,查找函数调用成功,函数返回当前存储单元中保存的值,结束查找;步骤14,查找函数调用失败,函数返回0,结束查找;至此,从步骤1到步骤13或步骤14,完成了一种快速键值对查找方法。有益效果本发明一种结构紧凑的键值对存储结构及快速键值对查找方法,与现有方法相比,具有如下有益效果:1.本发明所述方法通过以2-lefthashing哈希表为首层的分层哈希表保证数据存储的紧凑性,通过使用布鲁姆过滤器存储冲突数据,有效减少了布鲁姆过滤器占用的空间,即有效地解决存储空间利用率低的问题;2.对比已有方法的查找速度慢且不适应软件平台的问题,本方法可以适应软件平台的高速缓存大小,并提高了查找速度,保证了实时性。附图说明图1为本发明实施例一种结构紧凑的键值对快速查找方法(插入过程)流程示意图;图2为本发明实施例一种结构紧凑的键值对快速查找方法(查找过程)流程示意图;图3为本发明中结构紧凑的键值对存储结构示意图;图4为快速键值对查找方法实施例1中插入过程使用2-lefthashing的示意图;图5为快速键值对查找方法实施例2中插入过程使用2-lefthashing的示意图;图6为快速键值对查找方法实施例2中使用查找过程的示意图。具体实施方式为使发明的目的、技术方案及优点更加清楚,下面将结合附图对本发明的具体实施方式进行详细描述。本实施例以本发明技术方案为前提进行实施,给出了详细实施方式和具体操作过程,但本发明的保护范围不限于下述实施例。本发明为一种基于分层的哈希表和布鲁姆过滤器的紧凑的键值对存储结构和快速键值对查找方法,其具体步骤分为两部分,图1所示为第一部分,键值对插入过程,图2所示为第二部分,键值对查找过程。实施例1第一部分键值对插入过程的具体步骤包括:步骤1,设置哈希表层数以及每一层哈希表包含存储块的个数,同时设置每一层哈希表对应的布鲁姆过滤器的大小;本实施例中.如图3所示,设置哈希结构层数为4层,首层哈希表2-lefthashing包括204800个存储块,第二层哈希表包括500个存储块,第三次哈希表包括50个存储块.第四层哈希表包括5个存储块;设置第一层布鲁姆过滤器大小为5000字节,下层依次递减为500字节,50字节;步骤2,设置哈希表每个存储块中包含的存储单元的个数n,设置每个存储单元的大小为m比特;实施例中,设置n为8,m为32比特;每个存储块的大小为8*32=256比特;每个存储单元包括“值”部分和“校验值”部分,值部分占16比特,校验值部分占16比特;首层为2-lefthashing数据结构,该数据结构由两个子表组成,如图4所示;每个子表由相同个数的存储块组成,本实施例中,每个子表包含102400个存储块;步骤3,向第一层哈希表中插入数据,根据判断是否存在冲突执行操作;本实施例中,如图4所示,对键值对(key1,value1)中的key1进行两次哈希运算hash1(key1)和hash2(key1),其中,hash1是左子表使用的哈希函数,hash2是右子表使用的哈希函数,两次哈希运算的结果分别对应到2-lefthashing中左右两个子表中的两处存储块;查看两处存储块的第一个单元,图中两处存储块分别已被占用了2个和4个单元,且不存在校验值冲突,则将value1和key1的校验值存入左侧子表的存储块第一个空闲单元中,并将第一个单元的计数器累加1,存储步骤完毕,进入步骤4;步骤4,插入成功,函数返回1,结束添加步骤;第二部分键值对查找过程,具体步骤如下:步骤5,在第一层布鲁姆过滤器集合中对给出的键进行查找,通过判断该键是否在该集合中保存来进行如下操作:本实施例中,该键不存在第一层布鲁姆过滤器集合中,执行步骤6;步骤6,通过键key1,在第一层2-lefthashing结构中查找键对应的值,根据查找结果判断执行步骤;本实施例中,首先对key1进行hash11(key1)和hash12(key1)运算,在2-lefthashing的两个子表中分别找到一个存储块;计算key1的校验码,将其与两个存储块中所有的校验值进行比较,此时在左侧存储块中找到相同的校验值,表示查找成功,进入步骤7;步骤7,返回找到的value1,结束查找;实施例2第一部分键值对插入过程,结合附图3和5,具体步骤如下:步骤1,设置哈希表层数以及每一层哈希表包含存储块的个数,同时设置每一层哈希表对应的布鲁姆过滤器的大小;本实施例中,设置同实施例1;步骤2,设置哈希表每个存储块中包含的存储单元的个数n,设置每个存储单元的大小为m比特;本实施例中,设置同实施例1;步骤3,向第一层哈希表中插入数据,根据判断是否存在冲突执行操作;本实施例中,对键值对(key2,value2)中的key2进行两次哈希运算hash1(key2)和hash2(key2),该值对应的两个位置如图5所示,均被占用了7个单元,均满,因此产生插入冲突,图3中虚线1表示插入冲突,进入步骤4;步骤4,判断当前层是否为最后一层,并根据判断结果进行操作;当前层不是哈希表结构中的最后一层,应向当前层对应的布鲁姆过滤器集合中添加当前键,如图3中实线2所示,后跳至步骤5;步骤5,跳入下一层哈希表中,进行一次哈希运算,使用此哈希运算的结果确定一个存储块位置,通过判断该存储块和当前键是否存在冲突来进行如下操作:本实施例中,进入第二层哈希表;在第二层哈希表中,进行一次哈希运算,该运算结果确定一个存储块位置,本实施例中,对key2进行一次哈希运算确定一个存储块;当前存储块中,已存储3个数据,未满,再检查key2的校验值是否与当前存储块已存储数据的校验值相同,此处发现相同的校验码,因此key2在第二层哈希表中也产生冲突,图3中虚线3表示在第二层中产生冲突;此时重复步骤4,向第二层布鲁姆过滤器中添加key2,如图3实线4;进入第三层哈希表,向第三层哈希表中插入key2;对key2进行一次哈希运算,映射key2到第三层哈希表的某个存储块;当前存储块中,存储未满,同时验证key2的校验值是该存储块中唯一的,将key2和key2的校验码存入第一个空的单元中,如图3实线5,进入步骤6;步骤6,插入成功,函数返回1,结束添加步骤;第二部分键值对查找过程,结合附图6,具体步骤如下:步骤7,在第一层布鲁姆过滤器集合中查找key2,根据是否找到执行操作;本实施例中,在第一层布鲁姆过滤器中判断key2是否存在,结果为是,如图6实线1,则进入步骤8;步骤8,进入下一层布鲁姆过滤器,在下一层布鲁姆过滤器集合中对给出的键进行查找,通过判断该键是否在该布鲁姆过滤器集合中来进行如下操作;本实施例中,key2存在于第二层布鲁姆过滤器集合中,且不是最后一层,如图6中实线2所示,因此重复步骤8,即进入第三层布鲁姆过滤器,查找key2是否在该集合中;如图6中虚线3所示,key2不存在第三层布鲁姆过滤器集合中,进入步骤9;步骤9,进入当前布鲁姆过滤器对应层的哈希表,执行步骤10;本实施例中,进入第三层哈希表;步骤10,在当前哈希表中查找键对应的值,根据查找结果判断执行步骤;本实施例中,在第三层哈希表中,进行一次哈希运算,根据运算结果确定一个存储块,在该存储块中查找,是否存在和key2校验值相同的校验值;本实施例中找到了相同的校验值,该存储单元中保存的值即为value2或指向value2的指针;步骤11,将value2返回,查找结束。结论本发明主要由紧凑的键值对存储结构及键值对快速查找方法两部分组成,快速查找方法分为添加过程和查找过程。通过使用多层的哈希表存储数据,特别地使用以2-lefthashing哈希表为首层进行多层哈希表存储键值对,保证键值对存储结构的紧凑性。通过使用布鲁姆过滤器记录在对应哈希表中产生冲突的数据,减少内存访问次数,提高对高速缓存的利用。键值对查找的时间开销是较为恒定的,因为95%以上的数据都会存储在2-lefthashing中,在2-lefthashing中的键值对查找平均需要1.5次内存访问,达到了查找速度恒定的目的。通过使用足够小的能保存在高速缓存中的布鲁姆过滤器结构,对其查找不产生内存访问次数,因此查找极快,达到了加快键值对查找在软件实现中速度的目的。自此,就完成了基于首层2-lefthashing,并使用布鲁姆过滤器记录哈希冲突项进行键值对的存储和快速查找方法。虽然结合了附图描述了本发明的实施方式,但是对于本领域技术人员来说,在不脱离本发明原理的前提下,还可以做出若干改进,这些也应视为属于本发明的保护范围。当前第1页12当前第1页12
当前第1页1 2 
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1