一种残膜回收机防缠绕挑膜装置的制 一种秧草收获机用电力驱动行走机构

持久内存动态哈希索引方法、系统、设备及存储介质

2022-04-24 23:51:44 来源:中国专利 TAG:


1.本发明涉及存储器技术领域,尤其涉及一种持久内存动态哈希索引方法、系统、设备及存储介质。


背景技术:

2.在过去的几十年里,传统的存储器技术,包括动态随机存取存储器和静态随机存取存储器,已经被用作存储器体系结构中的主存储器和高速缓存,然而存在着功耗高和可扩展性有限的问题,由于具有高密度,低功耗和非易失性的优点,持久性内存(persistent memory,pm)有望成为补充或替代动态随机存取存储器(dynamic random access memory,dram)构建未来存储系统的存储介质。
3.持久内存的出现导致内存体系结构及其特性发生显著变化,由于忽略了持久内存的属性,使得传统数据索引结构在其上的效率低下,例如:持久性内存在写入耐久性方面存在局限性,与dram相比pm具有3倍的读取延迟和相似的写入延迟,此外,持久内存的写入操作不仅消耗有限的耐久性,而且比dram有更高的读写延迟。
4.当前,基于持久内存的哈希索引方案层出不穷,现有的哈希方案可以有效地适应pm,由于持久性内存的写入性能远不及读性能,因此大部分研究的主要重点是减少哈希表中的pm写入,但在实际应用中,读操作的比例远远高于写操作,一般动态哈希的读操作为:当有键值对(key-value)插入时,首先将经过哈希函数计算后的key前缀与指针数组的目录项(diectory)进行匹配,在进入数据桶时,传统可扩展哈希直接采用线性遍历的方式,找到第一个空数据槽(slot),存放数据,查找时,也是根据计算出的key前缀,匹配相应的目录项,再通过目录项的指针定位数据桶,最后使用顺序遍历的方式查找到对应键值对,现有的基于持久内存的哈希索引方案看似极大程度上缓解了写数据的延迟,但写操作比例仅占小部分的情况下,对整体索引的性能提升不大。


技术实现要素:

5.本发明的主要目的在于提供一种持久内存动态哈希索引方法、系统、设备及存储介质,旨在解决现有技术中基于持久内存的哈希索引方案在写操作比例仅占小部分的情况下对整体索引的性能提升不大的技术问题。
6.第一方面,本发明提供一种持久内存动态哈希索引方法,所述持久内存动态哈希索引方法包括以下步骤:
7.根据预设数据指纹插入算法定位动态哈希结构中的目标数据桶,将哈希键插入所述目标数据桶,所述动态哈希结构包括指针数组、数据桶和段;
8.在所述目标数据桶中不存在空闲位置时,将逻辑上的下一个数据桶作为备用数据桶,将所述哈希键插入所述备用数据桶;
9.在插入所述备用数据桶成功时,判断所述备用数据桶中是否有匹配的数据指纹,若匹配,再将待更新key和所述数据指纹匹配的相应数据槽的key值进行比较,根据键比较
结果进行刷新操作;
10.在插入所述备用数据桶失败时,将发生哈希冲突的段的局部深度与全局深度进行比较,根据深度比较结果进行分裂操作。
11.可选地,所述根据预设数据指纹插入算法定位动态哈希结构中的目标数据桶,将哈希键插入所述目标数据桶,包括:
12.获取动态哈希结构中的指针数组的前缀和后缀;
13.基于数据指纹构建预设数据指纹插入算法;
14.对所述前缀和所述后缀的索引根据所述预设数据指纹插入算法通过哈希函数定位动态哈希结构中的目标数据桶,将哈希键插入所述目标数据桶。
15.可选地,所述在插入所述备用数据桶成功时,判断所述备用数据桶中是否有匹配的数据指纹,若匹配,再将待更新key和所述数据指纹匹配的相应数据槽的key值进行比较,根据键比较结果进行刷新操作,包括:
16.在插入所述备用数据桶成功时,判断所述备用数据桶中是否有匹配的数据指纹,若匹配,再通过最高位定位目录项,找到所述目录项所指向的目标段;
17.根据所述目标段确定对应的目标数据指纹,对所述目标数据指纹进行检索,将所述目标数据指纹中待更新key和所述数据指纹匹配的相应数据槽的key值进行比较,生成键比较结果;
18.根据所述键比较结果进行刷新操作。
19.可选地,所述根据所述键比较结果进行刷新操作,包括:
20.在所述键比较结果为所述待更新key和每个槽存放的key相同时,更新当前key对应的值;
21.在所述键比较结果为所述待更新key和每个槽存放的key不同,且当前数据桶有空闲位置时,将哈希键按顺序插入。
22.可选地,所述在插入所述备用数据桶失败时,将发生哈希冲突的段的局部深度与全局深度进行比较,根据深度比较结果进行分裂操作,包括:
23.在插入所述备用数据桶失败时,将发生哈希冲突的段的局部深度与全局深度进行比较,生成深度比较结果;
24.在所述深度比较结果为所述局部深度小于所述全局深度时,额外创建新的段进行段内部分数据迁移;
25.在所述深度比较结果为所述局部深度等于所述全局深度时,进行目录扩张,并切换当前目录项。
26.可选地,所述在插入所述备用数据桶失败时,将发生哈希冲突的段的局部深度与全局深度进行比较,根据深度比较结果进行分裂操作之后,所述持久内存动态哈希索引方法还包括:
27.在接收到删除指令时,删除当前数据桶的数据,将逻辑上下一个数据桶里的标志位置为1的数据迁移至已删除空闲位置,并且将所述标志位置为0。
28.可选地,所述持久性内存的目录项有且仅有一个指向某个段的指针;所述段内有若干数据桶,所述数据桶里有若干槽,一个槽存放一条数据,所述动态哈希结构使用全局深度和局部深度来表示段和指向段的指针之间的数量关系,其中,所述全局深度用于确定目
录项的位数,所述局部深度用于指示段中公共哈希键的长度。
29.第二方面,为实现上述目的,本发明还提出一种持久内存动态哈希索引系统,所述持久内存动态哈希索引系统包括:
30.插入模块,用于根据预设数据指纹插入算法定位动态哈希结构中的目标数据桶,将哈希键插入所述目标数据桶,所述动态哈希结构包括指针数组、数据桶和段;
31.备用模块,用于在所述目标数据桶中不存在空闲位置时,将逻辑上的下一个数据桶作为备用数据桶,将所述哈希键插入所述备用数据桶;
32.刷新模块,用于在插入所述备用数据桶成功时,判断所述备用数据桶中是否有匹配的数据指纹,若匹配,再将待更新key和所述数据指纹匹配的相应数据槽的key值进行比较,根据键比较结果进行刷新操作;
33.分裂模块,用于在插入所述备用数据桶失败时,将发生哈希冲突的段的局部深度与全局深度进行比较,根据深度比较结果进行分裂操作。
34.第三方面,为实现上述目的,本发明还提出一种持久内存动态哈希索引设备,所述持久内存动态哈希索引设备包括:存储器、处理器及存储在所述存储器上并可在所述处理器上运行的持久内存动态哈希索引程序,所述持久内存动态哈希索引程序配置为实现如上文所述的持久内存动态哈希索引方法的步骤。
35.第四方面,为实现上述目的,本发明还提出一种存储介质,所述存储介质上存储有持久内存动态哈希索引程序,所述持久内存动态哈希索引程序被处理器执行时实现如上文所述的持久内存动态哈希索引方法的步骤。
36.本发明提出的持久内存动态哈希索引方法,通过预设数据指纹插入算法定位动态哈希结构中的目标数据桶,将哈希键插入所述目标数据桶,所述动态哈希结构包括指针数组、数据桶和段;在所述目标数据桶中不存在空闲位置时,将逻辑上的下一个数据桶作为备用数据桶,将所述哈希键插入所述备用数据桶;在插入所述备用数据桶成功时,判断所述备用数据桶中是否有匹配的数据指纹,若匹配,再将待更新key和所述数据指纹匹配的相应数据槽的key值进行比较,根据键比较结果进行刷新操作;在插入所述备用数据桶失败时,将发生哈希冲突的段的局部深度与全局深度进行比较,根据深度比较结果进行分裂操作,能够提高持久内存动态哈希索引速度和效率,提高了插入性能和空间利用率,减少不必要的读写开销,提升了持久内存哈希索引的性能。
附图说明
37.图1为本发明实施例方案涉及的硬件运行环境的设备结构示意图;
38.图2为本发明持久内存动态哈希索引方法第一实施例的流程示意图;
39.图3为本发明持久内存动态哈希索引方法第二实施例的流程示意图;
40.图4为本发明持久内存动态哈希索引方法第三实施例的流程示意图;
41.图5为本发明持久内存动态哈希索引方法第四实施例的流程示意图;
42.图6为本发明持久内存动态哈希索引方法第五实施例的流程示意图;
43.图7为本发明持久内存动态哈希索引方法动态哈希结构的逻辑结构示意图;
44.图8为本发明持久内存动态哈希索引方法动态哈希结构的数据桶内部结构示意图;
45.图9为本发明持久内存动态哈希索引方法动态哈希结构的索引操作示意图;
46.图10为本发明持久内存动态哈希索引方法动态哈希结构的指针数组扩张示意图;
47.图11为本发明持久内存动态哈希索引系统第一实施例的功能模块图。
48.本发明目的的实现、功能特点及优点将结合实施例,参照附图做进一步说明。
具体实施方式
49.应当理解,此处所描述的具体实施例仅仅用以解释本发明,并不用于限定本发明。
50.本发明实施例的解决方案主要是:通过预设数据指纹插入算法定位动态哈希结构中的目标数据桶,将哈希键插入所述目标数据桶,所述动态哈希结构包括指针数组、数据桶和段;在所述目标数据桶中不存在空闲位置时,将逻辑上的下一个数据桶作为备用数据桶,将所述哈希键插入所述备用数据桶;在插入所述备用数据桶成功时,判断所述备用数据桶中是否有匹配的数据指纹,若匹配,再将待更新key和所述数据指纹匹配的相应数据槽的key值进行比较,根据键比较结果进行刷新操作;在插入所述备用数据桶失败时,将发生哈希冲突的段的局部深度与全局深度进行比较,根据深度比较结果进行分裂操作,能够提高持久内存动态哈希索引速度和效率,提高了插入性能和空间利用率,减少不必要的读写开销,提升了持久内存哈希索引的性能,解决了现有技术中基于持久内存的哈希索引方案在写操作比例仅占小部分的情况下对整体索引的性能提升不大的技术问题。
51.参照图1,图1为本发明实施例方案涉及的硬件运行环境的设备结构示意图。
52.如图1所示,该设备可以包括:处理器1001,例如cpu,通信总线1002、用户接口1003,网络接口1004,存储器1005。其中,通信总线1002用于实现这些组件之间的连接通信。用户接口1003可以包括显示屏(display)、输入单元比如键盘(keyboard),可选用户接口1003还可以包括标准的有线接口、无线接口。网络接口1004可选的可以包括标准的有线接口、无线接口(如wi-fi接口)。存储器1005可以是高速ram存储器,也可以是稳定的存储器(non-volatile memory),例如磁盘存储器。存储器1005可选的还可以是独立于前述处理器1001的存储装置。
53.本领域技术人员可以理解,图1中示出的设备结构并不构成对该设备的限定,可以包括比图示更多或更少的部件,或者组合某些部件,或者不同的部件布置。
54.如图1所示,作为一种存储介质的存储器1005中可以包括操作系统、网络通信模块、用户接口模块以及持久内存动态哈希索引程序。
55.本发明设备通过处理器1001调用存储器1005中存储的持久内存动态哈希索引程序,并执行以下操作:
56.根据预设数据指纹插入算法定位动态哈希结构中的目标数据桶,将哈希键插入所述目标数据桶,所述动态哈希结构包括指针数组、数据桶和段;
57.在所述目标数据桶中不存在空闲位置时,将逻辑上的下一个数据桶作为备用数据桶,将所述哈希键插入所述备用数据桶;
58.在插入所述备用数据桶成功时,判断所述备用数据桶中是否有匹配的数据指纹,若匹配,再将待更新key和所述数据指纹匹配的相应数据槽的key值进行比较,根据键比较结果进行刷新操作;
59.在插入所述备用数据桶失败时,将发生哈希冲突的段的局部深度与全局深度进行
比较,根据深度比较结果进行分裂操作。
60.本发明设备通过处理器1001调用存储器1005中存储的持久内存动态哈希索引程序,还执行以下操作:
61.获取动态哈希结构中的指针数组的前缀和后缀;
62.基于数据指纹构建预设数据指纹插入算法,对所述前缀和所述后缀的索引根据所述预设数据指纹插入算法通过哈希函数定位动态哈希结构中的目标数据桶,将哈希键插入所述目标数据桶。
63.本发明设备通过处理器1001调用存储器1005中存储的持久内存动态哈希索引程序,还执行以下操作:
64.在插入所述备用数据桶成功时,判断所述备用数据桶中是否有匹配的数据指纹,若匹配,再通过最高位定位目录项,找到所述目录项所指向的目标段;
65.根据所述目标段确定对应的目标数据指纹,对所述目标数据指纹进行检索,将所述目标数据指纹中待更新key和所述数据指纹匹配的相应数据槽的key值进行比较,生成键比较结果;
66.根据所述键比较结果进行刷新操作。
67.本发明设备通过处理器1001调用存储器1005中存储的持久内存动态哈希索引程序,还执行以下操作:
68.在所述键比较结果为所述待更新key和每个槽存放的key相同时,更新当前key对应的值;
69.在所述键比较结果为所述待更新key和每个槽存放的key不同,且当前数据桶有空闲位置时,将哈希键按顺序插入。
70.本发明设备通过处理器1001调用存储器1005中存储的持久内存动态哈希索引程序,还执行以下操作:
71.在插入所述备用数据桶失败时,将发生哈希冲突的段的局部深度与全局深度进行比较,生成深度比较结果;
72.在所述深度比较结果为所述局部深度小于所述全局深度时,额外创建新的段进行段内部分数据迁移;
73.在所述深度比较结果为所述局部深度等于所述全局深度时,进行目录扩张,并切换当前目录项。
74.本发明设备通过处理器1001调用存储器1005中存储的持久内存动态哈希索引程序,还执行以下操作:
75.在接收到删除指令时,删除当前数据桶的数据,将逻辑上下一个数据桶里的标志位置为1的数据迁移至已删除空闲位置,并且将所述标志位置为0。
76.本发明设备通过处理器1001调用存储器1005中存储的持久内存动态哈希索引程序,还执行以下操作:
77.所述持久性内存的目录项有且仅有一个指向某个段的指针;所述段内有若干数据桶,所述数据桶里有若干槽,一个槽存放一条数据,所述动态哈希结构使用全局深度和局部深度来表示段和指向段的指针之间的数量关系,其中,所述全局深度用于确定目录项的位数,所述局部深度用于指示段中公共哈希键的长度。
78.本实施例通过上述方案,通过预设数据指纹插入算法定位动态哈希结构中的目标数据桶,将哈希键插入所述目标数据桶,所述动态哈希结构包括指针数组、数据桶和段;在所述目标数据桶中不存在空闲位置时,将逻辑上的下一个数据桶作为备用数据桶,将所述哈希键插入所述备用数据桶;在插入所述备用数据桶成功时,判断所述备用数据桶中是否有匹配的数据指纹,若匹配,再将待更新key和所述数据指纹匹配的相应数据槽的key值进行比较,根据键比较结果进行刷新操作;在插入所述备用数据桶失败时,将发生哈希冲突的段的局部深度与全局深度进行比较,根据深度比较结果进行分裂操作,能够提高持久内存动态哈希索引速度和效率,提高了插入性能和空间利用率,减少不必要的读写开销,提升了持久内存哈希索引的性能。
79.基于上述硬件结构,提出本发明持久内存动态哈希索引方法实施例。
80.参照图2,图2为本发明持久内存动态哈希索引方法第一实施例的流程示意图。
81.在第一实施例中,所述持久内存动态哈希索引方法包括以下步骤:
82.步骤s10、根据预设数据指纹插入算法定位动态哈希结构中的目标数据桶,将哈希键插入所述目标数据桶,所述动态哈希结构包括指针数组、数据桶和段。
83.需要说明的是,所述预设数据指纹插入算法为预先设置的基于数据指纹的算法,所述动态哈希结构包括指针数组、数据桶和段,段为中间结构,用于减少顺序查找长度;根据预设数据指纹插入算法可以定位动态哈希结构中的目标数据桶,将哈希键插入所述目标数据桶,即采用基于数据指纹的插入算法定位哈希键插入的数据桶,先选择数据桶进行插入。
84.步骤s20、在所述目标数据桶中不存在空闲位置时,将逻辑上的下一个数据桶作为备用数据桶,将所述哈希键插入所述备用数据桶。
85.可以理解的是,在所述目标数据桶中不存在空闲位置时,即所述目标数据桶已满时,可以选择逻辑上的下一个数据桶作为备用数据桶存放数据,相关操作包括:插入操作、刷新操作、分裂操作及删除操作,插入操作即为将所述哈希键插入所述备用数据桶。
86.步骤s30、在插入所述备用数据桶成功时,判断所述备用数据桶中是否有匹配的数据指纹,若匹配,再将待更新key和所述数据指纹匹配的相应数据槽的key值进行比较,根据键比较结果进行刷新操作。
87.应当理解的是,在插入所述备用数据桶成功时,先比较数据指纹,若匹配则进一步比较key值是否相等,即判断所述备用数据桶中是否有匹配的数据指纹,若匹配,再可以将需要更新的key和每个槽中存放的key进行比较,从而生成键比较结果进行相应更新,即进行刷新操作。
88.可以理解的是,刷新操作一般采用原位刷新,即要刷新的数据的key的数据指纹与指定数据桶的数据指纹比较,若有数据指纹匹配的数据就进一步比较key值,若key值一致,说明就是需要刷新的数据,用新的value值覆盖旧value值。
89.步骤s40、在插入所述备用数据桶失败时,将发生哈希冲突的段的局部深度与全局深度进行比较,根据深度比较结果进行分裂操作。
90.应当理解的是,在插入所述备用数据桶失败时,可以进行分裂操作,即将发生哈希冲突的段的局部深度与全局深度进行比较,根据深度比较结果进行分裂操作。
91.需要说明的是,所述持久性内存的目录项有且仅有一个指向某个段的指针;所述
段内有若干数据桶,所述数据桶里有若干槽,一个槽存放一条数据,所述动态哈希结构使用全局深度和局部深度来表示段和指向段的指针之间的数量关系,其中,所述全局深度用于确定目录项的位数,所述局部深度用于指示段中公共哈希键的长度;指针数组和数据桶以及一个中间结构,称为段,用于减少顺序查找长度;一个目录项有且仅有一个指向某个段的指针;段内有多个数据桶,桶里有若干槽(slot);一个slot存放一条数据;为解决三层结构中的插入查找问题,每个数据桶都有一个序号用于匹配经过哈希函数计算后的key后缀;这样,当插入一个键值对时,先通过前缀确定要插入的段,再匹配后缀确定最后存放的数据桶;与传统可扩展哈希一样,该索引也使用全局深度和局部深度来表示段和指向段的指针之间的数量关系;其中,全局深度(global depth)g表示用于确定目录项的位数;因此,它确定了最大的段数,即指针数组有2g个目录项;局部深度(local depth)l指示段中公共哈希键的长度;。
92.本实施例通过上述方案,通过预设数据指纹插入算法定位动态哈希结构中的目标数据桶,将哈希键插入所述目标数据桶,所述动态哈希结构包括指针数组、数据桶和段;在所述目标数据桶中不存在空闲位置时,将逻辑上的下一个数据桶作为备用数据桶,将所述哈希键插入所述备用数据桶;在插入所述备用数据桶成功时,判断所述备用数据桶中是否有匹配的数据指纹,若匹配,再将待更新key和所述数据指纹匹配的相应数据槽的key值进行比较,根据键比较结果进行刷新操作;在插入所述备用数据桶失败时,将发生哈希冲突的段的局部深度与全局深度进行比较,根据深度比较结果进行分裂操作,能够提高持久内存动态哈希索引速度和效率,提高了插入性能和空间利用率,减少不必要的读写开销,提升了持久内存哈希索引的性能。
93.进一步地,图3为本发明持久内存动态哈希索引方法第二实施例的流程示意图,如图3所示,基于第一实施例提出本发明持久内存动态哈希索引方法第二实施例,在本实施例中,所述步骤s10具体包括以下步骤:
94.步骤s11、获取动态哈希结构中的指针数组的前缀和后缀。
95.需要说明的是,动态哈希结构中的指针数组的前缀为目录项,指针数组的每一个目录项代表一个可以匹配经过哈希函数计算后的key的前缀,并且指针指向一个确定的段,所述后缀为数据桶对应的序号,每个数据桶都有一个序号用于匹配经过哈希函数计算后的key后缀。
96.步骤s12、基于数据指纹构建预设数据指纹插入算法,对所述前缀和所述后缀的索引根据所述预设数据指纹插入算法通过哈希函数定位动态哈希结构中的目标数据桶,将哈希键插入所述目标数据桶。
97.可以理解的是,基于数据指纹构建对应的插入算法,即预设数据指纹插入算法,所述前缀和所述后缀的索引可以采用插入算法定位哈希键插入的目标数据桶,然后将哈希键插入所述目标数据桶;数据指纹是哈希值的一字节散列,通过在搜索过程中首先扫描它们,充当过滤器,以避免探测与指纹不匹配的数据,所述数据桶索引利用数据指纹先确定需要查找的数据是否已在桶内储存,若数据已存在,则自动更新,若不存在,则将数据插入进数据桶中,因此设置基于数据指纹算法能够预先判断出数据是否存在,可以减少不必要的读取,加快操作性能。
98.本实施例通过上述方案,通过获取动态哈希结构中的指针数组的前缀和后缀;基
于数据指纹构建预设数据指纹插入算法,对所述前缀和所述后缀的索引根据所述预设数据指纹插入算法通过哈希函数定位动态哈希结构中的目标数据桶,将哈希键插入所述目标数据桶;能够将哈希键快速插入所述目标数据桶,能够提高持久内存动态哈希索引速度和效率。
99.进一步地,图4为本发明持久内存动态哈希索引方法第三实施例的流程示意图,如图4所示,基于第一实施例提出本发明持久内存动态哈希索引方法第三实施例,在本实施例中,所述步骤s30具体包括以下步骤:
100.步骤s31、在插入所述备用数据桶成功时,判断所述备用数据桶中是否有匹配的数据指纹,若匹配,再通过最高位定位目录项,找到所述目录项所指向的目标段。
101.需要说明的是,在插入所述备用数据桶成功时,判断所述备用数据桶中是否有匹配的数据指纹,若匹配,再可以通过最高位定位目录项,找到目录项所指向的段,即目标段。
102.步骤s32、根据所述目标段确定对应的目标数据指纹,对所述目标数据指纹进行检索,将所述目标数据指纹中待更新key和所述数据指纹匹配的相应数据槽的key值进行比较,生成键比较结果。
103.可以理解的是,根据所述目标段可以确定对应的目标数据指纹,对所述目标数据指纹进行检索,通过将所述目标数据指纹中待更新key和所述数据指纹匹配的相应数据槽的key值进行比较,可以生成键比较结果。
104.在具体实现中,许多基于持久性内存的动态哈希结构为了减少读写开销往往是在哈希表扩展后使用新数据覆盖无效数据,但是,这样会出现相同键值对同时出现在不同的数据桶中,浪费了空间,且很可能出现读数据出错,而利用了就地刷新,既去除了重复的键值对,提高了空间利用率,且没有引入过多的读写开销
105.步骤s33、根据所述键比较结果进行刷新操作。
106.应当理解的是,根据所述键比较结果可以进行刷新操作。
107.进一步的,所述步骤s33具体包括以下步骤:
108.在所述键比较结果为所述待更新key和每个槽存放的key相同时,更新当前key对应的值;
109.在所述键比较结果为所述待更新key和每个槽存放的key不同,且当前数据桶有空闲位置时,将哈希键按顺序插入。
110.可以理解的是,若存在key与插入key相同时,则数据指纹一定可以匹配,说明就是需要刷新的数据,则直接更新更新当前key对应的值,用新的value值覆盖旧value值;若不存在key与插入key相同时,若数据桶都有空闲位置,哈希键顺序插入,否则插入失败,进行分裂操作。
111.本实施例通过上述方案,通过在插入所述备用数据桶成功时,判断所述备用数据桶中是否有匹配的数据指纹,若匹配,再通过最高位定位目录项,找到所述目录项所指向的目标段;根据所述目标段确定对应的目标数据指纹,对所述目标数据指纹进行检索,将所述目标数据指纹中待更新key和所述数据指纹匹配的相应数据槽的key值进行比较,生成键比较结果;根据所述键比较结果进行刷新操作,能够提高持久内存动态哈希索引速度和效率,提高了插入性能和空间利用率。
112.进一步地,图5为本发明持久内存动态哈希索引方法第四实施例的流程示意图,如
图5所示,基于第一实施例提出本发明持久内存动态哈希索引方法第四实施例,在本实施例中,所述步骤s40具体包括以下步骤:
113.步骤s41、在插入所述备用数据桶失败时,将发生哈希冲突的段的局部深度与全局深度进行比较,生成深度比较结果。
114.需要说明的是,使用全局深度和局部深度来表示段和指向段的指针之间的数量关系,在插入所述备用数据桶失败时,将发生哈希冲突的段的局部深度与全局深度进行比较,可以获得比较大小对应的深度比较结果。
115.在具体实现中,全局深度(global depth)g表示用于确定目录项的位数,即指针数组有2g个目录项,局部深度(local depth)l指示段中公共哈希键的长度,k表示指向该数据桶的指针,如果段由k个目录条目指向,则段的局部深度为采用l是因为动态哈希扩张之后不一定是一个目录项(directory entry)对应一个段,由于扩张后目录项的数目多于原有的段数,只有在键值对需要移动到新创建的数据桶时新的段才会创建。
116.步骤s42、在所述深度比较结果为所述局部深度小于所述全局深度时,额外创建新的段进行段内部分数据迁移。
117.可以理解的是,在所述深度比较结果为所述局部深度小于所述全局深度时,即发生哈希冲突的段的局部深度l小于全局深度g,仅需要额外创建新的段进行段内部分数据迁移而无需扩张目录(即指针数组)。
118.步骤s43、在所述深度比较结果为所述局部深度等于所述全局深度时,进行目录扩张,并切换当前目录项。
119.应当理解的是,若发生哈希冲突的段的局部深度l等于全局深度g,则需要进行目录扩张和目录项指针的切换。
120.在具体实现中,分裂操作包含两种情况:当发生冲突的段的局部深度小于全局深度时,仅创建新段,同时将指向原段的一个多余目录项指针转而指向新段,该目录项指针对应的有效键值对也转移到新段中,原段中的键值对进行删除操作;当发生冲突的段的局部深度等于全局深度时,指针数组翻倍,目录项指针也需要重新指向新的段。
121.本实施例通过上述方案,通过在插入所述备用数据桶失败时,将发生哈希冲突的段的局部深度与全局深度进行比较,生成深度比较结果;在所述深度比较结果为所述局部深度小于所述全局深度时,额外创建新的段进行段内部分数据迁移;在所述深度比较结果为所述局部深度等于所述全局深度时,进行目录扩张,并切换当前目录项,能够根据不同的深度比较结果快速确定不同的分裂操作,提高了插入性能和空间利用率,减少不必要的读写开销,提升了持久内存哈希索引的性能。
122.进一步地,图6为本发明持久内存动态哈希索引方法第五实施例的流程示意图,如图6所示,基于第一实施例提出本发明持久内存动态哈希索引方法第五实施例,在本实施例中,所述步骤s40之后,所述持久内存动态哈希索引方法还包括以下步骤:
123.步骤s50、在接收到删除指令时,删除当前数据桶的数据,将逻辑上下一个数据桶里的标志位置为1的数据迁移至已删除空闲位置,并且将所述标志位置为0。
124.需要说明的是,在接收到删除指令时,可以使用token标志位技术进行删除操作,即删除当前数据桶的数据,将逻辑上下一个数据桶里的标志位置为1的数据迁移至已删除空闲位置,并且将所述标志位置为0,从而减少查找该桶数据的平均线性探测长度。
125.在具体实现中,一般基于持久性内存pm的动态哈希结构为了减少额外的写入开销,通常采用惰性删除:每当需要创建新的段,将原有段的部分键值对迁移至新段时,不立刻删除已迁移的原有数据桶的键值对,而是当原有数据桶有新的数据插入时,直接替换已经迁移的键值对,这样可以减少哈希表扩张时的开销,从而提高性能,但实际上不立刻删除无效数据会降低空间利用率,增加哈希扩张的频率,反而从整体上看增加了系统开销。
126.进一步,可扩展的,可以基于本发明持久内存的动态哈希索引为了实现无锁操作,即:
127.为每一个数据桶附加了一个锁标志lock和版本号v,利用比照(compare and set,cas)机制获取与释放锁,cas机制有3个操作数,分别为内存值value、旧的预期值expect、要修改后的值now,有且仅当value等于expect时,才将value修改为now,并且返回true,如果失败则返回false;cas指令是原子的,比对和修改操作不彼此分割,只能同时完成或者同时不完成;基于此,hydh在申请锁的时候,只需要通过cas指令将锁标志从0修改为1即可,释放锁的时候通过cas指令将锁标志从1修改为0,因此cas修改操作最多只有1个线程会成功并且返回true,其他失败的线程便不断重试直到返回true;版本号v为在乐观并发中设置的现场信息,规定只要对数据进行了修改,就必须同时就将版本号加1,这样查询线程只需要在查询前后比对版本号信息就可以知道,在查询过程中是否有其他线程进行了修改,版本号一致则返回,不一致则重试。
128.可以理解的是,采用本发明基于持久内存的读优化动态哈希索引结构,不同于一般动态哈希索引的是,在二级索引过程中,该索引结构使用了基于数据指纹的算法,这样使得对于不存在的数据无需像一般哈希索引一样遍历完整个数据桶,而可以立刻终止操作返回错误;该索引还提供了无锁查询,利用cas机制减少以往悲观锁带来的额外开销;此外,该索引的就地刷新和删除操作能为查找等操作提供便利,使得与此同时,这项操作相比于惰性删除还可以减少动态哈希索引结构的分裂操作,提高插入性能。
129.参见图7,图7为本发明持久内存动态哈希索引方法动态哈希结构的逻辑结构示意图,如图7所示,该索引在结构上比传统可扩展哈希多采用了一个中间结构,称为段segment,一个segment由n个数据桶bucket组成,为解决三层结构中的插入查找问题,引入了哈希前缀hash prefix前缀索引和后缀索引,其中,前缀索引由全局深度g和局部深度l实现,后缀索引在插入算法中用于定位哈希键插入哪个数据桶bucket。
130.相应地,数据桶结构示例可以参照图8,图8为本发明持久内存动态哈希索引方法动态哈希结构的数据桶内部结构示意图,数据桶由元数据metadata和键值对key-value pairs组成,其中元数据metadata由版本锁version lock、令牌token和指纹fingerprint组成。
131.参见图9,图9为本发明持久内存动态哈希索引方法动态哈希结构的索引操作示意图,如图9所示,假设给定的哈希键是01000010...00000001,hydh初始时全局深度g(global depth)为2,因此,将最高位的前两位作为段索引,将最低有效字节用作bucket索引,l表示局部深度(local depth),k表示指向该数据桶的指针数,采用局部深度l,是因为可扩展哈希扩张之后不一定是一个目录项(directory)对应一个段,由于扩张后目录项的数目多于原有的段数,只有在键值对需要移动到新创建的数据桶时新的段才会创建。
132.进一步的,参见图10,图10为本发明持久内存动态哈希索引方法动态哈希结构的指针数组扩张示意图,如图10所示,目录项双倍扩张(directory doubling)操作:根据most significant bits扩张,其中白色表示扩张之前的目录项,灰色代表扩张之后新增目录项。
133.插入操作:当键01000010...00000001插入时,首先通过most significant bits即前缀索引定位至01目录项,找到01目录项指针所指向的segment,然后根据哈希函数找到可插入的数据桶;首先对可插入的两个数据桶的数据指纹进行遍历,若不存在相匹配的数据指纹,且数据桶未满,则键顺序插入进第一个空闲槽中并且添加上对应位置的与该key值相匹配的数据指纹;若数据桶已满,则进行分裂操作;此外,数据插入涉及数据的写入,所以为了保证插入时可能出现系统崩溃而数据不一致;该结构还引入了token标志位技术,若数据所插入的桶是逻辑上的第一个桶则token记为0,若插入的是逻辑上的第二个桶则token置为1;如果在持久化token之前系统发生意外断电,此时部分数据已经成功持久化,因为token却没有持久化到不易丢失的存储(non-volatile memory,nvm)中,token对应的bit位并没有修改,系统认为之前写入的数据是无效的,因此会重复之前的插入操作;另外一种可能的情况为当对token进行写入时发生系统奔溃,此时依然不会产生数据一致性问题;因为token的大小为1b,不大于8b,cpu原子写的大小一般为8b,当数据量不超过8b时的写入是原子性的,不会出现部分写入情况,只有8b全部成功写入或者完全没有写入这两种情况,所以token写入环节也不会产生奔溃一致性问题;总结以上2种情况,可以发现在插入过程中数据的一致性得到了很好的保障;同时,无锁操作也会在插入操作的前后起作用:在遍历数据桶前读取一次版本号信息v1,用于之后进行版本号匹配;操作完成后再一次读取版号信息v2,同之前读取的v1进行匹配,如果版本号一致,说明在读取过程中,没有其他线程对桶内数据进行修改,便立即返回查询结果;如果版本号发生变化,说明在读取过程中,可能有其他线程修改了读取的数据,为了数据的准确性,必须进行重试。
134.刷新操作:针对刷新操作,由于在插入时会对可插入的数据桶里的数据指纹进行对比,若已经存在相匹配的数据指纹,则直接更新这个槽slot里key对应的value值;即存在相匹配的数据指纹时,需要进一步对key值进行匹配,当需要刷新的key值与比较key值一致,则直接更新value值;此外,保证数据一致性也用到了版本号标志位和token标志位技术。
135.删除操作:当删除一个key-value时,定位数据桶的操作桶插入算法一样。当找到数据桶后遍历数据指纹,若无与之匹配的数据指纹则说明该数据不存在,立即函数返回;若有匹配的数据指纹,则只需要将数据指纹置为空即可;当操作完成后将桶的版本号加1,版号加1说明对桶内的数据进行了修改,可以修改通过版本号可以被查询线程所感知;此外,保证数据一致性也用到了版本号标志位和token标志位技术;当删除该桶数据后,可将逻辑上下一个桶里token置为1的数据迁移至已删除数据的空闲位置;这样一来,可以减少查找该桶数据的平均线性探测长度。
136.分裂操作:分裂操作分为两种:1、当发生哈希冲突的段的局部深度l小于全局深度g,说明存在多个目录项指针同时指向这个段;因此,仅需要额外创建新的段进行段内部分数据迁移而无需扩张目录(指针数组);2、当发生哈希冲突的段的局部深度l等于全局深度g,说明仅有一个指针指向该段,则需要进行目录扩张和目录项指针的切换;全局深度g和各个段的局部深度l也要相应变化(全局深度的前缀索引增加一位,局部深度根据全局深度以
及指针数量修改)。
137.本实施例通过上述方案,通过在接收到删除指令时,删除当前数据桶的数据,将逻辑上下一个数据桶里的标志位置为1的数据迁移至已删除空闲位置,并且将所述标志位置为0,可以少查找该桶数据的平均线性探测长度,进一步提升了持久内存哈希索引的性能。
138.相应地,本发明进一步提供一种持久内存动态哈希索引系统。
139.参照图11,图11为本发明持久内存动态哈希索引系统第一实施例的功能模块图。
140.本发明持久内存动态哈希索引系统第一实施例中,该持久内存动态哈希索引系统包括:
141.插入模块10,用于根据预设数据指纹插入算法定位动态哈希结构中的目标数据桶,将哈希键插入所述目标数据桶,所述动态哈希结构包括指针数组、数据桶和段。
142.备用模块20,用于在所述目标数据桶中不存在空闲位置时,将逻辑上的下一个数据桶作为备用数据桶,将所述哈希键插入所述备用数据桶。
143.刷新模块30,用于在插入所述备用数据桶成功时,判断所述备用数据桶中是否有匹配的数据指纹,若匹配,再将待更新key和所述数据指纹匹配的相应数据槽的key值进行比较,根据键比较结果进行刷新操作。
144.分裂模块40,用于在插入所述备用数据桶失败时,将发生哈希冲突的段的局部深度与全局深度进行比较,根据深度比较结果进行分裂操作。
145.所述插入模块10,还用于获取动态哈希结构中的指针数组的前缀和后缀;基于数据指纹构建预设数据指纹插入算法,对所述前缀和所述后缀的索引根据所述预设数据指纹插入算法通过哈希函数定位动态哈希结构中的目标数据桶,将哈希键插入所述目标数据桶。
146.所述刷新模块30,还用于在插入所述备用数据桶成功时,判断所述备用数据桶中是否有匹配的数据指纹,若匹配,再通过最高位定位目录项,找到所述目录项所指向的目标段;根据所述目标段确定对应的目标数据指纹,对所述目标数据指纹进行检索,将所述目标数据指纹中待更新key和所述数据指纹匹配的相应数据槽的key值进行比较,生成键比较结果;根据所述键比较结果进行刷新操作。
147.所述刷新模块30,还用于在所述键比较结果为所述待更新key和每个槽存放的key相同时,更新当前key对应的值;在所述键比较结果为所述待更新key和每个槽存放的key不同,且当前数据桶有空闲位置时,将哈希键按顺序插入。
148.所述分裂模块40,还用于在插入所述备用数据桶失败时,将发生哈希冲突的段的局部深度与全局深度进行比较,生成深度比较结果;在所述深度比较结果为所述局部深度小于所述全局深度时,额外创建新的段进行段内部分数据迁移;在所述深度比较结果为所述局部深度等于所述全局深度时,进行目录扩张,并切换当前目录项。
149.进一步的,还包括删除模块,用于在接收到删除指令时,删除当前数据桶的数据,将逻辑上下一个数据桶里的标志位置为1的数据迁移至已删除空闲位置,并且将所述标志位置为0。
150.其中,持久内存动态哈希索引系统的各个功能模块实现的步骤可参照本发明持久内存动态哈希索引方法的各个实施例,此处不再赘述。
151.此外,本发明实施例还提出一种存储介质,所述存储介质上存储有持久内存动态
哈希索引程序,所述持久内存动态哈希索引程序被处理器执行时实现如下操作:
152.根据预设数据指纹插入算法定位动态哈希结构中的目标数据桶,将哈希键插入所述目标数据桶,所述动态哈希结构包括指针数组、数据桶和段;
153.在所述目标数据桶中不存在空闲位置时,将逻辑上的下一个数据桶作为备用数据桶,将所述哈希键插入所述备用数据桶;
154.在插入所述备用数据桶成功时,判断所述备用数据桶中是否有匹配的数据指纹,若匹配,再将待更新key和所述数据指纹匹配的相应数据槽的key值进行比较,根据键比较结果进行刷新操作;
155.在插入所述备用数据桶失败时,将发生哈希冲突的段的局部深度与全局深度进行比较,根据深度比较结果进行分裂操作。
156.进一步地,所述持久内存动态哈希索引程序被处理器执行时还实现如下操作:
157.获取动态哈希结构中的指针数组的前缀和后缀;
158.基于数据指纹构建预设数据指纹插入算法,对所述前缀和所述后缀的索引根据所述预设数据指纹插入算法通过哈希函数定位动态哈希结构中的目标数据桶,将哈希键插入所述目标数据桶。
159.进一步地,所述持久内存动态哈希索引程序被处理器执行时还实现如下操作:
160.在插入所述备用数据桶成功时,判断所述备用数据桶中是否有匹配的数据指纹,若匹配,再通过最高位定位目录项,找到所述目录项所指向的目标段;
161.根据所述目标段确定对应的目标数据指纹,对所述目标数据指纹进行检索,将所述目标数据指纹中待更新key和所述数据指纹匹配的相应数据槽的key值进行比较,生成键比较结果;
162.根据所述键比较结果进行刷新操作。
163.进一步地,所述持久内存动态哈希索引程序被处理器执行时还实现如下操作:
164.在所述键比较结果为所述待更新key和每个槽存放的key相同时,更新当前key对应的值;
165.在所述键比较结果为所述待更新key和每个槽存放的key不同,且当前数据桶有空闲位置时,将哈希键按顺序插入。
166.进一步地,所述持久内存动态哈希索引程序被处理器执行时还实现如下操作:
167.在插入所述备用数据桶失败时,将发生哈希冲突的段的局部深度与全局深度进行比较,生成深度比较结果;
168.在所述深度比较结果为所述局部深度小于所述全局深度时,额外创建新的段进行段内部分数据迁移;
169.在所述深度比较结果为所述局部深度等于所述全局深度时,进行目录扩张,并切换当前目录项。
170.进一步地,所述持久内存动态哈希索引程序被处理器执行时还实现如下操作:
171.在接收到删除指令时,删除当前数据桶的数据,将逻辑上下一个数据桶里的标志位置为1的数据迁移至已删除空闲位置,并且将所述标志位置为0。
172.进一步地,所述持久内存动态哈希索引程序被处理器执行时还实现如下操作:
173.所述持久性内存的目录项有且仅有一个指向某个段的指针;所述段内有若干数据
桶,所述数据桶里有若干槽,一个槽存放一条数据,所述动态哈希结构使用全局深度和局部深度来表示段和指向段的指针之间的数量关系,其中,所述全局深度用于确定目录项的位数,所述局部深度用于指示段中公共哈希键的长度。
174.本实施例通过上述方案,通过预设数据指纹插入算法定位动态哈希结构中的目标数据桶,将哈希键插入所述目标数据桶,所述动态哈希结构包括指针数组、数据桶和段;在所述目标数据桶中不存在空闲位置时,将逻辑上的下一个数据桶作为备用数据桶,将所述哈希键插入所述备用数据桶;在插入所述备用数据桶成功时,判断所述备用数据桶中是否有匹配的数据指纹,若匹配,再将待更新key和所述数据指纹匹配的相应数据槽的key值进行比较,根据键比较结果进行刷新操作;在插入所述备用数据桶失败时,将发生哈希冲突的段的局部深度与全局深度进行比较,根据深度比较结果进行分裂操作,能够提高持久内存动态哈希索引速度和效率,提高了插入性能和空间利用率,减少不必要的读写开销,提升了持久内存哈希索引的性能。
175.需要说明的是,在本文中,术语“包括”、“包含”或者其任何其他变体意在涵盖非排他性的包含,从而使得包括一系列要素的过程、方法、物品或者系统不仅包括那些要素,而且还包括没有明确列出的其他要素,或者是还包括为这种过程、方法、物品或者系统所固有的要素。在没有更多限制的情况下,由语句“包括一个
……”
限定的要素,并不排除在包括该要素的过程、方法、物品或者系统中还存在另外的相同要素。
176.上述本发明实施例序号仅仅为了描述,不代表实施例的优劣。
177.以上仅为本发明的优选实施例,并非因此限制本发明的专利范围,凡是利用本发明说明书及附图内容所作的等效结构或等效流程变换,或直接或间接运用在其他相关的技术领域,均同理包括在本发明的专利保护范围内。
再多了解一些

本文用于企业家、创业者技术爱好者查询,结果仅供参考。

发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表

相关文献