CN108780455B - 一种字符串序列的压缩索引方法及装置 - Google Patents
一种字符串序列的压缩索引方法及装置 Download PDFInfo
- Publication number
- CN108780455B CN108780455B CN201680083999.8A CN201680083999A CN108780455B CN 108780455 B CN108780455 B CN 108780455B CN 201680083999 A CN201680083999 A CN 201680083999A CN 108780455 B CN108780455 B CN 108780455B
- Authority
- CN
- China
- Prior art keywords
- character string
- skip list
- index
- node
- memory page
- 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
Images
Classifications
-
- H—ELECTRICITY
- H03—ELECTRONIC CIRCUITRY
- H03M—CODING; DECODING; CODE CONVERSION IN GENERAL
- H03M7/00—Conversion of a code where information is represented by a given sequence or number of digits to a code where the same, similar or subset of information is represented by a different sequence or number of digits
- H03M7/30—Compression; Expansion; Suppression of unnecessary data, e.g. redundancy reduction
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F16/00—Information retrieval; Database structures therefor; File system structures therefor
Landscapes
- Engineering & Computer Science (AREA)
- Theoretical Computer Science (AREA)
- Data Mining & Analysis (AREA)
- Databases & Information Systems (AREA)
- Physics & Mathematics (AREA)
- General Engineering & Computer Science (AREA)
- General Physics & Mathematics (AREA)
- Information Retrieval, Db Structures And Fs Structures Therefor (AREA)
- Compression, Expansion, Code Conversion, And Decoders (AREA)
Abstract
一种字符串序列的压缩索引方法及装置,涉及数据管理技术领域,解决现有CS‑Prefix‑Tree编码索引过程中,底层叶节点存在过长的差异前缀长度,导致编码索引分支节点的容纳能力下降,增加分支节点数量和查找复杂度的问题。方法包括:根据字符串序列中每个字符串的差异前缀长度对所述字符串序列进行分组处理,获得M个字符串组,以使每个字符串组中的首个字符串的差异前缀长度在预设字符串范围内是最短的(S102),将所述M个字符串组依次存储到N个内存页中(S103),根据所述N个内存页的索引关键字构建跳表索引(S104)。
Description
技术领域
本发明涉及数据管理技术领域,尤其涉及一种字符串序列的压缩索引方法及装置。
背景技术
随着数据库广泛应用到社会生产的各个领域,数据库记录的规模和属性也日趋复杂,在这种前提下列优先存储(简称“列存”)的优势日渐突出。其中,当采用列存时,为了减少存储开销,可以采用字典编码方式来存储数据。目前,人们通常采用Carsten Binnig等人于2009年提出的CS-Prefix Tree(缓存感知型前缀树)保序压缩索引机制,用于支持对压缩字典的不解压查询。
如图1所示,CS-Prefix-Tree由共享叶(Shared leaves)和编码索引(Encodeindex)两部分构成。共享叶包含一系列固定长度的数据块,每个数据块存储一组<字符串,编码>(value,code)字典项,块内及块间的字典项按“字符串”全局有序,所有数据块一起构成了完整字典。编码索引是由一系列固定长度分支节点(node)构成的树结构,每个分支节点包括:分支节点中第一个子节点的地址、分支节点记录的关键字个数、以及关键字列表。其中,关键字为相邻子节点的差异前缀,差异前缀是指区分某个节点所包含的最小字符串与其前驱节点所包含的最大字符串的最短前缀,例如,如图1所示,最下行首个叶节点所包含的最大字符串为“aaf”,第二个叶节点所包含的最小字符串为“amd”,首个叶节点为第二个叶节点的前驱节点,区分“amd”与“aaf”的最短前缀为“am”,即两个叶节点的差异前缀为“am”。
编码索引采用“自底向上”的方式构造,即先有全部叶节点,再逐层构造分支节点。例如,图1采用32字节分支节点,并在第三字段采用由两端到中间的方式逐个写入关键字,即首先将差异前缀“am”作为关键字写入字段尾部,并记录节点偏移量29到字段首部,形成([29],…,[am])的字段形式。其中,偏移量从0开始编址,即32字节分支节点的偏移量由0顺序编址到31,关键字中的每个字符占用1个字节且需要1个字节的空白字符作为结束标记,所以“am”需要占用偏移量29~31三个字节。如此类推,将第二个差异前缀“amq”作为关键字写入偏移量为25的字段尾部,并记录偏移量到字段首部,形成([29,25],…,[amq,am])的字段形式;将第三个差异前缀“bc”作为关键字写入偏移量为22的字段尾部,并记录偏移量到字段首部,形成([29,25,22],…,[bc,amq,am])的字段形式。此时,字段可使用空间不足以容纳下一个关键字,则分配新的分支节点索引后续叶节点。在构造编码索引的过程中,若当前最上层索引有两个及以上分支节点,则需分配新的分支节点构造更上一层索引,直到索引收敛到单一的根节点。
但是,在实现本发明的过程中,发明人发现CS-Prefix-Tree存在以下问题:由于底层相邻叶节点间的差异前缀长度不受控制,在处理长字符串序列时,差异前缀长度可能在几字节到几百字节不等,此时,过长的差异前缀长度会导致编码索引分支节点的容纳能力下降,增加分支节点数量和查找复杂度。
发明内容
本发明的实施例提供一种字符串序列的压缩索引方法及装置,以解决现有CS-Prefix-Tree编码索引过程中,底层叶节点存在过长的差异前缀长度,导致编码索引分支节点的容纳能力下降,增加分支节点数量和查找复杂度的问题。
为达到上述目的,本发明的实施例采用如下技术方案:
第一方面,本发明实施例提供一种字符串序列的压缩索引方法,所述方法可以包括:
获取有序排列的字符串序列;
根据字符串序列中每个字符串的差异前缀长度,对字符串序列进行分组处理,获得M个字符串组,以使每个字符串组中首个字符串的差异前缀长度在预设字符串范围内是最短的;
将M个字符串组依次存储到N个内存页中,内存页的索引关键字为该内存页中首个字符串组的差异前缀;
根据N个内存页的索引关键字构建包含Q层跳表的跳表索引,该跳表索引采用自下而上的方式构建,其第1层跳表可以根据N个内存页的索引关键字构建,每个跳表节点包含至少一个索引关键字、索引关键字的个数以及索引关键字的寻址信息。
需要说明的是,上述有序字符串序列可以为按照字典升序或降序排列的字符串序列。
如此,通过对有序字符串序列进行分组和分页处理,构建跳表索引。由于字符串组的差异前缀长度在一定字符串范围内是最短的,使得根据字符串组的差异前缀长度分页后的每页的索引关键字也是局部最短的,进而在页的基础上构建的跳表索引内的索引关键字的长度也是比较短的,降低了跳表索引中索引关键字的平均长度,提升了跳表节点的容纳能力,从而达到减少索引节点数量和降低索引查找复杂度的有益效果。
具体的,在第一方面的一种可实现方式中,可以采用下述方式对有序字符串序列进行分组:
设定所述M个字符串组中每个字符串组包含的字符串的个数的最小阈值Wmin和最大阈值Wmax;
以第1个字符串为第1个字符串组的起始字符串,依次计算以该字符串为首的后续Wmax个字符串的差异前缀长度;
确定后续第Wmin个字符串到后续第Wmax个字符串之间的字符串中差异前缀长度最小的字符串,将第1个字符串至该差异前缀长度最小的字符串间的所有字符串分为第1个字符串组;
将差异前缀长度最小的字符串作为第2个字符串组的起始字符串,重复上述过程获得第2个字符串组;
如此,按照上述分组方式可以对后续字符串进行分组,直至将所有字符串全部分组完成。
需要说明的是,每个字符串组所能容纳的字符串的阈值可以相同,也可以不同。
具体的,在第一方面的一种可实现方式中,可以根据所述M个字符串组中每个字符串组的差异前缀长度,将M个字符串组依次存储到N个内存页中,以使每个内存页中首个字符串组的差异前缀长度在预设字符串组范围内是最短的,具体实现如下:
设定所述N个内存页中每个内存页的最小容量Cmin和最大容量Cmax;
将第1个字符串组写入第1个内存页;
以第1个字符串组为起始字符串组,按照字符串组的排序,依次将其后续的至少一个字符串组写入第1个内存页;
若写入第i个字符串组时,第1个内存页中被占用的存储容量C占用与Cmin的差值小于第i个字符串组的存储开销,则计算第1个内存页中可使用的存储容量(Cmax-C占用)所能容纳的Nmore个字符串组;
确定Nmore个字符串组中差异前缀最小的字符串组,将第i个字符串组、以及第i个字符串组到差异前缀最小的字符串组之间的字符串组依次写入第1个内存页中,至此获得第1个内存页;
接下来,将差异前缀长度最小的字符串组作为第2个内存页的首个字符串组,写入第2个内存页,并按照上述方法确定第2个内存页,如此,重复上述过程,直至将所有字符串组分页完成。
由于,字符串组中各字符串间存在共享前缀,因此,为了降低字符串在存储过程中占用的内存,提供压缩效率,在将字符串组写入内存页的过程中,可以将字符串组除首个字符串之外的字符串以压缩形式写入内存页中,具体实现如下:
将字符串组的首个字符串以不压缩形式写入到内存页的可用空间;
对该字符串组中除首个字符串之外的其他任一字符串,获取其他任一字符串与其相邻的前一个字符串间的共享前缀,将其他任一字符串与其相邻的前一个字符串间的共享前缀长度、以及其他任一字符串中在共享前缀之外的后缀字符串写入到该内存页的剩下的可用空间。
其中,为了便于后续查找字符串组,在将字符串组写入内存页之后,还需要在内存页尾部的存储空间中逆序写入:各个字符串组在内存页中所处的地址信息、以及该内存页中包含的字符串组的个数。
具体的,在第一方面的一种可实现方式中,所述Q层跳表可以为逐层构建的多层跳表,所述Q层跳表中的第q层跳表根据第q-1层跳表中间隔为稀疏系数F的跳表节点的首个索引关键字构建,所述F为大于等于1的整数,所述q为大于等于2的整数,具体的,跳表索引的构建过程如下:
将N个内存页的索引关键字依次写入第1层跳表的跳表节点,并在每个跳表节点中记录该跳表节点所包含的索引关键字的个数以及索引关键字的寻址信息,其中,第1层跳表中每个跳表节点中索引关键字的寻址信息用于:指示与该寻址信息相对应的索引关键字所处的内存页;
对于第1层跳表之上的第q层跳表,2≤q≤M,获取第q-1层跳表中,以第q-1层跳表中的首个跳表节点为起始节点,间隔为F的至少一个跳表节点的首个索引关键字;
将所述第q-1层中至少一个跳表节点的首个索引关键字依次写入第q层跳表的跳表节点,并在第q层跳表的每个跳表节点中记录该跳表节点所包含的索引关键字的个数以及索引关键字的寻址信息,其中,第q层跳表中每个跳表节点中索引关键字的寻址信息用于:指示与该寻址信息相对应的索引关键字在第q-1层跳表中所在的跳表节点;
如此,自下而上构建跳表索引,直至当跳表索引的层数或最上层跳表索引的跳表节点数量满足预设条件时,结束构建跳表索引。
其中,为了构造简单,跳表索引中每个跳表节点的长度可设置为固定长度,以适用于内存页的索引关键字长度较为平均的场景;当跳表节点采用固定长度时,可以将从下层提取的间隔为F的索引关键字依次写入当前层跳表中的跳表节点,若当前跳表节点存储空间已满,则写入该层的下一跳表节点,直至将从下层提取的索引关键字完全写入本层的跳表节点。
此外,当内存页的索引关键字长度差异较大时,有必要采取措施控制各跳表节点第1个索引关键字的长度,从而降低上层跳表索引的索引开销,提升索引的空间效率。具体的,可以采用可变长度跳表节点的跳表构建方法,将下层的索引关键字依次写入上层跳表节点中,具体实现方式如下:
获取第q-1层跳表中,以第q-1层跳表中的首个跳表节点为起始节点,间隔为F的至少一个跳表节点的首个索引关键字;
将至少一个跳表节点的首个索引关键字依次写入第q层第1个跳表节点;
若写入第i个索引关键字时,第1个跳表节点中被占用的长度L占用与Lnode-min的差值小于第i个索引关键字的存储开销,则计算第1个跳表节点中可使用的长度(Lnode-max-L占用)所能容纳的Nnode-more个索引关键字,其中,Lnode-min为每个跳表节点的最小长度,Lnode-max为每个跳表节点的最大长度;
确定Nnode-more个索引关键字中最短的索引关键字,将第i个索引关键字、以及第i个索引关键字到最短索引关键字之间的索引关键字写入到第1个跳表节点;
将最短索引关键字作为第q层第2个跳表节点的首个索引关键字写入第2个跳表节点,按照上述方式完成第2个跳表节点的构建;
重复上述过程,直至将从q-1层跳表提取到的至少一个索引关键字全部写入第q层跳表中。
如此,可以保证每层跳表中每个跳表节点的首个索引关键字是局部最短的。
进一步的,在第一方面的一种可实现方式中,在跳表索引构建之后,可以根据建立的跳表索引,自上而下查找与待查询字符串相关联的一些字符串,其具体实现如下:
获取待查询字符串;
自上而下查找所述跳表索引中的每层跳表,确定所述Q层跳表中的第t层跳表第j个跳表节点存储有与所述待查询字符串相匹配的第一索引关键字,其中,所述第一索引关键字的寻址信息指示:第t-1层跳表第r个跳表节点,查找所述第t-1层跳表第r个跳表节点中的索引关键字;
确定所述第t-1层跳表第r个跳表节点中存储有与所述待查询字符串相匹配的第二索引关键字,其中,所述第二索引关键字的寻址信息指示:第t-2层跳表第s个跳表节点,查找所述第t-2层跳表第s个跳表节点中的索引关键字;
重复上述过程,直至根据第1层跳表第d个跳表节点中存储的与所述待查询字符串相匹配的第三索引关键字,查找第h个内存页中每个字符串组的差异前缀,其中,所述第三索引关键字的寻址信息指示:所述第h个内存页;
确定所述第h个内存页中第w个字符串组的差异前缀与所述待查询字符串相匹配,查找所述第w个字符串组中的匹配字符串并返回查询结果。
需要说明的是,当字符串组中的字符串采用压缩方式写入内存页时,还需要将字符串解压后作为与待查询字符串相关联的字符串。
进一步的,在第一方面的一种可实现方式中,当在原有字符串序列中插入新字符串时,所述方法还可以包括:
确定插入的新字符串所属的第一内存页和第一字符串组;
将所述新字符串插入所述第一字符串组;
若插入新字符串后,第一字符串组内的字符串数量超过阈值,则获取与第一字符串组相邻的第二字符串组,并对第一字符串组和第二字符串组重新分组;
将重新分组后的字符串组顺序写入第一内存页,若在写入字符串组的过程中第一内存页中有字符串组溢出,则将溢出的字符串组写入与第一内存页相邻的下一内存页。
进一步的,在第一方面的一种可实现方式中,当删除原有字符串序列中的字符串时,所述方法还可以包括:
删除字符串序列中的第一字符串,第一字符串位于第二内存页和第三字符串组;
若删除第一字符串后,所述第三字符串组内的字符串数量小于阈值,则获取与所述第三字符串组相邻的第四字符串组,并对所述第三字符串组和所述第四字符串组重新分组;
将重新分组后的字符串组顺序写入第二内存页,若与第二内存页相邻的内存页、以及第二内存页的数据量之和小于一个内存页的数据量阈值,则合并这两个内存页。
需要说明的是,若对字符串序列插入或删除字符串后,引起内存页数量或者内存页的索引关键字发生变化,则需要自下而上依次更新跳表索引中的跳表节点,直至跳表索引重建完成。
由于在本发明实施例中,分组、分页和跳表索引均有一定的空间弹性,因此,插入或删除字符串一般只引起局部重构,不需完全重建跳表索引,效率较高。
第二方面,本发明实施例提供一种压缩索引装置,用于执行第一方面所述的方法,所述装置可以包括:
获取单元,用于获取有序排列的字符串序列;
分组单元,用于根据字符串序列中每个字符串的差异前缀长度,对字符串序列进行分组处理,获得M个字符串组,每个字符串组的差异前缀长度为该字符串组中首个字符串组的差异前缀长度,以使每个字符串组中首个字符串的差异前缀长度在预设字符串范围内是最短的;
分页单元,用于将分组单元获得的M个字符串组依次存储到N个内存页中,内存页的索引关键字为该内存页中首个字符串组的差异前缀;
跳表索引构建单元,用于根据所述分页单元获得的N个内存页的索引关键字构建包含Q层跳表的跳表索引,其第1层跳表可以根据N个内存页的索引关键字构建,每层跳表包含至少一个跳表节点,每个跳表节点包含至少一个索引关键字、索引关键字的个数以及索引关键字的寻址信息。
需要说明的是,上述有序字符串序列可以为按照字典升序或降序排列的字符串序列。
如此,通过对有序字符串序列进行分组和分页处理,构建跳表索引。由于字符串组的差异前缀长度在一定字符串范围内是最短的,使得根据字符串组的差异前缀长度分页后的每页的索引关键字也是局部最短的,进而在页的基础上构建的跳表索引内的索引关键字的长度也是比较短的,降低了跳表索引中索引关键字的平均长度,提升了跳表节点的容纳能力,从而达到减少索引节点数量和降低索引查找复杂度的有益效果。
其中,分组单元的具体执行过程与第一方面所述的分组过程相同,分页单元的具体执行过程与第一方面所述的分页过程相同,跳表索引构建单元的具体执行过程与第一方面所述的跳表索引构建方法相同。
进一步的,所述压缩索引装置还可以包括:查询单元,用于查询字符串序列中与待查询字符串相关联的字符串,其具体执行过程与第一方面所述的字符串查询过程相同。
进一步的,所述压缩索引装置还可以包括:字符串插入单元,用于向字符串序列中插入新字符串,其具体执行过程与第一方面所述的插入新字符串的过程相同,
进一步的,所述压缩索引装置还可以包括:字符串删除单元,用于删除字符串序列中的字符串,其具体执行过程与第一方面所述的删除字符串序列中字符串的过程相同。
需要说明的是,上述压缩索引装置可以设置在数据存储系统的任一计算机中,也可以独立于任何设备设置在数据存储系统中;第二方面所述的获取单元可以为压缩索引装置中的收发器,第二方面中的分组单元、分页单元、跳表索引构建单元、查询单元、字符串插入单元、字符串删除单元可以为单独设立的处理器,也可以集成在压缩索引装置的某一个处理器中实现,此外,也可以以程序代码的形式存储于压缩索引装置的存储器中,由压缩索引装置的某一个处理器调用并执行以上分组单元、分页单元、跳表索引构建单元、查询单元、字符串插入单元以及字符串删除单元。这里所述的处理器可以是一个中央处理器(Central Processing Unit,CPU),或者是特定集成电路(Application SpecificIntegrated Circuit,ASIC),或者是被配置成实施本发明实施例的一个或多个集成电路。
由上可知,本发明实施例提供一种字符串序列的压缩索引方法及装置,获取有序排列的字符串序列,根据所述字符串序列中每个字符串的差异前缀长度对所述字符串序列进行分组处理,获得M个字符串组,每个字符串组中首个字符串的差异前缀长度在预设字符串范围内是最短的,将M个字符串组依次存储到N个内存页中,根据所述N个内存页的索引关键字构建跳表索引。如此,在对有序字符串序列进行分组和分页处理后,构建跳表索引。由于每个字符串组的差异前缀长度在局部是最短的,使得根据字符串组的差异前缀长度分页后的每页的索引关键字也是局部最短的,进而在页的基础上构建的跳表索引内的索引关键字的长度也是比较短的,降低了跳表索引中索引关键字的平均长度,提升了跳表节点的容纳能力,从而达到减少索引节点数量和降低索引查找复杂度的有益效果,避免了现有CS-Prefix-Tree编码索引过程中,底层叶节点存在过长的差异前缀长度,导致编码索引分支节点的容纳能力下降,增加分支节点数量和查找复杂度的问题。
附图说明
为了更清楚地说明本发明实施例或现有技术中的技术方案,下面将对实施例或现有技术描述中所需要使用的附图作简单地介绍,显而易见地,下面描述中的附图仅仅是本发明的一些实施例,对于本领域普通技术人员来讲,在不付出创造性劳动的前提下,还可以根据这些附图获得其他的附图。
图1为现有CS-Prefix-Tree索引结构图;
图2为本发明实施例提供的压缩索引装置10的结构图;
图3为本发明实施例提供的一种字符串序列的压缩索引方法的流程图;
图4为本发明实施例提供的有序字符串序列分组及分页过程示意图;
图5为本发明实施例提供的页内字符串编码存储示意图;
图6为本发明实施例提供的采用固定长度节点构建跳表索引的过程示意图;
图7为本发明实施例提供的采用可变长度节点构建跳表索引的过程示意图;
图8为本发明实施例提供的压缩索引装置20的结构图。
具体实施方式
本发明的核心思想是:对多个有序字符串进行分组处理,使各组间相邻字符串的差异前缀长度最短,再对多个字符串组进行分页处理,使页间相邻字符串的差异前缀长度最短,定义页的索引关键字为其所容纳的首个字符串的差异前缀,在页的基础上,逐层构建跳表索引,跳表索引用于通过索引关键字查找页内分组中的字符串;需要说明的是,分组及分页过程不改变字符串的有序性,各组及各页之间的顺序与其所容纳字符串之间的顺序相同。
下面结合本发明实施例中的附图,对本发明实施例中的技术方案进行清楚、完整的描述,显然,所描述的实施例仅仅是本发明一部分实施例,而不是全部的实施例。基于本发明中的实施例,本领域普通技术人员在没有作出创造性劳动前提下所获得的所有其他实施例,都属于本发明保护的范围。
图2为本发明实施例提供的压缩索引装置10的结构图,用于执行本发明所提供的压缩索引方法。所述压缩索引装置10可以为数据库系统中可进行数据存储的装置,可以设置在任一计算机中,也可以独立于任一设备存在于数据存储系统,具体的,如图2所示,所述压缩索引装置10可以包括:处理器1011、收发器1012、存储器1013、以及至少一个通信总线1014,通信总线1014用于实现这些装置之间的连接和相互通信;
处理器1011可能是一个中央处理器(Central Processing Unit,简称为CPU),也可以是特定集成电路(Application Specific Integrated Circuit,ASIC),或者是被配置成实施本发明实施例的一个或多个集成电路,例如:一个或多个微处理器(Digital SignalProcessor,DSP),或,一个或者多个现场可编程门阵列(Field Programmable Gate Array,FPGA)。
收发器1012可用于与外部网元之间进行数据交互。
存储器1013,可以是易失性存储器(Volatile Memory),例如随机存取存储器(Random-Access Memory,RAM);或者非易失性存储器(Non-Volatile Memory),例如只读存储器(Read-Only Memory,ROM),快闪存储器(Flash Memory),硬盘(Hard Disk Drive,HDD)或固态硬盘(Solid-State Drive,SSD);或者上述种类的存储器的组合。
通信总线1014可以分为地址总线、数据总线、控制总线等,可以是工业标准体系结构(Industry Standard Architecture,ISA)总线、外部设备互连(Peripheral ComponentInterconnect,PCI)总线或扩展工业标准体系结构(Extended Industry StandardArchitecture,EISA)总线等。为便于表示,图2中仅用一条粗线表示,但并不表示仅有一根总线或一种类型的总线。
具体的,当处理器1011获取到有序字符串序列后,根据字符串序列中每个字符串的差异前缀长度,对所述字符串序列进行分组处理,获得M个字符串组,以使每个字符串组中首个字符串的差异前缀长度在预设字符串范围内是最短的;
将M个字符串组依次存储到N个内存页中,每个内存页的索引关键字为:该内存页中首个字符串组的差异前缀;
根据N个内存页的索引关键字构建包含Q层跳表的跳表索引,所述Q层跳表中的第1层跳表根据所述N个内存页的索引关键字构建,每层跳表包含至少一个跳表节点;每个跳表节点包含至少一个索引关键字、索引关键字的个数以及索引关键字的寻址信息,以便后续通过跳表索引中的索引关键字查找某页内某组中的字符串。
需要说明的是,在将M个字符串组依次存储到N个内存页中的过程中,可以根据所述M个字符串组中每个字符串组的差异前缀长度,将所述M个字符串组依次存储到所述N个内存页中,以使所述N个内存页中的每个内存页的首个字符串组的差异前缀长度在预设字符串组范围内是最短的。
所述Q层跳表可以为逐层构建的多层跳表,所述Q层跳表中的第q层跳表根据第q-1层跳表中间隔为稀疏系数F的跳表节点的首个索引关键字构建,所述F为大于等于1的整数,所述q为大于等于2的整数。
如此,在对有序字符串序列进行分组和分页处理后,构建跳表索引。由于每个字符串组的差异前缀长度在预设字符串范围内是最短的,使得根据字符串组的差异前缀长度分页后的每页的索引关键字也是局部最短的,进而在页的基础上构建的跳表索引内的索引关键字的长度也是比较短的,降低了跳表索引中索引关键字的平均长度,提升了跳表节点的容纳能力,从而达到减少索引节点数量和降低索引查找复杂度的有益效果。
为了便于描述,以下实施例一以步骤的形式示出并详细描述了本发明提供的字符串序列的压缩过程,其中,示出的步骤也可以在一组可执行指令的计算机系统中执行。此外,虽然在图中示出了逻辑顺序,但是在某些情况下,可以以不同于此处的顺序执行所示出或描述的步骤。
实施例一
图3为本发明实施例提供的一种字符串序列的压缩索引方法的流程图,由图2所示的压缩索引装置10执行,如图3所示,所述字符串序列的压缩索引方法可以包括以下步骤:
S101:获取字符串序列,所述字符串序列包含有序排列的一个以上字符串。
可选的,可以从列存数据库中直接读取字符串序列。
需要说明的是,有序排列的一个以上字符串可以按照字典升序排列,也可以按照字典降序排列,本发明实施例对此不进行限定,本发明仅以按照字典升序排列的字符串序列为例对本发明提供的压缩索引方法进行说明。例如,图3左侧的字符串序列就是按照”A~Z”的字典升序排列的字符串序列。
S102:根据所述字符串序列中每个字符串的差异前缀长度对所述字符串序列进行分组处理,获得M个字符串组,以使每个字符串组中首个字符串的差异前缀长度在预设字符串范围内是最短的,其中,所述M为大于等于1的整数,每个字符串组包含至少一个字符串,每个字符串组的差异前缀为该字符串组中首个字符串的差异前缀。
不失一般性,设给定的字符串序列为S={s1,s2,s3,...,sn},若该字符串序列按照字典升序排列,则当字符串si排列在字符串sj前面,则规定si<sj。若si与sj相邻且si<sj,则称si是sj的前驱字符串,sj是si的后继字符串,若两者共享前缀长度为1,则后继字符串sj的差异前缀为:字符串sj中长度为1+1的前缀子串;需要说明的是,对于字符串序列中的首个字符串,规定其前驱字符串为空串,其对应的差异前缀长度为1。需要说明的是,上述字符串si排列在字符串sj前面可以指按照字典升序,字符串si先于字符串sj排列。例如,先后排列的两个字符串“abe”和“afe”,字符串“abe”是字符串“afe”的前驱字符串,二者共享前缀为“a”,共享前缀长度为1,则字符串“afe”的差异前缀长度为:该字符串中长度为2的前缀字符串“af”。
可选的,在本发明实施例中,可以通过下述方法获得M个字符串组中的第m个字符串组,1≤m≤M,即第m个字符串组为M个字符串组中的任一字符串组:
设定M个字符串组中每个字符串组包含的字符串的个数的最小阈值Wmin、最大阈值Wmax;
确定第m个字符串组的首个字符串;
以所述第m个字符串组的首个字符串为起始字符串,依次计算后续Wmax个字符串中每个字符串的差异前缀长度;
确定第k个字符串,第k个字符串为后续第Wmin个字符串到后续第Wmax个字符串中差异前缀长度最小的字符串,Wmin≤k≤Wmax;
将所述第m个字符串组的首个字符串到第k-1个字符串之间的字符串的集合确定为所述第m个字符串组,并将第k个字符串作为第m+1个字符串组的首个字符串。
将第k个字符串作为第m+1个字符串组的首个字符串后,可以按照上述方式确定第m+1个字符串组,如此重复进行,直至将字符串序列中的字符串处理完成,可以将字符串序列按照字符串序列的排序分成M个字符串组。
需要说明的是,对于第1个字符串组,其首个字符串为字符串序列中的第1个字符串,此外,当第Wmin个字符串到第Wmax个字符串中差异前缀长度最小的字符串不止一个时,通常将第Wmin个字符串到第Wmax个字符串中差异前缀长度最小的字符串中排在最前面的字符串作为下一分组的首个字符串。
其中,每个字符串组所能包含的字符串的个数的最小阈值Wmin是指字符串组最少可容纳的字符串的个数;最大阈值Wmax可以是指字符串最大可容纳的字符串的个数,二者可以根据需要进行设置,本发明实施例对此不进行限定,并且,各字符串组所能容纳的字符串的个数的最小阈值Wmin和最大阈值Wmax可以相同,也可以不相同。
例如,图4左侧给出了一组有序字符串序列,设每个字符串组的Wmin=2,Wmax=8,首先,将该字符串序列中的第1个字符串“Alabama A&M University(AL)”作为第1个字符串组的首个字符串,以该字符串为起始字符串,计算“Alabama A&M University(AL)”~“American University(DC)”8个字符串的差异前缀长度“1、8、2、16、9、11、15、9”,确定第2~第10个差异前缀长度中差异前缀长度最短的字符串为“American College(PA)”,此时,可以将字符串“American College(PA)”之前到第1个字符串的字符串划分到第1个字符串组,同时,将字符串“American College(PA)”作为第2个字符串组的首个字符串,重复上述过程,确定第2个字符串组,以及后续其他分组,直至将字符串序列中每个字符串分组完成,并将分组后的10个组依次标记为G1到G10。
S103:将所述M个字符串组依次存储到N个内存页中,所述N为大于等于1的整数,每个内存页包含至少一个字符串组,每个内存页的索引关键字为:该内存页中首个字符串组的差异前缀。
其中,N个内存页的地址可以是连续的,也可以是不连续的,每个内存页的大小可以为计算机系统缓存块大小Cblock的整数倍,各内存页的大小可以相同,也可以不同。
可选的,在本发明实施例中,可以根据所述M个字符串组中每个字符串组的差异前缀长度,将所述M个字符串组依次存储到所述N个内存页中,以使所述N个内存页中的每个内存页的首个字符串组的差异前缀长度在预设字符串组范围内是最短的;
具体的,将字符串组存储到N个内存页中的第n个内存页中,1≤n≤N,即第n个内存页为N个内存页中任一内存页,可以包括:
设定所述N个内存页中每个内存页的最小容量Cmin和最大容量Cmax;
确定第n个内存页的首个字符串组;
以所述所述第n个内存页的首个字符串组为起始字符串组,依次将所述M个字符串组中至少一个字符串组存储到第n个内存页;
若存储到第i个字符串组时,所述第n个内存页中被占用的存储容量C占用与Cmin的差值小于第i个字符串组的存储开销,则计算所述第n个内存页中可使用的存储容量(Cmax-C占用)所能容纳的Nmore个字符串组,所述Nmore个字符串组为:以所述第i个字符串组开始依次排列的Nmore个字符串组;
确定所述Nmore个字符串组中差异前缀最短的字符串组,将所述第i个字符串组、以及所述第i个字符串组到所述前缀最短字符串组之间的字符串组依次存储到所述第n个内存页中,将所述前缀最短字符串组作为第n+1个内存页的首个字符串组。
确定第n+1个内存页的首个字符串后,可以按照上述方式依次将相应的字符串组存储到第n+1个内存页中,如此重复进行,可以将字符串组按照排序依次存入到N个内存页中。
需要说明的是,对于第1个内存页,其首个字符串组为M个字符串组中的第1个字符串组,此外,当所述Nmore个字符串组中差异前缀最小的字符串组不止一个时,通常将Nmore个字符串组中差异前缀最小的字符串组中排在最前面的字符串组作为下一分页的首个字符串组。
其中,每个内存页最小容量Cmin和最大容量Cmax可以根据内存页实际可存储的存储容量进行设置,本发明实施例对此不进行限定,并且,各内存页的最小容量Cmin和最大容量Cmax可以相同,也可以不相同;可选的,最小容量Cmin和最大容量为Cmax均为计算机系统缓存块大小Cblock的整数倍。
需要说明的是,内存页中的字符串组可以在页内重新进行编号,不需要与分组后的字符串组的编号相同。其中,为了快速定位到页内各分组,在构造内存页的过程中还需要记录内存页中每个分组的起始地址,并在分组写入完成后,将所有地址逆序写入页尾部预留的索引空间。此外,还可以在页头或页尾预留固定长度字段,记录页内分组数量。为了便于查找,还需要存储每个内存页的地址信息。
例如,图4右侧为将字符串组分页的过程示意图,从字符串组G1开始,依次将G1、G2、G3存储到第1个内存页p1,若内存页p1容纳分组G1、G2和G3后,其被占用的容量接近最小容量阈值Cmin,但到最小容量阈值Cmin的可使用容量又不够存储分组G4,则依次向前查找两个分组G4、G5,若确定内存页p1存储G4、G5达到最大容量阈值Cmax,则将分组G4、G5中最短差异前缀长度的分组G4作为下一内存页p2的起始首个字符串分组,将G4之前G1~G3的3个字符串组存储到内存页p1中,重复上述过程,直到完成p2、p3分页,每个页内部的分组用g1、g2、g3等顺序编址,其中,图中p1、“A”分别代表内存页p1的地址和索引关键字。
进一步的,由于字符串组中的字符串序列间具有共享前缀,因此,为了提高字符串存储效率,在本发明实施例中,还可以将字符串组中除首个字符串之前的字符串以压缩形式存储到内存页中,即对于待存储到N个内存页中第y个内存页的M个字符串组的第x个字符串组,1≤x≤M,1≤y≤N,可以通过下述压缩存储方式将第x个字符串组存储到第y个内存页中:
将第x个字符串组的首个字符串以不压缩形式写入到第y个内存页的可用空间;
对所述第x个字符串组中除首个字符串之外的其他任一字符串,获取所述其他任一字符串与其相邻的前一个字符串间的共享前缀,将其他任一字符串与其相邻的前一字符串间的共享前缀长度、以及所述其他任一字符串中在共享前缀之后的后缀字符串写入所述第n个内存页的可用空间。
例如,图5给出了对图4中内存页p2进行编码存储的示意图,以第1个分组g1为例,首字符串“Arizona State Polytechnic Campus(AZ)”以不压缩形式存储,原组内第2个字符串“Arizona State University(AZ)”与首个字符串的共享前缀为“Arizona State”,长度为14,则将字符串“14University(AZ)”存为p2中第1个分组g1的第2个字符串,同理,第3个字符串存储为“25West(AZ)”,其中“25”代表其与第2个字符串的共享前缀“ArizonaState University”的长度,待内存页p2写入分组数据后,将分组数量“3”采用逆序方式写入页尾预留空间,将分组的页内地址g3、g2、g1写入页尾。
从图4左侧给出的字符串序列可以看出,该字符串序列中最短的差异前缀如“A”、“B”长度为1,最长的差异前缀如“Arizona State University W”长度为26,而通过所述分组及分页方法之后,可以有效避免较长的差异前缀成为内存页的索引关键字,降低后续构建索引的存储开销。
S104:根据所述N个内存页的索引关键字构建跳表索引,所述跳表索引包含Q层跳表,所述Q为大于等于1的整数,所述跳表索引的第1层跳表根据所述N个内存页的索引关键字构建,每层跳表包含至少一个跳表节点,每个跳表节点包含至少一个索引关键字、索引关键字的个数以及索引关键字的寻址信息。
其中,所述Q层跳表可以为逐层构建的多层跳表,所述Q层跳表中的第q层跳表可以根据第q-1层跳表中间隔为稀疏系数F的跳表节点的首个索引关键字构建,所述F为大于等于1的整数,所述q为大于等于2的整数,所述稀疏系数F可以根据需要进行设定,本发明实施例对此不进行限定,每个跳表节点的长度Lnode可以为计算机系统缓存长度的整数倍。
可选的,当跳表索引包含至少两层跳表时,可以采用下述方式构建跳表索引包括:
将N个内存页的索引关键字依次写入第1层跳表的跳表节点,并在每个跳表节点中记录该跳表节点所包含的索引关键字的个数以及索引关键字的寻址信息,其中,所述第1层跳表中每个跳表节点中索引关键字的寻址信息用于指示与该寻址信息相对应的索引关键字所处的内存页;
对于所述跳表索引中所述第1层跳表之上的第q层跳表,2≤q≤M,获取所述跳表索引中第q-1层跳表中,以第q-1层跳表中的首个跳表节点为起始节点,间隔为F的至少一个跳表节点的首个索引关键字;
将所述至少一个跳表节点的首个索引关键字依次写入第q层跳表的跳表节点,并在第q层跳表的每个跳表节点中记录该跳表节点所包含的索引关键字的个数以及索引关键字的寻址信息,其中,所述第q层跳表中每个跳表节点中索引关键字的寻址信息用于指示与该寻址信息相对应的索引关键字在所述第q-1层跳表中所在的跳表节点。
如此,自下而上先构建第1层跳表,再依次向上构建第q层跳表,直至构建的层数Q或第Q层跳表包含的跳表节点的个数满足预设条件或者最上层跳表收敛至一个跳表节点时,停止构建跳表索引;其中,预设条件可以根据需要进行设置,本发明实施例对此不进行限定。
其中,为了便于构造跳表索引,可以采用固定长度的跳表节点。当采用固定长度的跳表节点时,将从第q-1层跳表提取的索引关键字依次写入第q层跳表的跳表节点可以包括:
按照索引关键字排序,依次将索引关键字写入第q层跳表的跳表节点;每写入一个索引关键字,记录其对应的寻址信息,并更新跳表节点内索引关键字数量,计算跳表节点的剩余可用空间;
若当前正写入的跳表节点无法容纳下一个索引关键字,则分配新的跳表节点,按照上述方式写入索引关键字,直到所有索引关键字及寻址信息写入完成。
同理,将N个内存页的索引关键字写入第1层跳表中的跳表节点与上述过程相同,在此不再详细赘述。
例如,图6给出了采用固定长度跳表节点的保序压缩索引示意图,第1层跳表共有7个节点,地址分别为n1-1到n1-7,记录了全部39个页的索引关键字和地址,以第1层第1个跳表节点为例,其地址为n1-1,第1个字段“3”代表记录3个索引关键字,第2个字段记录3个索引关键字分别为“A”、“Ar”和“B”,第3个字段记录3个索引关键字在节点内的偏移地址和对应内存页的地址;如(o1,p1)代表索引关键字“A”记录在节点n1-1中偏移量为o1的位置,“A”所对应内存页的地址为p1。需要说明的是,索引关键字“A”、“Ar”和“B”紧跟第1个字段顺序写入,而(o1,p1)、(o2,p2)和(o3,p3)从节点尾部开始逆序写入,从而可以使空闲空间集中在第2、3字段中间,以最大化节点的容纳能力。
设定稀疏系数F=2,则图6中第1层跳表中间隔为2的4个节点:第1、3、5、7节点可被依次索引到第2层跳表中地址分别为n2-1和n2-2的两个跳表节点中。以第2层第1个节点为例,其地址为n2-1,第1个字段“3”代表记录了3个索引关键字,第2个字段分别记录n1-1、n1-3和n1-5所容纳的第1个索引关键字,包括“A”、“C”等,其中n1-5的信息限于图片尺寸未明确列出,第3个字段以逆序方式记录3个索引关键字在节点内的偏移地址和对应下层跳表节点的地址。如(o1,n1-1),代表索引关键字“A”记录在节点n2-1中偏移量为o1的位置,“A”所对应的下层跳表节点的地址为n1-1。
此时,若第2层中跳表节点的个数或跳表层数2满足预设条件,则停止构建跳表索引,否则,继续按照上述方法构建跳表索引,直至最上层跳表中跳表节点的个数或跳表层数满足预设条件。
进一步的,当各内存页的索引关键字长度差异较大时,为了降低上层跳表的索引开销,提高索引的空间效率,在本发明实施例中,还可以采用可变长度的跳表节点构建跳表索引。当采用可变长度的跳表节点构建跳表索引时,所述将从第q-1层跳表提取的至少一个跳表节点的首个索引关键字依次写入第q层跳表的跳表节点可以包括:
以至少一个跳表节点的首个索引关键字中的第1个索引关键字为起始索引关键字,依次将至少一个跳表节点的首个索引关键字写入到第q层跳表的跳表节点;
若写入第i个索引关键字时,正在写入的跳表节点中被占用的长度L占用与Lnode-min的差值小于第i个索引关键字的存储开销,则计算所述正在写入的跳表节点中可使用的长度(Lnode-max-L占用)所能容纳的Nnode-more个索引关键字,所述Nnode-more个索引关键字为:以所述第i个索引关键字开始依次排列的Nnode-more个索引关键字;
确定所述Nnode-more个索引关键字中最短的索引关键字,将所述第i个索引关键字、以及所述第i个索引关键字到所述Nnode-more个索引关键字中最短的索引关键字之间的索引关键字写入到正在写入的跳表节点中,将所述最短的索引关键字作为下一跳表节点的首个索引关键字写入所述下一跳表节点。
确定下一跳表节点的首个字符串后,可以按照上述方式依次将相应的索引关键字写入下一跳表节点中,如此重复进行,可以将索引关键字按照排序依次存入到第q层跳表的跳表节点。需要说明的是,在计算剩余可用长度(Lnode-max-L占用)时,需扣除索引关键字对应寻址信息的预留存储开销。
其中,Lnode-min为每个跳表节点的最小长度,Lnode-max为每个跳表节点的最大长度,每个跳表节点的最小长度Lnode-min和最大长度Lnode-max可以根据跳表节点实际长度进行设置,本发明实施例对此不进行限定,并且,各跳表节点的最小长度Lnode-min和最大长度Lnode-max可以相同,也可以不相同。
例如,图7给出了采用可变长度跳表节点构建跳表索引的示意图。图7中,第1层跳表记录了全部39个内存页的索引关键字和地址,以第1层跳表的第1个跳表节点为例,其长度2*Lline为2倍计算机系统缓存线长度,地址为n1-1,第2个字段“5”代表记录了5个索引关键字,第3个字段记录5个索引关键字分别为“A”、“Ar”、“B”、“Bo”和“Bu”,第4个字段记录5个索引关键字在节点内的偏移地址和对应页的地址。如(o1,p1)代表索引关键字“A”记录在节点n1-1中偏移量为o1的位置,“A”所对应页的地址为p1。需要说明的是“A”、“Ar”、“B”、“Bo”和“Bu”紧跟第2个字段顺序写入,(o1,p1)、(o2,p2)、(o3,p3)、(o4,p4)和(o5,p5)从节点尾部开始逆序写入,从而可以使空闲空间集中在第3、4字段中间,以最大化节点的容纳能力。
设定稀疏系数F=1,因此第1层跳表中的第1至5个跳表节点可被索引到第2层跳表。以第2层第1个跳表节点为例,其地址为n2-1,长度1*Lline为1倍计算机系统缓存线长度,第2个字段“5”代表记录了5个索引关键字;第3个字段分别记录n1-1到n1-5所容纳的第1个索引关键字,包括“A”、“C”、…、“Y”等,部分节点信息限于图片大小未明确列出;第4个字段以逆序方式记录5个索引关键字在节点内的偏移地址和对应下层跳表节点的地址。如(o1,n1-1),代表索引关键字“A”记录在节点n2-1中偏移量为o1的位置,“A”所对应的下层跳表节点的地址为n1-1。图中第2层跳表共有1个节点,地址为n2-1,且创建第2层跳表之后索引构造完成。
可理解的是,在本发明实施例中,每层跳表中各跳表节点的存储空间可以是连续分配的,也可以是非连续分配的。当每层跳表中各跳表节点的存储空间可以是连续分配时,若知该层跳表中第1个跳表节点的存储地址Addr1,则可以根据Addri=Addr1+(i-1)*Lnode计算得出该层跳表中其他跳表节点的存储地址,因此,可以仅将跳表的起始地址和结束地址记录到如<n1-start,n1-end>的元组,以避免查找过程中的访问越界。
当每层跳表中各跳表节点的存储空间不连续时,则需要采用链表结构,在每个跳表节点内增加指针字段,指向同层相邻的下一个跳表节点,并在每层的最后一个跳表节点设置结束标记,以避免查找过程中的访问越界。
进一步的,作为压缩索引的逆过程,当用户需要查找数据库中存储的与一字符串有关的所有字符串时,可以从根据跳表索引中的索引关键字自上而下查找相应的内存页,在该内存页中查找相应分组,将该分组中的字符串反馈给用户;具体的,所述方法还可以包括:
获取待查询字符串;
自上而下查找所述跳表索引中的每层跳表,确定所述Q层跳表中第t层跳表第j个跳表节点存储有与所述待查询字符串相匹配的第一索引关键字,其中,所述第一索引关键字的寻址信息指示:第t-1层跳表第r个跳表节点,查找所述第t-1层跳表第r个跳表节点中的索引关键字;
确定所述第t-1层跳表第r个跳表节点中存储有与所述待查询字符串相匹配的第二索引关键字,其中,所述第二索引关键字的寻址信息指示:第t-2层跳表第s个跳表节点,查找所述第t-2层跳表第s个跳表节点中的索引关键字;
重复上述过程,直至根据第1层跳表第d个跳表节点中存储的与所述待查询字符串相匹配的第三索引关键字,查找第h个内存页中每个字符串组的差异前缀,其中,所述第三索引关键字的寻址信息指示:所述第h个内存页;
确定所述第h个内存页中第w个字符串组的差异前缀与所述待查询字符串相匹配,查找所述第w个字符串组中的匹配字符串并返回查询结果。
需要说明的是,当字符串组中的字符串采用压缩方式写入内存页时,还需要将字符串解压后作为与待查询字符串相关联的字符串。
其中,与待查询字符串相匹配的索引关键字可以为:按照字典升序先于待查询字符串排列的索引关键字,或者与待查询字符串具有共享前缀的字符串。
下面以用户需要查找所有前缀为“Art Institute”的字符串为例,结合图6和图4对根据索引关键字查找字符串的过程进行介绍:
首先,查找跳表索引的最上层跳表,图6中为第2层节点,通过比较第2层跳表第1个跳表节点n2-1中的索引关键字“A”和“C”,得知“Art Institute”应该在第1层跳表节点的n1-1和n1-3之间查找,由于“Art Institute”小于“C”,查找范围不包括n1-3。
其次,依次比较n1-1和n1-2中的第1个关键字“A”和“Bo”,由“Art Institute”小于“Bo”可知,查找范围不包括n1-2。
再次,通过比较节点n1-1中的索引关键字“Ar”和“B”,得知“Art Institute”应该在页节点p2和p3之间查找,由于“Art Institute”小于“B”,查找范围不包括p3。
然后,在图4中内存页p2内查找,首先,读取各分组的页内地址g1、g2、g3,访问各分组的第1个非压缩的字符串,比较得知“Art Institute”大于“Art Institute of Atlanta(GA)”的差异前缀“Art”且小于“Austin College(Tx)”,可知前缀为“Art Institute”的字符串位于p2页中的g2分组。
最后,根据记录的共享前缀长度依次解压缩g2分组中的字符串,并返回前缀为“Art Institute”的所有结果。
进一步的,本发明实施例还可以动态地向字符串序列中插入字符串,其具体实现如下:
获取一个新字符串,所述新字符串为不在所述字符串序列中的字符串;
确定所述新字符串所属的第一内存页和第一字符串组;
将所述新字符串插入所述第一字符串组;
若插入所述新字符串后,所述第一字符串组内的字符串数量超过阈值,则获取与所述第一字符串组相邻的第二字符串组,并对所述第一字符串组和所述第二字符串组重新分组;
将重新分组后的字符串组顺序写入所述第一内存页,若所述第一内存页中有字符串组溢出,则将溢出的字符串存入与所述第一内存页相邻的下一内存页。
其中,所述第二字符串组可以为与第一字符串组相邻的下一个字符串组。
需要说明的是,可以采用步骤S102、S103的方法确定所述新字符串所属的第一内存页和第一字符串组;此外,若插入新字符串导致内存页的数量或索引关键字发生变化,则需要自下向上依次更新跳表节点,直到索引重建完成。
相应的,本发明实施例还可以动态地向删除字符串序列中的字符串,其具体实现如下:
删除所述字符串序列中的第一字符串,所述第一字符串位于第二内存页和第三字符串组;
若删除所述第一字符串后,所述第三字符串组内的字符串数量小于阈值,则获取与所述第三字符串组相邻的第四字符串组,并对所述第三字符串组和所述第四字符串组重新分组;
将重新分组后的字符串组顺序写入第二内存页,若与第二内存页相邻的内存页以及第二内存页的数据量之和小于一个内存页的数据量阈值,则合并这两个内存页。
其中,第四字符串组可以为与第三字符串组相邻的上一个字符串组,也可以为与第三字符串组相邻的下一个字符串;内存页的数据量阈值可以根据需要进行设置,本发明实施例对此不进行限定。
需要说明的是,若删除字符串后,导致内存页的数量或索引关键字发生变化,则自下向上依次更新跳表节点,直到索引重建完成。
由于在本发明实施例中,字符串组、内存页和跳表索引均有一定的空间弹性,因此,插入/删除字符串一般只引起局部重构,效率较高。
由上可知,本发明实施例提供一种字符串序列的压缩索引方法,获取有序排列的字符串序列,根据所述字符串序列中每个字符串的差异前缀长度对所述字符串序列进行分组处理,获得M个字符串组,以使每个字符串组中首个字符串的差异前缀长度在预设字符串范围内是最短的,将M个字符串组依次存储到N个内存页,根据N个内存页的索引关键字构建跳表索引。如此,在对有序字符串序列进行分组和分页处理后,构建跳表索引。由于每个字符串组的差异前缀长度在预设字符串范围内是最短的,使得根据字符串组的差异前缀长度分页后的每页的索引关键字也是局部最短的,进而在页的基础上构建的跳表索引内的索引关键字的长度也是比较短的,降低了跳表索引中索引关键字的平均长度,提升了跳表节点的容纳能力,从而达到减少索引节点数量和降低索引查找复杂度的有益效果,避免了现有CS-Prefix-Tree编码索引过程中,底层叶节点存在过长的差异前缀长度,导致编码索引分支节点的容纳能力下降,增加分支节点数量和查找复杂度的问题。
根据本发明实施例,本发明下述实施例还提供了一种压缩索引装置20,优选地用于实现上述方法实施例中的方法。
实施例二
图8为本发明实施例提供的一种压缩索引装置20的结构图,用于执行实施例一所述的方法,如图8所示,所述装置可以包括:
获取单元201,用于获取字符串序列,所述字符串序列包含有序排列的一个以上字符串。
分组单元202,用于根据所述获取单元201获取到的字符串序列中每个字符串的差异前缀长度,对所述字符串序列进行分组处理,获得M个字符串组,以使每个字符串组中首个字符串的差异前缀长度在预设字符串范围内是最短的,其中,所述M为大于等于1的整数,每个字符串组包含至少一个字符串,每个字符串组的差异前缀为该字符串组中首个字符串的差异前缀。
分页单元203,用于将所述分组单元202获得的M个字符串组依次存储到N个内存页中,所述N为大于等于1的整数,每个内存页包含至少一个字符串组,每个内存页的索引关键字为:该内存页中首个字符串组的差异前缀。
跳表索引构建单元204,根据所述分页单元203得到的N个内存页的索引关键字构建跳表索引,所述跳表索引包含Q层跳表,所述Q为大于等于1的整数,所述Q层跳表的第1层跳表根据所述N个内存页的索引关键字构建,每层跳表包含至少一个跳表节点,每个跳表节点包含至少一个索引关键字、索引关键字的个数以及索引关键字的寻址信息。
可选的,在本发明实施例中,分组单元202可以通过下述方法获得M个字符串组中的第m个字符串组,1≤m≤M:
设定M个字符串组中每个字符串组包含的字符串的个数的最小阈值Wmin、最大阈值Wmax;
确定第m个字符串组的首个字符串;
以所述第m个字符串组的首个字符串为起始字符串,依次计算后续Wmax个字符串中每个字符串的差异前缀长度;
确定第k个字符串,第k个字符串为后续第Wmin个字符串到后续第Wmax个字符串中差异前缀长度最小的字符串,Wmin≤k≤Wmax;
将所述第m个字符串组的首个字符串到第k-1个字符串之间的字符串的集合确定为所述第m个字符串组,并将第k个字符串作为第m+1个字符串组的首个字符串。
将第k个字符串作为第m+1个字符串组的首个字符串后,可以按照上述方式确定第m+1个字符串组,如此重复进行,可以将字符串序列按照字符串序列的排序分成M个字符串组。
需要说明的是,对于第1个字符串组,其首个字符串为字符串序列中的第1个字符串,此外,当第Wmin个字符串到第Wmax个字符串中差异前缀长度最小的字符串不止一个时,通常将第Wmin个字符串到第Wmax个字符串中差异前缀长度最小的字符串中排在最前面的字符串作为下一分组的首个字符串。
可选的,在本发明实施例中,分页单元203可以根据所述M个字符串组中每个字符串组的差异前缀长度,将所述M个字符串组依次存储到所述N个内存页中,以使所述N个内存页中的每个内存页的首个字符串组的差异前缀长度在预设字符串组范围内是最短的;具体的,分页单元203将字符串组存储到N个内存页中的第n个内存页中,1≤n≤N,可以包括:
设定所述N个内存页中每个内存页的最小容量Cmin和最大容量Cmax;
确定第n个内存页的首个字符串组;
以所述所述第n个内存页的首个字符串组为起始字符串组,依次将所述M个字符串组中至少一个字符串组存储到第n个内存页;
若存储到第i个字符串组时,所述第n个内存页中被占用的存储容量C占用与Cmin的差值小于第i个字符串组的存储开销,则计算所述第n个内存页中可使用的存储容量(Cmax-C占用)所能容纳的Nmore个字符串组,所述Nmore个字符串组为:以所述第i个字符串组开始依次排列的Nmore个字符串组;
确定所述Nmore个字符串组中差异前缀最短的字符串组,将所述第i个字符串组、以及所述第i个字符串组到所述差异前缀最短的字符串组之间的字符串组依次存储到所述第n个内存页中,将所述差异前缀最短的字符串组作为第n+1个内存页的首个字符串组。
确定第n+1个内存页的首个字符串后,可以按照上述方式依次将相应的字符串组存储到第n+1个内存页中,如此重复进行,可以将字符串组按照排序依次存入到N个内存页中。
需要说明的是,对于第1个内存页,其首个字符串组为M个字符串组中的第1个字符串组,此外,当所述Nmore个字符串组中差异前缀最小的字符串组不止一个时,通常将Nmore个字符串组中差异前缀长度最小的字符串组中排在最前面的字符串组作为下一分页的首个字符串组。
需要说明的是,内存页中的字符串组可以在页内重新进行编号,不需要与分组后的字符串组的编号相同。其中,为了快速定位到页内各分组,在构造内存页的过程中还需要记录内存页中每个分组的起始地址,并在分组写入完成后,将所有地址逆序写入页尾部预留的索引空间。此外,还可以在页头或页尾预留固定长度字段,记录页内分组数量。为了便于查找,还需要存储每个内存页的地址信息。
进一步的,由于字符串组中的字符串序列间具有共享前缀,因此,为了提高字符串存储效率,在本发明实施例中,分页单元203还可以将字符串组中除首个字符串之前的字符串以压缩形式存储到内存页中,即对于待存储到N个内存页中第y个内存页的M个字符串组中的第x个字符串组,1≤x≤M,1≤y≤N,分页单元203可以通过下述压缩存储方式将第x个字符串组存储到第y个内存页中:
将第x个字符串组的首个字符串以不压缩形式写入到第y个内存页的可用空间;
对所述第x个字符串组中除首个字符串之外的其他任一字符串,获取所述其他任一字符串与其相邻的前一个字符串间的共享前缀,将其他任一字符串与其相邻的前一字符串间的共享前缀长度、以及所述其他任一字符串中在所述共享前缀之后的后缀字符串写入所述第y个内存页的可用空间。
可选的,所述Q层跳表可以为逐层构建的多层跳表,所述Q层跳表中的第q层跳表可以根据第q-1层跳表中间隔为稀疏系数F的跳表节点的首个索引关键字构建,所述F为大于等于1的整数,所述q为大于等于2的整数,所述稀疏系数F可以根据需要进行设定,本发明实施例对此不进行限定,每个跳表节点的长度Lnode可以为计算机系统缓存长度的整数倍。
当跳表索引包含至少两层跳表时,所述跳表索引构建单元204具体用于:
将N个内存页的索引关键字依次写入第1层跳表的跳表节点,并在每个跳表节点中记录该跳表节点所包含的索引关键字的个数以及索引关键字的寻址信息,所述第1层跳表中每个跳表节点中索引关键字的寻址信息用于指示与该寻址信息相对应的索引关键字所处的内存页;
对于所述跳表索引中所述第1层跳表之上的第q层跳表,获取以第q-1层跳表中的首个跳表节点为起始节点,间隔为F的至少一个跳表节点的首个索引关键字;
将所述至少一个跳表节点的首个索引关键字依次写入第q层跳表的跳表节点,并在每个跳表节点中记录该跳表节点所包含的索引关键字的个数以及索引关键字的寻址信息,其中,所述第q层跳表中每个跳表节点中索引关键字的寻址信息用于指示与该寻址信息相对应的索引关键字在所述第q-1层跳表中所在的跳表节点。
如此,自下而上先构建第1层跳表,再依次向上构建第q层跳表,直至构建的层数Q或第Q层跳表包含的跳表节点的个数满足预设条件或者最上层跳表收敛至一个跳表节点时,停止构建跳表索引;其中,预设条件可以根据需要进行设置,本发明实施例对此不进行限定。
其中,为了便于构造跳表索引,可以采用固定长度的跳表节点。当采用固定长度的跳表节点时,跳表索引构建单元204将从第q-1层跳表提取的至少一个跳表节点的首个索引关键字依次写入第q层跳表的跳表节点,具体用于:
按照至少一个跳表节点的首个索引关键字的排序,依次将至少一个跳表节点的首个索引关键字写入第q层跳表的跳表节点,每写入一个索引关键字,记录其对应的寻址信息,并更新跳表节点内索引关键字数量,计算跳表节点的剩余可用空间;
若当前正写入的跳表节点无法容纳下一个索引关键字,则分配新的跳表节点,按照上述方式写入索引关键字,直到所有索引关键字及寻址信息写入完成。
同理,将N个内存页的索引关键字写入第1层跳表中的跳表节点与上述过程相同,在此不再详细赘述。
进一步的,当各内存页的索引关键字长度差异较大时,为了降低上层跳表的索引开销,提高索引的空间效率,在本发明实施例中,还可以采用可变长度的跳表节点构建跳表索引。当采用可变长度的跳表节点构建跳表索引时,所述跳表索引构建单元204将从第q-1层跳表提取的至少一个索引关键字依次写入第q层跳表的跳表节点,具体可以用于:
以至少一个跳表节点的首个索引关键字中的第1个索引关键字为起始索引关键字,依次将至少一个跳表节点的首个索引关键字写入到第q层跳表的跳表节点;
若写入第i个索引关键字时,正在写入的跳表节点中被占用的长度L占用与Lnode-min的差值小于第i个索引关键字的存储开销,则计算所述第n个跳表节点中可使用的长度(Lnode-max-L占用)所能容纳的Nnode-more个索引关键字,所述Nnode-more个索引关键字为:以所述第i个索引关键字开始依次排列的Nnode-more个索引关键字,其中,Lnode-min为每个跳表节点的最小长度,Lnode-max为每个跳表节点的最大长度;
确定所述Nnode-more个索引关键字中最短的索引关键字,将所述第i个索引关键字、以及所述第i个索引关键字到所述最短的索引关键字之间的索引关键字写入正在写入的跳表节点中,将所述最短的索引关键字作为下一跳表节点的首个索引关键字写入所述下一跳表节点。
确定下一跳表节点的首个字符串后,可以按照上述方式依次将相应的索引关键字写入下一跳表节点中,如此重复进行,可以将索引关键字按照排序依次存入到第q层跳表的跳表节点。需要说明的是,在计算可使用可用长度(Lnode-max-L占用)时,需扣除索引关键字对应寻址信息的预留存储开销。
其中,每个跳表节点的最小长度Lnode-min和最大长度Lnode-max可以根据跳表节点实际长度进行设置,本发明实施例对此不进行限定,并且,各跳表节点的最小长度Lnode-min和最大长度Lnode-max可以相同,也可以不相同。
进一步的,作为压缩索引的逆过程,当用户需要查找数据库中存储的与一字符串有关的所有字符串时,可以从根据跳表索引中的索引关键字自上而下查找相应的内存页,在该内存页中查找相应分组,将该分组中的字符串反馈给用户;具体的,如图8所示,所述压缩索引装置20还可以包括:查询单元205;
所述查询单元205用于:获取待查询字符串;
自上而下查找所述跳表索引中的每层跳表,确定所述Q层跳表中的第t层跳表第j个跳表节点存储有与所述待查询字符串相匹配的第一索引关键字,其中,所述第一索引关键字的寻址信息指示:第t-1层跳表第r个跳表节点,查找所述第t-1层跳表第r个跳表节点中的索引关键字;
确定所述第t-1层跳表第r个跳表节点中存储有与所述待查询字符串相匹配的第二索引关键字,其中,所述第二索引关键字的寻址信息指示:第t-2层跳表第s个跳表节点,查找所述第t-2层跳表第s个跳表节点中的索引关键字;
重复上述过程,直至根据第1层跳表第d个跳表节点中存储的与所述待查询字符串相匹配的第三索引关键字,查找第h个内存页中每个字符串组的差异前缀,其中,所述第三索引关键字的寻址信息指示:所述第h个内存页;
确定所述第h个内存页中第w个字符串组的差异前缀与所述待查询字符串相匹配,查找所述第w个字符串组中的匹配字符串并返回查询结果。
需要说明的是,当字符串组中的字符串采用压缩方式写入内存页时,还需要将字符串解压后作为与待查询字符串相关联的字符串。
其中,与待查询字符串相匹配的索引关键字可以为:按照字典升序先于待查询字符串排列的索引关键字,或者与待查询字符串具有共享前缀的字符串。
进一步的,本发明实施例还可以动态地向字符串序列中插入字符串,具体的,如图8所示,所述装置20还可以包括:字符串插入单元206;
所述字符串插入单元206,用于获取一个新字符串,所述新字符串为不在所述字符串序列中的字符串;
确定所述新字符串所属的第一内存页和第一字符串组;
将所述新字符串插入所述第一字符串组;
若插入所述新字符串后,所述第一字符串组内的字符串数量超过阈值,则获取与所述第一字符串组相邻的第二字符串组,并对所述第一字符串组和所述第二字符串组重新分组;
将重新分组后的字符串组顺序写入所述第一内存页,若所述第一内存页中有字符串组溢出,则将溢出的字符串存入与所述第一内存页相邻的下一内存页。
其中,第二字符串组可以为与第一字符串组相邻的下一字符串组。
需要说明的是,若插入新字符串导致内存页的数量或索引关键字发生变化,则需要自下向上依次更新跳表节点,直到索引重建完成。
相应的,本发明实施例还可以动态地向删除字符串序列中的字符串,具体的,如图8所示,所述装置20还可以包括:字符串删除单元207;
所述字符串删除单元207,可以用于删除所述字符串序列中的第一字符串,所述第一字符串位于第二内存页和第三字符串组;
若删除所述第一字符串后,所述第三字符串组内的字符串数量小于阈值,则获取与所述第三字符串组相邻的第四字符串组,并对所述第三字符串组和所述第四字符串组重新分组;
将重新分组后的字符串组顺序写入第二内存页,若与第二内存页相邻的内存页以及第二内存页数据量之和小于一个内存页的数据量阈值,则合并这两个内存页。
其中,第四字符串组可以与第三字符串组相邻的上一字符串组,也可以为与第三字符串组相邻的下一字符串组;内存页的数据量阈值可以根据需要进行设定,本发明实施例对此不进行限定。
需要说明的是,若删除字符串后,导致内存页的数量或索引关键字发生变化,则自下向上依次更新跳表节点,直到索引重建完成。
由于在本发明实施例中,字符串组、内存页和跳表索引均有一定的空间弹性,因此,插入/删除字符串一般只引起局部重构,效率较高。
需要说明的是,图8中的压缩索引装置20可以设置在数据存储系统的任一计算机中,也可以独立于任何设备设置在数据存储系统中;图8中的获取单元201可以为图2所示压缩索引装置10中的收发器1012,分组单元202、分页单元203、跳表索引构建单元204、查询单元205、字符串插入单元206、字符串删除单元207可以为图2中单独设立的处理器1011,也可以集成在压缩索引装置10的某一个处理器1011中实现,此外,也可以以程序代码的形式存储于压缩索引装置10的存储器1013中,由压缩索引装置10的某一个处理器1012调用并执行以上分组单元202、分页单元203、跳表索引构建单元204、查询单元205、字符串插入单元206以及字符串删除单元207的功能。这里所述的处理器可以是一个中央处理器(CentralProcessing Unit,CPU),或者是特定集成电路(Application Specific IntegratedCircuit,ASIC),或者是被配置成实施本发明实施例的一个或多个集成电路。
由上可知,本发明实施例提供一种字符串序列的压缩索引装置,获取有序排列的字符串序列,根据所述字符串序列中每个字符串的差异前缀长度对所述字符串序列进行分组处理,获得M个字符串组,以使每个字符串组中首个字符串的差异前缀长度在预设字符串范围内是最短的,将所述M个字符串组依次存储到N个内存页,根据所述N个内存页的索引关键字构建跳表索引。如此,在对有序字符串序列进行分组和分页处理后,构建跳表索引。由于每个字符串组的差异前缀长度在预设字符串范围内是最短的,使得根据字符串组的差异前缀长度分页后的每页的索引关键字也是局部最短的,进而在页的基础上构建的跳表索引内的索引关键字的长度也是比较短的,降低了跳表索引中索引关键字的平均长度,提升了跳表节点的容纳能力,从而达到减少索引节点数量和降低索引查找复杂度的有益效果,避免了现有CS-Prefix-Tree编码索引过程中,底层叶节点存在过长的差异前缀长度,导致编码索引分支节点的容纳能力下降,增加分支节点数量和查找复杂度的问题。
所属领域的技术人员可以清楚地了解到,为描述的方便和简洁,上述描述的单元和系统的具体工作过程,可以参考前述方法实施例中的对应过程,在此不再赘述。
在本申请所提供的几个实施例中,应该理解到,所揭露的系统,设备和方法,可以通过其它的方式实现。例如,以上所描述的设备实施例仅仅是示意性的,例如,所述单元的划分,仅仅为一种逻辑功能划分,实际实现时可以有另外的划分方式,例如多个单元或组件可以结合或者可以集成到另一个系统,或一些特征可以忽略,或不执行。
所述作为分离部件说明的单元可以是或者也可以不是物理上分开的,作为单元显示的部件可以是或者也可以不是物理单元,即可以位于一个地方,或者也可以分布到多个网络单元上。可以根据实际的需要选择其中的部分或者全部单元来实现本实施例方案的目的。
另外,在本发明各个实施例中的各功能单元可以集成在一个处理单元中,也可以是各个单元单独物理,也可以两个或两个以上单元集成在一个单元中。上述集成的单元既可以采用硬件的形式实现,也可以采用硬件加软件功能单元的形式实现。
上述以软件功能单元的形式实现的集成的单元,可以存储在一个计算机可读取存储介质中。上述软件功能单元存储在一个存储介质中,包括若干指令用以使得一台计算机设备(可以是个人计算机,服务器,或者网络设备等)执行本发明各个实施例所述方法的部分步骤。而前述的存储介质包括:U盘、移动硬盘、只读存储器(Read-Only Memory,简称ROM)、随机存取存储器(Random Access Memory,简称RAM)、磁碟或者光盘等各种可以存储程序代码的介质。
本领域普通技术人员可以理解上述实施例的各种方法中的全部或部分步骤是可以通过程序来指令相关的硬件(例如处理器)来完成,该程序可以存储于一计算机可读存储介质中,存储介质可以包括:只读存储器、随机存储器、磁盘或光盘等。
最后应说明的是:以上实施例仅用以说明本发明的技术方案,而非对其限制;尽管参照前述实施例对本发明进行了详细的说明,本领域的普通技术人员应当理解:其依然可以对前述各实施例所记载的技术方案进行修改,或者对其中部分技术特征进行等同替换;而这些修改或者替换,并不使相应技术方案的本质脱离本发明各实施例技术方案的精神和范围。
Claims (24)
1.一种字符串序列的压缩索引方法,其特征在于,包括:
获取字符串序列,所述字符串序列包含有序排列的一个以上字符串;
根据所述字符串序列中每个字符串的差异前缀长度,对所述字符串序列进行分组处理,获得M个字符串组,以使所述M个字符串组中的每个字符串组中首个字符串的差异前缀长度在预设字符串范围内是最短的,其中,所述M为大于等于1的整数,每个所述字符串组包含至少一个字符串,每个所述字符串组的差异前缀为该字符串组中首个字符串的差异前缀;
将所述M个字符串组依次存储到N个内存页中,所述N为大于等于1的整数,每个所述内存页包含至少一个字符串组,每个所述内存页的索引关键字为:该内存页中首个字符串组的差异前缀;
根据所述N个内存页的索引关键字构建跳表索引,所述跳表索引包含Q层跳表,所述Q为大于等于1的整数,所述Q层跳表中的第1层跳表根据所述N个内存页的索引关键字构建,每层跳表包含至少一个跳表节点,每个跳表节点包含至少一个索引关键字、索引关键字的个数以及索引关键字的寻址信息。
2.根据权利要求1所述的方法,其特征在于,每个所述字符串组包含的字符串的个数的最小阈值为Wmin、最大阈值为Wmax;对所述字符串序列进行分组处理,获得所述M个字符串组中的第m个字符串组的方法包括,1≤m≤M:
确定所述第m个字符串组的首个字符串;
以所述第m个字符串组的首个字符串为起始字符串,依次计算后续Wmax个字符串中每个字符串的差异前缀长度;
确定第k个字符串,所述第k个字符串为后续第Wmin个字符串到后续第Wmax个字符串中差异前缀长度最小的字符串,Wmin≤k≤Wmax;
将所述第m个字符串组的首个字符串到第k-1个字符串之间的字符串的集合确定为所述第m个字符串组,并将所述第k个字符串作为第m+1个字符串组的首个字符串。
3.根据权利要求1或2所述的方法,其特征在于,所述将所述M个字符串组依次存储到N个内存页中,包括:
根据所述M个字符串组中每个字符串组的差异前缀长度,将所述M个字符串组依次存储到所述N个内存页中,以使所述N个内存页中的每个内存页的首个字符串组的差异前缀长度在预设字符串组范围内是最短的。
4.根据权利要求1所述的方法,其特征在于,所述Q层跳表为逐层构建的多层跳表,所述Q层跳表中的第q层跳表根据第q-1层跳表中间隔为稀疏系数F的跳表节点的首个索引关键字构建,所述F为大于等于1的整数,所述q为大于等于2的整数。
5.根据权利要求1所述的方法,其特征在于,所述N个内存页中每个内存页的最小容量为Cmin、最大容量为Cmax,将字符串组存储到所述N个内存页中的第n个内存页的方法包括,1≤n≤N:
确定所述第n个内存页的首个字符串组;
以所述第n个内存页的首个字符串组为起始字符串组,依次将所述M个字符串组中至少一个字符串组存储到所述第n个内存页;
若存储到第i个字符串组时,所述第n个内存页中被占用的存储容量C占用与Cmin的差值小于所述第i个字符串组的存储开销,则计算所述第n个内存页中可使用的存储容量(Cmax-C占用)所能容纳的Nmore个字符串组,所述Nmore个字符串组为:以所述第i个字符串组开始依次排列的Nmore个字符串组;
确定所述Nmore个字符串组中差异前缀长度最小的字符串组,将所述第i个字符串组、以及所述第i个字符串组到所述差异前缀长度最小的字符串组之间的字符串组存储到所述第n个内存页中,将所述差异前缀长度最小的字符串组作为第n+1个内存页的首个字符串组。
6.根据权利要求1所述的方法,其特征在于,将所述M个字符串组中的第x个字符串组存入到所述N个内存页中的第y个内存页的方法包括,1≤x≤M,1≤y≤N:
将所述第x个字符串组的首个字符串以不压缩形式写入到所述第y个内存页的可用空间;
对所述第x个字符串组中除首个字符串之外的其他任一字符串,获取所述其他任一字符串与其相邻的前一个字符串间的共享前缀,将所述其他任一字符串与其相邻的前一个字符串间的共享前缀长度、以及所述其他任一字符串中在所述共享前缀之后的后缀字符串写入到所述第y个内存页的可用空间。
7.根据权利要求1所述的方法,其特征在于,所述Q层跳表中的第1层跳表构建的方法包括:
将所述N个内存页的索引关键字依次写入所述第1层跳表的跳表节点,并在每个跳表节点中记录该跳表节点所包含的索引关键字的个数以及索引关键字的寻址信息,其中,所述第1层跳表中每个跳表节点中索引关键字的寻址信息用于指示与该寻址信息相对应的索引关键字所处的内存页。
8.根据权利要求4所述的方法,其特征在于,所述Q层跳表中的第q层跳表的构建方法包括:
获取所述跳表索引中所述第q-1层跳表中,以所述第q-1层跳表中的首个跳表节点为起始节点,间隔为F的至少一个跳表节点的首个索引关键字;
将获取到的所述至少一个跳表节点的首个索引关键字依次写入所述第q层跳表的跳表节点,并在所述第q层跳表的每个跳表节点中记录该跳表节点所包含的索引关键字的个数以及索引关键字的寻址信息;其中,所述第q层跳表中每个跳表节点中索引关键字的寻址信息用于指示与该寻址信息相对应的索引关键字在所述第q-1层跳表中所在的跳表节点。
9.根据权利要求8所述的方法,其特征在于,每个跳表节点的长度是可变的;所述将获取到的所述至少一个跳表节点的首个索引关键字依次写入所述第q层跳表的跳表节点包括:
以所述至少一个跳表节点的首个索引关键字中的第1个索引关键字为起始索引关键字,依次将所述至少一个跳表节点的首个索引关键字写入到所述第q层跳表的跳表节点;
若写入到第i个索引关键字时,正在写入的跳表节点中被占用的长度L占用与Lnode-min的差值小于所述第i个索引关键字的存储开销,则计算所述正在写入的跳表节点中可使用的长度(Lnode-max-L占用)所能容纳的Nnode-more个索引关键字,所述Nnode-more个索引关键字为:以所述第i个索引关键字开始依次排列的Nnode-more个索引关键字,其中,Lnode-min为每个跳表节点的最小长度,Lnode-max为每个跳表节点的最大长度;
确定所述Nnode-more个索引关键字中最短的索引关键字,将所述第i个索引关键字、以及所述第i个索引关键字到所述最短的索引关键字之间的索引关键字写入到所述正在写入的跳表节点中,将所述最短的索引关键字作为下一跳表节点的首个索引关键字写入所述下一跳表节点。
10.根据权利要求1所述的方法,其特征在于,所述方法还包括:
获取待查询字符串;
自上而下查找所述跳表索引中的每层跳表,确定所述Q层跳表中的第t层跳表第j个跳表节点存储有与所述待查询字符串相匹配的第一索引关键字,其中,所述第一索引关键字的寻址信息指示:第t-1层跳表第r个跳表节点,查找所述第t-1层跳表第r个跳表节点中的索引关键字;
确定所述第t-1层跳表第r个跳表节点中存储有与所述待查询字符串相匹配的第二索引关键字,其中,所述第二索引关键字的寻址信息指示:第t-2层跳表第s个跳表节点,查找所述第t-2层跳表第s个跳表节点中的索引关键字;
重复上述过程,直至根据第1层跳表第d个跳表节点中存储的与所述待查询字符串相匹配的第三索引关键字,查找第h个内存页中每个字符串组的差异前缀,其中,所述第三索引关键字的寻址信息指示:所述第h个内存页;
确定所述第h个内存页中第w个字符串组的差异前缀与所述待查询字符串相匹配,查找所述第w个字符串组中的匹配字符串并返回查询结果。
11.根据权利要求1所述的方法,其特征在于,所述方法还包括:
获取一个新字符串,所述新字符串为不在所述字符串序列中的字符串;
确定所述新字符串所属的第一内存页和第一字符串组;
将所述新字符串插入所述第一字符串组;
若插入所述新字符串后,所述第一字符串组内的字符串数量超过阈值,则获取与所述第一字符串组相邻的第二字符串组,并对所述第一字符串组和所述第二字符串组重新分组;
将重新分组后的字符串组顺序写入所述第一内存页,若所述第一内存页中有字符串组溢出,则将溢出的字符串组存入与所述第一内存页相邻的下一内存页。
12.根据权利要求1所述的方法,其特征在于,所述方法还包括:
删除所述字符串序列中的第一字符串,所述第一字符串位于第二内存页和第三字符串组;
若删除所述第一字符串后,所述第三字符串组内的字符串数量小于阈值,则获取与所述第三字符串组相邻的第四字符串组,并对所述第三字符串组和所述第四字符串组重新分组;
将重新分组后的字符串组顺序写入所述第二内存页,若与所述第二内存页相邻的内存页以及所述第二内存页的数据量之和小于一个内存页的数据量阈值,则合并所述与所述第二内存页相邻的内存页以及所述第二内存页。
13.一种压缩索引装置,其特征在于,所述装置包括:
获取单元,用于获取字符串序列;所述字符串序列包含有序排列的一个以上字符串;
分组单元,用于根据所述获取单元获取到的字符串序列中每个字符串的差异前缀长度,对所述字符串序列进行分组处理,获得M个字符串组,以使每个字符串组中的首个字符串的差异前缀长度在预设字符串范围内是最短的,所述M为大于等于1的整数,每个字符串组包含至少一个字符串,每个字符串组的差异前缀为该字符串组中首个字符串的差异前缀;
分页单元,用于将所述分组单元获得的M个字符串组依次存储到N个内存页中,所述N为大于等于1的整数,每个所述内存页包含至少一个字符串组,每个所述内存页的索引关键字为:该内存页中首个字符串组的差异前缀;
跳表索引构建单元,用于根据所述N个内存页的索引关键字构建跳表索引,所述跳表索引包含Q层跳表,所述Q为大于等于1的整数,第1层跳表根据所述N个内存页的索引关键字构建,每层跳表包含至少一个跳表节点,每个跳表节点包含至少一个索引关键字、索引关键字的个数以及索引关键字的寻址信息。
14.根据权利要求13所述的压缩索引装置,其特征在于,每个所述字符串组包含的字符串的个数的最小阈值为Wmin、最大阈值为Wmax;对于获得所述M个字符串组中的第m个字符串组,1≤m≤M,所述分组单元具体用于:
确定所述第m个字符串组的首个字符串;
以所述第m个字符串组的首个字符串为起始字符串,依次计算后续Wmax个字符串中每个字符串的差异前缀长度;
确定第k个字符串,所述第k个字符串为后续第Wmin个字符串到后续第Wmax个字符串中差异前缀长度最小的字符串,Wmin≤k≤Wmax;
将所述第m个字符串组的首个字符串到第k-1个字符串之间的字符串的集合确定为所述第m个字符串组,并将所述第k个字符串作为第m+1个字符串组的首个字符串。
15.根据权利要求13或14所述的压缩索引装置,其特征在于,所述分页单元具体用于:
根据所述M个字符串组中每个字符串组的差异前缀长度,将所述M个字符串组依次存储到所述N个内存页中,以使所述N个内存页中的每个内存页的首个字符串组的差异前缀长度在预设字符串组范围内是最短的。
16.根据权利要求13所述的压缩索引装置,其特征在于,所述Q层跳表为逐层构建的多层跳表,所述Q层跳表中的第q层跳表根据第q-1层跳表中间隔为稀疏系数F的跳表节点的首个索引关键字构建,所述F为大于等于1的整数,所述q为大于等于2的整数。
17.根据权利要求13所述的压缩索引装置,其特征在于,所述N个内存页中每个内存页的最小容量为Cmin、最大容量为Cmax,对于将字符串组存储到所述N个内存页中的第n个内存页,1≤n≤N,所述分页单元具体用于:
确定所述第n个内存页的首个字符串组;
以所述所述第n个内存页的首个字符串组为起始字符串组,依次将所述M个字符串组中至少一个字符串组存储到所述第n个内存页;
若存储到第i个字符串组时,所述第n个内存页中被占用的存储容量C占用与Cmin的差值小于所述第i个字符串组的存储开销,则计算所述第n个内存页中可使用的存储容量(Cmax-C占用)所能容纳的Nmore个字符串组,所述Nmore个字符串组为:以所述第i个字符串组开始依次排列的Nmore个字符串组;
确定所述Nmore个字符串组中差异前缀长度最小的字符串组,将所述第i个字符串组、以及所述第i个字符串组到所述差异前缀长度最小的字符串组之间的字符串组存储到所述第n个内存页中,将所述差异前缀长度最小的字符串组作为第n+1个内存页的首个字符串组。
18.根据权利要求13所述的压缩索引装置,其特征在于,对于将所述M个字符串组中的第x个字符串组存入到所述N个内存页中的第y个内存页,1≤x≤M,1≤y≤N,所述分页单元具体用于:
将所述第x个字符串组的首个字符串以不压缩形式写入到第y个内存页的可用空间;
对所述第x个字符串组中除首个字符串之外的其他任一字符串,获取所述其他任一字符串与其相邻的前一个字符串间的共享前缀,将所述其他任一字符串与其相邻的前一字符串间的共享前缀长度、以及所述其他任一字符串中在所述共享前缀之后的后缀字符串写入到所述第y个内存页的可用空间。
19.根据权利要求13所述的压缩索引装置,其特征在于,所述跳表索引构建单元具体用于:
将N个内存页的索引关键字依次写入第1层跳表的跳表节点,并在每个跳表节点中记录该跳表节点所包含的索引关键字的个数以及索引关键字的寻址信息,其中,所述第1层跳表中每个跳表节点中索引关键字的寻址信息用于指示与该寻址信息相对应的索引关键字所处的内存页。
20.根据权利要求16所述的压缩索引装置,其特征在于,2≤q≤Q,所述Q为大于2的整数,所述跳表索引构建单元具体用于:
获取所述跳表索引中所述第q-1层跳表中,以所述第q-1层跳表中的首个跳表节点为起始节点,间隔为F的至少一个跳表节点的首个索引关键字;
将获取到的所述至少一个跳表节点的首个索引关键字依次写入所述第q层跳表的跳表节点,并在所述第q层跳表的每个跳表节点中记录该跳表节点所包含的索引关键字的个数以及索引关键字的寻址信息;其中,所述第q层跳表中每个跳表节点中索引关键字的寻址信息用于指示与该寻址信息相对应的索引关键字在所述第q-1层跳表中所在的跳表节点。
21.根据权利要求20所述的压缩索引装置,其特征在于,每个跳表节点的长度是可变的;所述跳表索引构建单元具体用于:
以所述至少一个跳表节点的首个索引关键字中的第1个索引关键字为起始索引关键字,依次将所述至少一个跳表节点的首个索引关键字写入到所述第q层跳表的跳表节点;
若写入到第i个索引关键字时,正在写入的跳表节点中被占用的长度L占用与Lnode-min的差值小于所述第i个索引关键字的存储开销,则计算所述正在写入的跳表节点中可使用的长度(Lnode-max-L占用)所能容纳的Nnode-more个索引关键字,所述Nnode-more个索引关键字为:以所述第i个索引关键字开始依次排列的Nnode-more个索引关键字,其中,Lnode-min为每个跳表节点的最小长度,Lnode-max为每个跳表节点的最大长度;
确定所述Nnode-more个索引关键字中最短的索引关键字,将所述第i个索引关键字、以及所述第i个索引关键字到所述最短的索引关键字之间的索引关键字写入到所述正在写入的跳表节点中,将所述最短的索引关键字作为下一跳表节点的首个索引关键字写入所述下一跳表节点。
22.根据权利要求13所述的压缩索引装置,其特征在于,所述压缩索引装置还包括:查询单元;
所述查询单元,用于获取待查询字符串;
自上而下查找所述跳表索引中的每层跳表,确定所述Q层跳表中的第t层跳表第j个跳表节点存储有与所述待查询字符串相匹配的第一索引关键字,其中,所述第一索引关键字的寻址信息指示:第t-1层跳表第r个跳表节点,查找所述第t-1层跳表第r个跳表节点中的索引关键字;
确定所述第t-1层跳表第r个跳表节点中存储有与所述待查询字符串相匹配的第二索引关键字,其中,所述第二索引关键字的寻址信息指示:第t-2层跳表第s个跳表节点,查找所述第t-2层跳表第s个跳表节点中的索引关键字;
重复上述过程,直至根据第1层跳表第d个跳表节点中存储的与所述待查询字符串相匹配的第三索引关键字,查找第h个内存页中每个字符串组的差异前缀,其中,所述第三索引关键字的寻址信息指示:所述第h个内存页;
确定所述第h个内存页中第w个字符串组的差异前缀与所述待查询字符串相匹配,查找所述第w个字符串组中的匹配字符串并返回查询结果。
23.根据权利要求13所述的压缩索引装置,其特征在于,所述压缩索引装置还包括:字符串插入单元;
所述字符串插入单元,用于获取一个新字符串,所述新字符串为不在所述字符串序列中的字符串;
确定所述新字符串所属的第一内存页和第一字符串组;
将所述新字符串插入所述第一字符串组;
若插入所述新字符串后,所述第一字符串组内的字符串数量超过阈值,则获取与所述第一字符串组相邻的第二字符串组,并对所述第一字符串组和所述第二字符串组重新分组;
将重新分组后的字符串组顺序写入所述第一内存页,若所述第一内存页中有字符串组溢出,则将溢出的字符串组存入与所述第一内存页相邻的下一内存页。
24.根据权利要求13所述的压缩索引装置,其特征在于,所述压缩索引装置还包括:字符串删除单元;
所述字符串删除单元,用于删除所述字符串序列中的第一字符串,所述第一字符串位于第二内存页和第三字符串组;
若删除所述第一字符串后,所述第三字符串组内的字符串数量小于阈值,则获取与所述第三字符串组相邻的第四字符串组,并对所述第三字符串组和所述第四字符串组重新分组;
将重新分组后的字符串组顺序写入所述第二内存页,若与所述第二内存页相邻的内存页以及第二内存页的数据量之和小于一个内存页的数据量阈值,则合并所述与所述第二内存页相邻的内存页以及所述第二内存页。
Applications Claiming Priority (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
PCT/CN2016/077428 WO2017161589A1 (zh) | 2016-03-25 | 2016-03-25 | 一种字符串序列的压缩索引方法及装置 |
Publications (2)
Publication Number | Publication Date |
---|---|
CN108780455A CN108780455A (zh) | 2018-11-09 |
CN108780455B true CN108780455B (zh) | 2022-03-29 |
Family
ID=59899869
Family Applications (1)
Application Number | Title | Priority Date | Filing Date |
---|---|---|---|
CN201680083999.8A Active CN108780455B (zh) | 2016-03-25 | 2016-03-25 | 一种字符串序列的压缩索引方法及装置 |
Country Status (2)
Country | Link |
---|---|
CN (1) | CN108780455B (zh) |
WO (1) | WO2017161589A1 (zh) |
Families Citing this family (4)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN113065964B (zh) * | 2021-04-13 | 2024-05-03 | 上证所信息网络有限公司 | 一种采用可变步长跳表的数据存储系统及方法 |
CN113626431A (zh) * | 2021-07-28 | 2021-11-09 | 浪潮云信息技术股份公司 | 一种基于lsm树的延迟垃圾回收的键值分离存储方法及系统 |
CN114090570A (zh) * | 2021-09-29 | 2022-02-25 | 北京信息科技大学 | 一种基于基数树与哈希表结合的数据存储方法及装置 |
CN117194440B (zh) * | 2023-11-08 | 2024-02-13 | 本原数据(北京)信息技术有限公司 | 数据库索引压缩方法、装置、电子设备及存储介质 |
Citations (1)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN104881503A (zh) * | 2015-06-24 | 2015-09-02 | 郑州悉知信息技术有限公司 | 一种数据处理方法和装置 |
Family Cites Families (7)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
US7868789B1 (en) * | 2009-06-28 | 2011-01-11 | Sap Ag | Dictionary-based order-preserving string compression for main memory column stores |
CN102193941B (zh) * | 2010-03-12 | 2013-09-18 | 富士通株式会社 | 数据处理装置和为值串形式索引值建立索引的方法 |
US8635195B2 (en) * | 2011-05-19 | 2014-01-21 | International Business Machines Corporation | Index compression in a database system |
CN103870462B (zh) * | 2012-12-10 | 2018-02-09 | 腾讯科技(深圳)有限公司 | 一种数据处理方法及装置 |
WO2014201047A1 (en) * | 2013-06-11 | 2014-12-18 | InfiniteBio | Fast, scalable dictionary construction and maintenance |
CN104408067B (zh) * | 2014-10-29 | 2019-08-13 | 中国建设银行股份有限公司 | 一种多树结构的数据库设计方法及装置 |
CN104408192B (zh) * | 2014-12-15 | 2017-12-19 | 北京国双科技有限公司 | 字符串类型列的压缩处理方法及装置 |
-
2016
- 2016-03-25 WO PCT/CN2016/077428 patent/WO2017161589A1/zh active Application Filing
- 2016-03-25 CN CN201680083999.8A patent/CN108780455B/zh active Active
Patent Citations (1)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN104881503A (zh) * | 2015-06-24 | 2015-09-02 | 郑州悉知信息技术有限公司 | 一种数据处理方法和装置 |
Non-Patent Citations (1)
Title |
---|
倒排链表多层自索引结构的分析与设计;江宇等;《计算机应用研究》;20170228(第02期);159-162 * |
Also Published As
Publication number | Publication date |
---|---|
CN108780455A (zh) | 2018-11-09 |
WO2017161589A1 (zh) | 2017-09-28 |
Similar Documents
Publication | Publication Date | Title |
---|---|---|
CN108780455B (zh) | 一种字符串序列的压缩索引方法及装置 | |
US20180307428A1 (en) | Data storage method, electronic device, and computer non-volatile storage medium | |
EP2159708B1 (en) | Method for selecting hash function, method for storing and searching routing table and devices thereof | |
JP5858432B2 (ja) | 分散連想メモリベースを提供する方法、システム、及びコンピュータプログラム製品 | |
US9367640B2 (en) | Method and system for creating linked list, method and system for searching data | |
CN113961514B (zh) | 数据查询方法及装置 | |
CN109299113B (zh) | 具有存储感知的混合索引的范围查询方法 | |
US20100114843A1 (en) | Index Compression In Databases | |
EP2924594A1 (en) | Data encoding and corresponding data structure in a column-store database | |
US7139765B1 (en) | Hierarchical method for storing data with improved compression | |
US20080155171A1 (en) | File system, and method for storing and searching for file by the same | |
CN110196784A (zh) | 数据库及固态磁盘(ssd)控制器 | |
TW201009616A (en) | Search index format optimizations | |
US9535940B2 (en) | Intra-block partitioning for database management | |
US20050187898A1 (en) | Data Lookup architecture | |
CN102110171A (zh) | 基于树形结构的布鲁姆过滤器的查询与更新方法 | |
RU2633178C2 (ru) | Способ и система базы данных для индексирования ссылок на документы базы данных | |
CN103365991A (zh) | 一种基于一维线性空间实现Trie树的词典存储管理方法 | |
EP2544414A1 (en) | Method and device for storing routing table entry | |
US20140032568A1 (en) | System and Method for Indexing Streams Containing Unstructured Text Data | |
US20070094313A1 (en) | Architecture and method for efficient bulk loading of a PATRICIA trie | |
KR100414052B1 (ko) | 주기억장치 데이터베이스의 인덱스 데이터 관리방법 | |
US20140324875A1 (en) | Index for fast batch updates of large data tables | |
US7478109B1 (en) | Identification of a longest matching prefix based on a search of intervals corresponding to the prefixes | |
CN100433009C (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 |