CN110347685B - 基于字典树的索引结构、数据查询优化方法、主存管理器 - Google Patents
基于字典树的索引结构、数据查询优化方法、主存管理器 Download PDFInfo
- Publication number
- CN110347685B CN110347685B CN201910579338.XA CN201910579338A CN110347685B CN 110347685 B CN110347685 B CN 110347685B CN 201910579338 A CN201910579338 A CN 201910579338A CN 110347685 B CN110347685 B CN 110347685B
- Authority
- CN
- China
- Prior art keywords
- node
- container
- key
- bits
- partial
- 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.)
- Active
Links
- 238000000034 method Methods 0.000 title claims abstract description 22
- 238000005457 optimization Methods 0.000 title claims abstract description 9
- 230000009191 jumping Effects 0.000 claims abstract description 12
- 230000006835 compression Effects 0.000 claims description 21
- 238000007906 compression Methods 0.000 claims description 21
- 238000000926 separation method Methods 0.000 claims description 11
- 108010044915 superbin Proteins 0.000 claims description 7
- 230000007246 mechanism Effects 0.000 claims description 5
- 230000008569 process Effects 0.000 claims description 5
- 230000006870 function Effects 0.000 claims description 4
- 238000012545 processing Methods 0.000 claims description 4
- 238000004590 computer program Methods 0.000 claims description 3
- 238000000547 structure data Methods 0.000 claims description 3
- 238000013500 data storage Methods 0.000 abstract description 3
- 238000010586 diagram Methods 0.000 description 11
- 238000005516 engineering process Methods 0.000 description 5
- 238000013507 mapping Methods 0.000 description 5
- 238000007781 pre-processing Methods 0.000 description 4
- 238000012217 deletion Methods 0.000 description 3
- 230000037430 deletion Effects 0.000 description 3
- 239000012634 fragment Substances 0.000 description 3
- YBJHBAHKTGYVGT-ZKWXMUAHSA-N (+)-Biotin Chemical compound N1C(=O)N[C@@H]2[C@H](CCCCC(=O)O)SC[C@@H]21 YBJHBAHKTGYVGT-ZKWXMUAHSA-N 0.000 description 2
- 230000006872 improvement Effects 0.000 description 2
- 238000007726 management method Methods 0.000 description 2
- 238000005192 partition Methods 0.000 description 2
- 238000011084 recovery Methods 0.000 description 2
- 230000008521 reorganization Effects 0.000 description 2
- FEPMHVLSLDOMQC-UHFFFAOYSA-N virginiamycin-S1 Natural products CC1OC(=O)C(C=2C=CC=CC=2)NC(=O)C2CC(=O)CCN2C(=O)C(CC=2C=CC=CC=2)N(C)C(=O)C2CCCN2C(=O)C(CC)NC(=O)C1NC(=O)C1=NC=CC=C1O FEPMHVLSLDOMQC-UHFFFAOYSA-N 0.000 description 2
- 235000008694 Humulus lupulus Nutrition 0.000 description 1
- 238000013459 approach Methods 0.000 description 1
- 238000003491 array Methods 0.000 description 1
- 230000009286 beneficial effect Effects 0.000 description 1
- 238000010276 construction Methods 0.000 description 1
- 230000007547 defect Effects 0.000 description 1
- 230000001419 dependent effect Effects 0.000 description 1
- 230000000694 effects Effects 0.000 description 1
- 238000013467 fragmentation Methods 0.000 description 1
- 238000006062 fragmentation reaction Methods 0.000 description 1
- 238000003780 insertion Methods 0.000 description 1
- 230000037431 insertion Effects 0.000 description 1
- 230000003068 static effect Effects 0.000 description 1
- 238000006467 substitution reaction Methods 0.000 description 1
- 238000012546 transfer Methods 0.000 description 1
- 230000007704 transition Effects 0.000 description 1
Images
Classifications
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F12/00—Accessing, addressing or allocating within memory systems or architectures
- G06F12/02—Addressing or allocation; Relocation
- G06F12/08—Addressing or allocation; Relocation in hierarchically structured memory systems, e.g. virtual memory systems
-
- 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/22—Indexing; Data structures therefor; Storage structures
- G06F16/2228—Indexing structures
- G06F16/2246—Trees, e.g. B+trees
-
- 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
Landscapes
- Engineering & Computer Science (AREA)
- Theoretical Computer Science (AREA)
- Physics & Mathematics (AREA)
- General Engineering & Computer Science (AREA)
- General Physics & Mathematics (AREA)
- Data Mining & Analysis (AREA)
- Databases & Information Systems (AREA)
- Computational Linguistics (AREA)
- Software Systems (AREA)
- Information Retrieval, Db Structures And Fs Structures Therefor (AREA)
Abstract
本发明公开了基于字典树的索引结构、数据查询优化方法、主存管理器,属于数据存储领域。索引结构由容器组成,容器存储T节点和S节点,完整键被划分为部分键,T节点存储部分键的前m/2位,S节点存储部分键的后m/2位,从字典树的根节点到某一节点路径上经过的部分键连接起来,形成完整键。索引结构更为紧凑,从而提高主存空间利用率。使用跳后继将T节点直接跳转到后续兄弟节点,从而减少比较次数,提升查找性能;使用T节点跳表将T节点跳转到S节点,使用容器跳表将S节点跳转到T节点,直接跳到最近的目标,从而跳过大量不必要的条目,提升的找性能。由主存管理器解析出的包含各个层次结构ID的指针P,将索引结构与主存地址完全解耦。
Description
技术领域
本发明属于数据存储技术领域,更具体地,涉及基于字典树的索引结构、数据查询优化方法、主存管理器。
背景技术
现阶段,由于摩尔定律的推动,数据与磁盘容量都增长快速,而DRAM(DynamicRandom Access Memory,动态随机存取存储器,以下统称为“主存”)的容量相对来说增长缓慢。面对海量数据,DRAM已成为系统性能瓶颈,提升DRAM的存储容量空间利用率对提升系统的整体性能至关重要。主存容量限制,使得海量索引不能完整地放入主存,常常部分存放在二级存储设备,如磁盘或固态盘,但上述二级存储设备I/O延迟高,使系统索引性能低下。对于数据库系统、文件系统等应用,构建高效的索引非常重要。
数据爆炸式增长,对大数据存储提出了更高的I/O访问需求,虽然围绕提升主存利用率的相关技术在不断完善,如将数据压缩后放在主存,性能高效的索引结构层出不穷,如:二叉搜索树(BST)、平衡二叉搜索树(AVL树)、红黑树(RB树)、B-Tree等,但上述索引结构都是存储的完整的键(key),大多数键都是冗余的,这不可避免的会占用许多内存空间。现有一些技术,如:英特尔公司针对SIMD(单指令流多数据流)提出的SSE(Stream SIMDExtensions)技术,其他的如缓存行(cache line)或者矢量单元(vector unit)对齐等技术,能够尽可能提升现有索引机构的访问性能,但上述技术对主存空间的利用率低下。其他的索引结构,如哈希表(hash),会导致稀疏数据分布而致使对主存的利用率低下。
字典树(或称为“Trie树”),如Judy、HAT、ART、HOT等,是一种快速、节省主存空间的存储结构。前缀树结构优化了它们的内部对齐,以提高缓存和向量单元的效率。虽然这些措施通常会显著提高性能,但主存利用率仍有改进空间,如:Judy、ART虽然提升了查找速度,但对存储密度有一定的负面影响。
发明内容
针对现有技术的缺陷,本发明的目的在于解决现有技术中索引结构对主存空间利用率低的技术问题。
为实现上述目的,第一方面,本发明实施例提供了一种基于字典树的索引结构,该索引结构由多个容器组成,每个容器存储T节点和S节点,完整键按照从前往后、依次取m位的方式被划分为多个部分键,对于每个部分键,一个T节点存储部分键的前m/2位,当该部分键存在后m/2位时,一个S节点存储部分键的后m/2位,从字典树的根节点到某一节点路径上经过的部分键连接起来,形成完整键,m为偶数。
具体地,容器包括标头和有效负载,该标头用于存储该容器的各种标识,该有效负载用于按照前序遍历的方式存储T节点和S节点。
具体地,T节点包括标识域和值域,该标识域包括以下字段:节点类型标志t、部分键索引k、增量编码标志d、跳后继标志js及T节点跳表标志jt,该值域存储部分键的前m/2位;S节点包括标识域和值域,该标识域包括以下字段:节点类型标志t、部分键索引k、增量编码标志d及子容器标志c,该值域存储部分键的后m/2位。
具体地,节点类型标志t,用于区分该节点的类型是内部节点、无效节点、没有值的叶子节点还是有值的叶子节点;部分键索引k,用于区分该节点是T节点还是S节点;增量编码标志d,用于表示该节点相对于最左兄弟节点的增量编码的偏移量;跳后继标志js,用于区分该T节点是否采用跳后继方式;T节点跳表标志jt,用于区分该T节点是否采用跳表方式;子容器标志c,用于表示该S节点是否存在子容器、子容器类型及是否进行路径压缩。
具体地,容器的标头包括以下字段:容器的大小Size,用于表示该容器的存储容量;空闲位Free,用作其他功能的预留;容器跳表标志符J,用于表示该容器选择哪个跳表进行匹配跳转,容器分离标识符S,用于表示对容器进行哪种分离。
具体地,容器的产生机制包括以下几种:
1)索引结构初始化时,创建一个新的容器;
2)完整键划分得到的部分键个数≥2时,每超出1个部分键创建一个新的容器,并在当前容器中该完整键的部分键对应的S节点的值域之后追加指针P,该指针P由当前容器指向新容器,表明新容器是当前容器的子容器,并修改该S节点的子容器标志c。
具体地,当父容器的剩余容量大于等于子容器的大小时,将该子容器嵌入到父容器中,并将该子容器的标头替换为只包含容器的大小size,并修改嵌入到的父容器对应S节点的子容器标志c。
第二方面,本发明实施例提供了一种基于第一方面所述的索引结构数据查询优化方法,索引结构的查找操作过程中,使用跳后继将T节点直接跳转到该T节点的后续兄弟节点,所述跳后继存储后续兄弟节点的地址,和/或,使用T节点跳表将T节点跳转到S节点,所述T节点跳表的条目指向存储该T节点的儿子S节点,和/或,使用容器跳表将S节点跳转到T节点,所述容器跳表的条目指向存储该S节点的儿子T节点。
第三方面,本发明实施例提供了一种基于第一方面所述的索引结构的主存管理器,所述主存管理器的数据结构自顶向下包括:第一层为多个Superbins,其中,SB0处理大于L字节的所有请求,采用堆分配;其他Superbins处理小于等于L字节的所有请求,采用栈分配,第二层中,每个Superbin拥有多个Metabins;第三层中,每个Metabin拥有多个Bins;第四层中每个Bin有多个Chunks,各个层次结构的ID共同构成指针P,L为设定阈值。
第四方面,本发明实施例提供了一种计算机可读存储介质,该计算机可读存储介质上存储有计算机程序,该计算机程序被处理器执行时实现上述第二方面所述的基于索引结构数据查询的优化方法。
总体而言,通过本发明所构思的以上技术方案与现有技术相比,具有以下有益效果:
1.本发明提出的索引结构由多个容器组成,每个容器存储T节点和S节点,完整键按照从前往后、依次取m位的方式被划分为多个部分键,对于每个部分键,一个T节点存储部分键的前m/2位,当该部分键存在后m/2位时,一个S节点存储部分键的后m/2位,从字典树的根节点到某一节点路径上经过的部分键连接起来,形成完整键,m为偶数,结构更为紧凑,提升了数据密度,从而提高主存空间利用率,每太字节的主存能存近万亿。
2.本发明使用跳后继将T节点直接跳转到该T节点的后续兄弟节点,从而减少比较次数,提升索引结构的查找性能;使用T节点跳表将T节点跳转到S节点,所述T节点跳表的条目指向存储该T节点的儿子S节点,使用容器跳表将S节点跳转到T节点,所述容器跳表的条目指向存储该S节点的儿子T节点,直接跳到最近的目标,从而跳过大量不必要的条目,减少索引对主存的占用,提升索引结构的查找性能。
3.本发明中主存管理器使用层次数据结构来有效地管理和分配空闲段,由主存管理器解析出的包含各个层次结构ID的指针P,取代了原始8字节的指针,进一步增加信息密度,并该指针将索引结构与主存地址完全解耦,方便随意重新组织和移动块。
4.本发明中主存管理器,采用堆分配和栈分配混用,对于小内存分配采用栈分配,对于大内存分配采用堆分配,从而减少主存分配和回收带来的时间开销和过多的内存碎片。
附图说明
图1为本发明实施例提供的英语单词的字典树示意图;
图2为本发明实施例提供的T节点与S节点的位结构示意图;
图3为本发明实施例提供的容器位结构示意图;
图4为本发明实施例提供的添加键“be”容器布局示意图;
图5为本发明实施例提供的添加键“by”容器布局示意图;
图6为本发明实施例提供的添加键“that”、“the”和“to”容器布局示意图;
图7为本发明实施例提供的子容器示意图;
图8为本发明实施例提供的嵌入式容器示意图;
图9为本发明实施例提供的键预处理示意图;
图10(a)为本发明实施例提供的两种不同容器示意图;
图10(b)为本发明实施例提供的两种不同容器使用增量编码示意图;
图11为本发明实施例提供的键有序插入操作示意图;
图12为本发明实施例提供的主存管理器数据结构示意图。
具体实施方式
为了使本发明的目的、技术方案及优点更加清楚明白,以下结合附图及实施例,对本发明进行进一步详细说明。应当理解,此处所描述的具体实施例仅仅用以解释本发明,并不用于限定本发明。
键值对数据
key是查找每条数据地址的唯一关键字,value是该数据实际存储的内容。在本实施例中,键值对(“0100 0000 0110 0010 1010 0000 0110 0101”,“be”),其key“0100 00000110 0010 1010 0000 0110 0101”是该数据的唯一入口,长度n为32位,而value“be”是该数据实际存储的内容。
字典树应满足以下三个性质:
1)根节点不包含字符,除根节点外每一个节点都只包含一个字符;
2)从根节点到某一节点,路径上经过的字符连接起来,为该节点对应的字符串;
3)每个节点的所有子节点包含的字符都不相同。
如图1所示,一个关于英语单词的字典树存储了6个单词,分别是“a”、“and”、“be”、“that”、“the”和“to”。根节点为空,每个节点存储了单词的部分字母,灰色的节点表示单词的末尾。字符是按ASCII大小顺序存放的,从父母到子女,从左到右。
所述索引结构包括两类节点:T节点和S节点,其中,
如图2所示,T节点包括以下字段:节点类型标识位t、部分键索引k、增量编码标志d、跳后继标志js及跳表标志jt,共计位;S节点包括以下字段:节点类型标识位t、部分键索引k、增量编码标志d及子容器标志c,共计位。本实施例中,m=65536,因此S/T节点均为8位。
节点类型标识位t占第1、2位,用于区分该节点的类型是内部节点、无效节点、没有值的叶子节点还是有值的叶子节点。部分键索引k占第3位,用于区分该节点是T节点还是S节点。增量编码标志d占第4、5、6位,用于表示该节点相对于最左兄弟节点的增量编码的偏移量。跳后继标志js占第7位,用于区分该T节点是否进行跳后继。T节点跳表标志jt占第8位,用于区分该T节点是否查阅跳表。子容器标志c占第7、8位,用于表示该S节点是否存在子容器、子容器的类型及是否进行路径压缩。
节点类型标识位t的不同取值及含义如下:t=00表示该节点是无效节点,其用于在有效节点之后使用0填充容器的其余部分;t=01表示该节点是索引结构的内部节点,即非叶子节点;t=10表示该节点是没有值的叶子节点;t=11表示该节点是有值的叶子节点。其中,无效节点是删除操作引起的。当删除内部部分节点时,为了增量编码、路径压缩等技术正常运用,并减少实时删除对系统性能的影响,先把需要删除的节点标记为无效节点,等到适当的时候,执行真正的删除操作。有值情况,添加操作可能会使叶子节点转换为内部节点,删除操作可能会使内部节点转换为叶子节点。对内存的分配是分段的,那些分配了内存且没有分配值的节点是没有值的叶子节点。
部分键索引k=0时,表示该节点是T节点,k=1时,表示该节点是S节点。
增量编码标志d=011,用于表示该节点相对于最左兄弟节点的增量编码的偏移量为3,其他的以此类推。
跳后继标志js=0,表示该T节点不进行跳后继;跳后继标志js=1,表示该T节点进行跳后继,即从该T节点跳转到兄弟T节点。
T节点跳表标志jt=0,表示该T节点不进行跳表;T节点跳表标志jt=1,表示该T节点进行跳表,即从该T节点按照跳表匹配项跳转到一个S节点。
子容器标志c的不同取值及含义如下:c=00表示该S节点不存在子容器;c=01表示该S节点存在子容器并且不是嵌入式子容器;c=10表示该S节点存在嵌入式子容器;c=11表示将该S节点及其子节点进行路径压缩编码,即当存在共有前缀/后缀时,则进行压缩存储。
容器
如图3所示,每个容器最多可存储65536(即216)个16位部分键(partial key),至多保存字典树的两层结构。在一个容器中,所有的T节点都是兄弟节点,S节点是T节点的孩子节点;如果两个S节点有共同的父节点(T节点),则这两个S节点是兄弟节点。容器以32字节的增量增长。
容器的大小为32字节(即28=256位),由4字节的(32位)标头和28字节的(224位)有效负载(Payload)组成。其中,
标头用于存放该容器的各种标识,前第1位至第19位是容器的大小Size,用于表示该容器的存储容量;第20位至第27位是空闲位Free,用作其他功能的预留;第28位至第30位是容器跳表标志符J,用于表示该容器选择哪个跳表进行匹配跳转,第31至第32位是容器分离标识符S,用于对过大的容器进行分离。初始化时,仅Size位有值000 0000 0001 00000000,表示容器的大小Size为256bit。
例如,容器跳表标志符J=111时,表示该容器选择该容器中第8个跳表,按照匹配项进行容器的跳转。
容器分离标识符S=00,表示不对该容器进行分离;容器分离标识符S=01,表示对该容器进行分离,且优先级最高;容器分离标识符S=10,表示对该容器进行分离,且优先级次高;容器分离标识符S=11,表示对该容器进行分离,且优先级最低。
有效负载用于按照前序遍历方式索引结构的T节点和S节点对应的键值对,以字节数组存储,这意味着T节点后面总是跟着它的S节点子节点。
下面介绍本发明字典树,具体的构建流程:
首先,新建容器C1,C1初始化,然后添加键值对(“0100 0000 0110 0010 10100000 0110 0101”,“be”)。容器在内部使用8位的部分键来形成16位的键,一个be被分成两部分:b0与e1,即“T节点”和“S节点”,b为T节点,e为S节点。容器添加“be”后,布局如图4所示。
其次,继续添加键“by”,由字典树的特性可知,“b”仅需存储一次,“y”是S节点,存储了“be”和“by”的布局如图5所示。
然后,继续添加键“that”、“the”和“to”,但有些键的层数超过2层,需要创建新的容器来容纳它们,比如,“a”,“e”和“t”,又由于容器C1还有空闲容量,可以递归地嵌入小容量容器,从而减少容器的数量,提高缓存的局部性,存储了“be”,“by”,“that”,“the”和“to”的布局如图6所示。
最后,添加“there”和添加键“that”的情况类似。
子容器
当key的位数大于16位,即存在一个以上的部分键ki时,会出现子容器,子容器与原容器是从属关系。子容器的大小、组成、各字段含义均与容器相同。
如图7所示,为了叙述简便,现把对应容器命名为:C1、C2和C3。其中,C1中“n”节点有一个子容器C2,C1中“h”节点有一个子容器C3,因此,设置“h”节点的字段c=01,并在该节点对应的键值对之后,追加40位(5字节,第17位至第56位)的字段P,其表示从节点“h”指向子容器C3的指针。相对于现有技术中字典树采用8字节指针,本发明采用5字节,从而节省空间。
嵌入式容器
当父容器的剩余容量大于等于子容器的大小时,可以将该子容器嵌入到父容器中,从而节省空间。嵌入式容器是特殊的子容器,其与子容器的区别在于,嵌入式容器的标头仅包括1字节的容器的大小size。如图8所示,C3是一个特殊的子容器,被嵌入到其父容器的字节数组中。由于把C3作为一个嵌入式容器,则“h”节点的c字段需要更新为c=10,并在该节点对应的键值对之后,删除字段P,并追加8位(1字节,第17位至第24位)的字段size,表示嵌入式容器C3的大小。在该示例中,第17位至第72位这一段存储嵌入式容器C3中各节点“a”、“t”、“e”,嵌入式容器的容量为256字节(S节点的大小限制)。嵌入式容器C3的字节数组与普通容器中的字节数组相同。嵌入式容器不允许内部跳转。
键预处理
原始键可能会使得索引结构具有大量叶节点,降低索引结构的内存效率。因此,本发明对待存储数据的键进行预处理。键预处理主要是对原始键做了一个映射,使得映射后的键分布更适合于字典树。如图9所示,原始键每隔6位注入两个0,从而将3个原始键变为4个预处理后的键。本发明的映射方法通过注入多余的零比特位,增加键大小,用空间换时间,键预处理主要是提升性能。
路径压缩
当S节点及其子节点存在共有前缀/后缀时,为了节省空间,本发明选择对S节点及其子节点进行路径压缩。路径压缩是把共有序列合起来写在路径压缩节点里。比如说:需要存储“a”、“ac”、“acd”、“acde”这四个键,并且它们没有分支,即不需要存储“acf”之类的键。那么这四个键其实是一条独链,则原来“a”键所处位置可以进行路径压缩,仅把“acde”写入路径压缩节点,并对个标识位和数值进行修改,不需要存储“a”、“ac”和“acd”。共有前缀情况与共有后缀类似。
此时,将S节点的子容器标志设置为c=11。路径压缩节点有一个8位的头部,前7位表示路径压缩节点的大小,最后1位表示该节点是否有值。路径压缩节点的大小被限制为127个字符。如果一个值被存储,它将被追加到路径压缩节点的头部中,然后将剩余的后缀键作为常规字符串追加。最终,带有路径压缩节点编码的S节点子节点可能需要处理其他的键,这意味着路径压缩节点以前唯一的后缀部分不再唯一。在这种情况下,它将被递归地转移到嵌入式容器中,直到两个部分键可以作为单独的路径压缩节点存储为止。路径压缩节点主要功能提升空间利用率。
增量编码
当节点与最左兄弟节点之间存在差异,为了提高内存效率从而节省空间,本发明选择对该节点采用增量编码,减少编码到键的前四个字节中的熵,帮助压缩数据。增量编码又称差分编码,能大幅减少数据的重复。该方式对于密集的数据集特别有效,例如,(序列整数或倾斜分布,字母数字字符串,并且没有额外的内存开销。如图10(a)所示,在容器C3中,“a”是第一个字符,“t”是“a”唯一的孩子节点,并且ASCII编码是116,但“e”是“a”的兄弟节点,则Δ(a,e)=101-97=4,由于仅需3位二进制就可以表示4,该增量编码可存储在T/S-Node的“d”字段,如图10(b)所示,后面的8位就不需要了,则C3容器仅需5个字符就可以表示。该方法本身不需要数据的先验知识,并且可以在线执行键转换。键大小增加一个字节,但由于路径压缩,内存开销很低。
跳后继
通常来说,数据查找采用顺序遍历,当需要查找的键不属于当前T节点的儿子节点时,仍然查找其儿子节点,此时的时间复杂度为Ο(m2)。为了降低复杂度,加快数据查找,本发明采用跳后继选择跳转到T节点的兄弟节点继续查找,直至找到合适的T节点,并将跳转前的T节点的字段跳后继标志设置js=1。跳后继是一个16位无符号短整型数组,将其追加到跳转前T节点的值(第16位)后面。跳后继数组的长度限制了最大的跳转距离是65536字节。跳后继通过减少比较次数,提升索引结构的查找性能。
跳表
虽然跳后继可以提升性能,但对于m较大的情况下,对索引结构的扫描速度仍然较慢。原因是T节点到后续节点的跳转距离也随着m的增大而增大,缓存可能会失效,进一步增加了缓存丢失率。因此,本发明引入了T节点跳表和容器跳表。跳表是一个参考列表,它允许扫描过程跳转到更接近键的位置,从而跳过大量不必要的条目,直接跳到最近的目标。
T节点跳表通过引用15个无符号短数组存储S节点地址信息,来减少访问其S节点的延迟。在这种情况下,增量编码对跳表是一个挑战。从一个T节点跳到一个S节点,我们不知道T节点的前任键(T节点最左边的兄弟节点),也无法将增量转换成它的键字符。针对该问题,本发明选择从该T节点跳转到一个预先定义的S节点上。
T节点跳表有15个条目(item),表示为ei:i∈[0,1,…,14],每个条目ei指向存储8位部分键的S节点,ei→16*(i+1)。静态映射,关系固定,一对一,结构和实现相对简单,但相对动态映射来说,占用存储空间较多;动态映射存储的是目标键和跳转偏移量,占用空间少,但实现较复杂。
为了跳过那些不必要查找的容器,可以使用容器跳表。容器跳表跳转的目标是T节点,而不是S节点。容器的跳转标识符J是3位,允许它有7个输入间隔,区间首位都计算,如:0~7、8~14,依次类推,41~48,增长到49个条目,每个条目存储的是T节点地址信息,指向存储8位部分键的T节点。包含49个条目的平衡容器跳表,确保在查找期间最多遍历个T节点。一旦单个容器跳表有8个T节点,本发明索引结构的容器遍历算法就会增加或重新平衡跳表。因此,一旦容器跳表已经扩展到它的全部范围,并且它的条目得到了适当的平衡,那么该算法将不再更新它。检查跳表状态的特殊指令是不必要的,这一点尤其重要,因为这些指令会将分支指令添加到扫描算法的关键路径中。每个条目被编码成一个32位整数,其中,8位表示条目的键,24位存储偏移量。条目是按键排序的,偶尔会重新平衡。通过线性扫描条目并使用小于或等于所需键最大的条目,可以执行跳表条目查找。
容器分离
一个完整填充的容器,它引用65536个子容器。这样的容器大小为400K字节。容器太大时,转移和重新分配开销是相当大的。拆分容器通过垂直分割大型容器来减少移动开销。每次插入数据时,扫描容器,当容器大小满足以下公式时,对容器进行分割,得到两个容器。
sizec≥a+b*s
其中,sizec表示容器的大小,a=16K字节,b=64K字节,分割因子s∈[0,3]。分割因子s取四个值,是因为分割因子s对应容器分离标识符S(2位)。分离容器是一个性能优化机制,拆分一个容器会产生两个新创建的容器,每个容器都有自己的扩展Bin指针。连接指针用于为所有可能存在8个拆分容器存储扩展的指针eP,分离容器是按连续Chunk分配的。
容器嵌入
本发明可以递归嵌入小的容器,减少容器的数量,并提高缓存的局部性。每次插入数据时,扫描容器,当容器大小不满足上述公式,且新插入的数据对应的节点超出该容器的两层结构时,构建新的容器。新构建的容器小于256bit(S节点的大小限制,S节点是8bit,能表示256bit)时,新容器作为嵌入式容器嵌入到其父S节点中,否则,作为单独的子容器。
本发明索引结构的查找、插入操作和普通字典树数据结构的前序遍历一样。其中,增加操作和删除操作,会直接影响到相关节点的各参数和相关容器的标头。如图11所示,插入操作以保序方式执行。这需要移动字节数组段。删除几乎总是触发内存移位。更新仅在向已有键添加值(原先没有附加值)时触发移位,即类型t=10到类型t=11的转换。
主存管理器
为了减少主存分配、回收带来的时间开销和过多的内存碎片,本发明的索引结构的内存分配模式使用主存管理器,小于等于2016字节的内存分配,采用栈分配,即小分配按大小分组,并存储在大内存映射段中,大于2016字节的内存分配,采用堆分配。
主存管理器使用层次数据结构来有效地管理和分配空闲段,数据结构层次关系自顶向下如图12所示。
第一层(40位中的前6位):64个Superbins,其中,SB0处理大于2016字节的所有请求,采用堆分配,其特点是分配速度较慢,容易产生内存碎片;其他Superbins,每个SBi提供32*i字节大小的字段,用于存储键值对,采用栈的分配,其原因是栈的效率比较高,1≤i≤63。
第二层(40位中的接下来的14位):每个Superbin拥有214个Metabins。
第三层(40位中的接下来的8位):每个Metabin拥有256个Bins。
第四层(40位中的接下来的12位):每个Bin有4096个Chunks。
Chunk Ci表示第i个Chunk,每个Chunk是1bit,其值为0,表示第i个Chunk不存在,其值为1,表示第i个Chunk存在。Chunk Ci是用来存储本发明索引结构容器的内存段。
一个容器可以分成最多8个Chunks,使用Chunki管理T节点键:
[32*i,32*(i+1)-1]
例如,Chunk0负责键区间是[0-31],Chunk3负责键区间是[96-127]。容器可以在每次迭代中分割一次。
本发明索引结构存储由主存管理器解析出的包含各个层次结构ID的5字节指针P。40位指针P将本发明索引结构与主存地址完全解耦,方便随意重新组织和移动块(Chunk)。
本发明索引结构使用SIMD指令快速识别空闲的容器和Chunk,并且每4096个分配只发出一个内核陷阱。Superbin的内存开销很小,可以装入一条缓存线。数据结构包含对Metabins的指针数组的引用,因此可以单独初始化新的Metabins。此外,Superbin还包括一个由16个非全(non-full)Metabin IDs组成的排序列表,以便快速查找空闲Chunk。除了管理变量(housekeeping variables)外,Metabins还存储一个256位数组,用于标识非全(non-full)Bins和Bin结构的数组。Bins使用一个4096位数组来区分使用的Chunk和空闲Chunk,指向内存映射段的指针包含单独的Chunk和管理变量。
堆分配器通常在内部存储分配大小,并对每个段施加8字节的开销。相反,内核不跟踪内存映射的段大小。因此,应用程序必须管理段大小。如前所述,Superbin ID决定的Chunk大小对应的内存映射段可以由计算得出。因此,与堆使用情况相比,每次分配节省的内存累计为11字节。一旦分配了1048576个块中的12128个,这些节省将补偿Metabin数据结构开销,并且每个完整的Metabin节省超过10MiB。
扩展Bins用于分配大于2016字节的内存,由Superbin SB0管理。扩展Bin的大小为16字节,因为它们只存储本发明索引结构扩展指针(extended Point),扩展指针包含一个常规的堆指针、一个存储请求大小的整数和一个表示该分配中过度分配的内存的短消息。剩下的两个字节存储管理标志。尽管本发明索引结构以32字节增长,当请求在8千字节以下时,扩展指针以256字节的间隔递增,在8千字节到16千字节之间时,扩展指针以1千字节递增,在其他情况下,扩展指针以4千字节递增。这些较大的增量减轻了快速增长容器的堆碎片的影响,并通过减少重新分配开销提高了性能。
链式扩展Bins是8个以原子方式分配和释放的扩展Bin Chunks。这意味着,单个指针P拥有8个扩展Bin Chunks,它们必须位于SB0中Bin的8个连续的Chunks中。其中一些扩展Bins的堆指针可以是空的,这允许本发明索引结构可以访问8个独立的扩展Bin Chunks,而不必在本发明索引结构中处理多个指针P。
以上,仅为本申请较佳的具体实施方式,但本申请的保护范围并不局限于此,任何熟悉本技术领域的技术人员在本申请揭露的技术范围内,可轻易想到的变化或替换,都应涵盖在本申请的保护范围之内。因此,本申请的保护范围应该以权利要求的保护范围为准。
Claims (8)
1.一种基于索引结构数据查询优化方法,其特征在于,所述索引结构由多个容器组成,每个容器存储T节点和S节点,完整键按照从前往后、依次取m位的方式被划分为多个部分键,对于每个部分键,一个T节点存储部分键的前m/2位,当该部分键存在后m/2位时,一个S节点存储部分键的后m/2位,从字典树的根节点到某一节点路径上经过的部分键连接起来,形成完整键,m为偶数;T节点包括标识域和值域,该标识域包括以下字段:节点类型标志t、部分键索引k、增量编码标志d、跳后继标志js及T节点跳表标志jt,该值域存储部分键的前m/2位;S节点包括标识域和值域,该标识域包括以下字段:节点类型标志t、部分键索引k、增量编码标志d及子容器标志c,该值域存储部分键的后m/2位;
索引结构的查找操作过程中,使用跳后继将T节点直接跳转到该T节点的后续兄弟节点,所述跳后继存储后续兄弟节点的地址,和/或,使用T节点跳表将T节点跳转到S节点,所述T节点跳表的条目指向存储该T节点的儿子S节点,和/或,使用容器跳表将S节点跳转到T节点,所述容器跳表的条目指向存储该S节点的儿子T节点。
2.如权利要求1所述的方法,其特征在于,容器包括标头和有效负载,该标头用于存储该容器的各种标识,该有效负载用于按照前序遍历的方式存储T节点和S节点。
3.如权利要求1所述的方法,其特征在于,节点类型标志t,用于区分该节点的类型是内部节点、无效节点、没有值的叶子节点还是有值的叶子节点;部分键索引k,用于区分该节点是T节点还是S节点;增量编码标志d,用于表示该节点相对于最左兄弟节点的增量编码的偏移量;跳后继标志js,用于区分该T节点是否采用跳后继方式;T节点跳表标志jt,用于区分该T节点是否采用跳表方式;子容器标志c,用于表示该S节点是否存在子容器、子容器类型及是否进行路径压缩。
4.如权利要求2所述的方法,其特征在于,容器的标头包括以下字段:容器的大小Size,用于表示该容器的存储容量;空闲位Free,用作其他功能的预留;容器跳表标志符J,用于表示该容器选择哪个跳表进行匹配跳转,容器分离标识符S,用于表示对容器进行哪种分离。
5.如权利要求1所述的方法,其特征在于,容器的产生机制包括以下几种:
1)索引结构初始化时,创建一个新的容器;
2)完整键划分得到的部分键个数≥2时,每超出1个部分键创建一个新的容器,并在当前容器中该完整键的部分键对应的S节点的值域之后追加指针P,该指针P由当前容器指向新容器,表明新容器是当前容器的子容器,并修改该S节点的子容器标志c。
6.如权利要求1所述的方法,其特征在于,当父容器的剩余容量大于等于子容器的大小时,将该子容器嵌入到父容器中,并将该子容器的标头替换为只包含容器的大小size,并修改嵌入到的父容器对应S节点的子容器标志c。
7.一种基于索引结构的主存管理器,其特征在于,所述索引结构由多个容器组成,每个容器存储T节点和S节点,完整键按照从前往后、依次取m位的方式被划分为多个部分键,对于每个部分键,一个T节点存储部分键的前m/2位,当该部分键存在后m/2位时,一个S节点存储部分键的后m/2位,从字典树的根节点到某一节点路径上经过的部分键连接起来,形成完整键,m为偶数;T节点包括标识域和值域,该标识域包括以下字段:节点类型标志t、部分键索引k、增量编码标志d、跳后继标志js及T节点跳表标志jt,该值域存储部分键的前m/2位;S节点包括标识域和值域,该标识域包括以下字段:节点类型标志t、部分键索引k、增量编码标志d及子容器标志c,该值域存储部分键的后m/2位;容器的产生机制包括以下几种:
1)索引结构初始化时,创建一个新的容器;
2)完整键划分得到的部分键个数≥2时,每超出1个部分键创建一个新的容器,并在当前容器中该完整键的部分键对应的S节点的值域之后追加指针P,该指针P由当前容器指向新容器,表明新容器是当前容器的子容器,并修改该S节点的子容器标志c;
所述主存管理器的数据结构自顶向下包括:第一层为多个Superbins,其中,SB0处理大于L字节的所有请求,采用堆分配;其他Superbins处理小于等于L字节的所有请求,采用栈分配,第二层中,每个Superbin拥有多个Metabins;第三层中,每个Metabin拥有多个Bins;第四层中每个Bin有多个Chunks,各个层次结构的ID共同构成指针P,L为设定阈值。
8.一种计算机可读存储介质,其特征在于,所述计算机可读存储介质上存储有计算机程序,所述计算机程序被处理器执行时实现如权利要求1至6任一项所述的基于索引结构数据查询的优化方法。
Priority Applications (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN201910579338.XA CN110347685B (zh) | 2019-06-28 | 2019-06-28 | 基于字典树的索引结构、数据查询优化方法、主存管理器 |
Applications Claiming Priority (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN201910579338.XA CN110347685B (zh) | 2019-06-28 | 2019-06-28 | 基于字典树的索引结构、数据查询优化方法、主存管理器 |
Publications (2)
Publication Number | Publication Date |
---|---|
CN110347685A CN110347685A (zh) | 2019-10-18 |
CN110347685B true CN110347685B (zh) | 2021-08-20 |
Family
ID=68177191
Family Applications (1)
Application Number | Title | Priority Date | Filing Date |
---|---|---|---|
CN201910579338.XA Active CN110347685B (zh) | 2019-06-28 | 2019-06-28 | 基于字典树的索引结构、数据查询优化方法、主存管理器 |
Country Status (1)
Country | Link |
---|---|
CN (1) | CN110347685B (zh) |
Families Citing this family (8)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN110830561B (zh) * | 2019-10-25 | 2020-11-17 | 华中科技大学 | 一种异步网络环境下的多用户oram访问系统及方法 |
CN111008195A (zh) * | 2019-10-31 | 2020-04-14 | 苏州浪潮智能科技有限公司 | 一种数据库空闲空间管理方法、系统、终端及存储介质 |
US11481371B2 (en) * | 2020-07-27 | 2022-10-25 | Hewlett Packard Enterprise Development Lp | Storage system capacity usage estimation |
CN112116951B (zh) * | 2020-08-14 | 2023-04-07 | 中国科学院计算技术研究所 | 一种基于图数据库的蛋白质组数据管理方法、介质和设备 |
CN113420191B (zh) * | 2020-12-17 | 2024-07-05 | 阿里巴巴集团控股有限公司 | 数据存储方法和装置、数据查询方法和装置、数据结构、电子设备及计算机可读存储介质 |
CN113656467B (zh) * | 2021-08-20 | 2023-07-25 | 北京百度网讯科技有限公司 | 搜索结果的排序方法、装置和电子设备 |
CN115858542B (zh) * | 2023-03-03 | 2023-06-13 | 神州灵云(北京)科技有限公司 | 一种GeoIPv6树状索引方法、系统及电子设备 |
CN118035503B (zh) * | 2024-04-11 | 2024-06-28 | 福建时代星云科技有限公司 | 一种键值对数据库的存储方法 |
Citations (4)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN101655858A (zh) * | 2009-08-26 | 2010-02-24 | 华中科技大学 | 一种基于分块组织的密文索引结构及其管理方法 |
CN101937448A (zh) * | 2009-06-28 | 2011-01-05 | Sap股份公司 | 用于主存储器列存储装置的基于字典的保持顺序的串压缩 |
CN103514236A (zh) * | 2012-06-30 | 2014-01-15 | 重庆新媒农信科技有限公司 | 检索应用中基于拼音的检索条件纠错提示处理方法 |
CN105117417A (zh) * | 2015-07-30 | 2015-12-02 | 西安交通大学 | 一种读优化的内存数据库Trie树索引方法 |
Family Cites Families (1)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
US9450866B2 (en) * | 2014-07-11 | 2016-09-20 | Telefonaktiebolaget L M Ericsson (Publ) | Forwarding table performance control in SDN |
-
2019
- 2019-06-28 CN CN201910579338.XA patent/CN110347685B/zh active Active
Patent Citations (4)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN101937448A (zh) * | 2009-06-28 | 2011-01-05 | Sap股份公司 | 用于主存储器列存储装置的基于字典的保持顺序的串压缩 |
CN101655858A (zh) * | 2009-08-26 | 2010-02-24 | 华中科技大学 | 一种基于分块组织的密文索引结构及其管理方法 |
CN103514236A (zh) * | 2012-06-30 | 2014-01-15 | 重庆新媒农信科技有限公司 | 检索应用中基于拼音的检索条件纠错提示处理方法 |
CN105117417A (zh) * | 2015-07-30 | 2015-12-02 | 西安交通大学 | 一种读优化的内存数据库Trie树索引方法 |
Non-Patent Citations (2)
Title |
---|
基于硬件事务内存的内存计算系统可扩展性研究;王肇国;《中国博士学位论文全文数据库 信息科技辑》;20160115;全文 * |
增量存储系统中的高通量并行处理;董绍婵;《中国优秀硕士学位论文全文数据库 信息科技辑》;20151015;全文 * |
Also Published As
Publication number | Publication date |
---|---|
CN110347685A (zh) | 2019-10-18 |
Similar Documents
Publication | Publication Date | Title |
---|---|---|
CN110347685B (zh) | 基于字典树的索引结构、数据查询优化方法、主存管理器 | |
US11899641B2 (en) | Trie-based indices for databases | |
CN110083601B (zh) | 面向键值存储系统的索引树构建方法及系统 | |
US7590625B1 (en) | Method and system for network load balancing with a compound data structure | |
US8224829B2 (en) | Database | |
CN109471905B (zh) | 一种支持时间范围和属性范围复合查询的区块链索引方法 | |
Leis et al. | The adaptive radix tree: ARTful indexing for main-memory databases | |
US8356021B2 (en) | Method and apparatus for indexing in a reduced-redundancy storage system | |
EP2270684B1 (en) | Dictionary-based order-preserving string compression for main-memory column stores | |
CN109445702B (zh) | 一种块级数据去重存储系统 | |
EP1434147A2 (en) | Method for increasing average storage capacity in a bit-mapped tree-based storage | |
US5829004A (en) | Device for storage and retrieval of compact contiguous tree index records | |
CN102122285B (zh) | 一种数据缓存系统中的数据查询系统和数据查询方法 | |
US7805427B1 (en) | Integrated search engine devices that support multi-way search trees having multi-column nodes | |
CN107515901A (zh) | 一种链式日志存储结构及其哈希索引结构、数据操作方法及服务器、介质 | |
US7162481B2 (en) | Method for increasing storage capacity in a multi-bit trie-based hardware storage engine by compressing the representation of single-length prefixes | |
AU2002222096A1 (en) | Method of organising, interrogating and navigating a database | |
CN110888886A (zh) | 一种索引结构及构建方法、键值存储系统及请求处理方法 | |
US11392314B2 (en) | Sequentially writing metadata into a solid state disk by redirect-on-write | |
US8086641B1 (en) | Integrated search engine devices that utilize SPM-linked bit maps to reduce handle memory duplication and methods of operating same | |
US7987205B1 (en) | Integrated search engine devices having pipelined node maintenance sub-engines therein that support database flush operations | |
Vitter | Implementations for coalesced hashing | |
US8935508B1 (en) | Implementing pseudo content access memory | |
US7953721B1 (en) | Integrated search engine devices that support database key dumping and methods of operating same | |
CN1627272A (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 |