CN110457531B - 一种基于OpenMP的并行字符串查询方法 - Google Patents

一种基于OpenMP的并行字符串查询方法 Download PDF

Info

Publication number
CN110457531B
CN110457531B CN201910666139.2A CN201910666139A CN110457531B CN 110457531 B CN110457531 B CN 110457531B CN 201910666139 A CN201910666139 A CN 201910666139A CN 110457531 B CN110457531 B CN 110457531B
Authority
CN
China
Prior art keywords
partition
character string
character
query
openmp
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
Application number
CN201910666139.2A
Other languages
English (en)
Other versions
CN110457531A (zh
Inventor
贾连印
张崇德
李孟娟
丁家满
陈明鲜
唐季林
Current Assignee (The listed assignees may be inaccurate. Google has not performed a legal analysis and makes no representation or warranty as to the accuracy of the list.)
Kunming University of Science and Technology
Original Assignee
Kunming University of Science and Technology
Priority date (The priority date 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 date listed.)
Filing date
Publication date
Application filed by Kunming University of Science and Technology filed Critical Kunming University of Science and Technology
Priority to CN201910666139.2A priority Critical patent/CN110457531B/zh
Publication of CN110457531A publication Critical patent/CN110457531A/zh
Application granted granted Critical
Publication of CN110457531B publication Critical patent/CN110457531B/zh
Active legal-status Critical Current
Anticipated expiration legal-status Critical

Links

Images

Classifications

    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F16/00Information retrieval; Database structures therefor; File system structures therefor
    • G06F16/90Details of database functions independent of the retrieved data types
    • G06F16/901Indexing; Data structures therefor; Storage structures
    • G06F16/9017Indexing; Data structures therefor; Storage structures using directory or table look-up
    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F16/00Information retrieval; Database structures therefor; File system structures therefor
    • G06F16/90Details of database functions independent of the retrieved data types
    • G06F16/903Querying
    • G06F16/90335Query processing
    • G06F16/90344Query processing by using string matching techniques

Abstract

本发明涉及一种基于OpenMP的并行字符串查询方法,属于数据库技术领域。包括字符串数据集预处理步骤,对字符串数据集和查询集按照字典序升序排序并统计各首字母下所有字符串的字符串数量;索引创建步骤,基于贪婪分区方法将数据集划分成K个分区并创建分区表,然后基于OpenMP并行为每个分区创建独立的双数组Trie索引结构;检索步骤,对一批待查询的字典序有序的查询集,根据分区表确定各查询对应的分区号并在相应分区内进行并行检索。本发明通过贪婪分区算法和OpenMP等技术创建分区双数组,使分区负载更为均衡,进而可提高双数组创建以及检索的效率。

Description

一种基于OpenMP的并行字符串查询方法
技术领域
本发明涉及一种基于OpenMP的并行字符串查询方法,属于数据库技术领域。
背景技术
随着信息量的急剧增长,大量的数据需要以字符串的形式存储,例如文档,网页,基因组数据等等,提高字符串的存储和检索效率具有非常重要的意义。为了解决这一问题,许多学者提出了处理字符串数据的有效算法和数据结构,其中,在1989年AOE提出的一种双数组索引结构(DA)是一个典型的代表。DA使用两个一维数组BASE和CHECK来存储每个字符串能与其他字符串区分的前缀部分,使用一维数组TAIL来存储字符串的后缀部分。在查询过程中,只需要通过数学加法运算即可确定每个字符是否存储在DA中,但在DA的构造过程中,因不同字符竞争位置产生冲突,从而导致索引创建的开销加大,随着字符串数量的增加,DA构造效率急剧降低。
目前对DA的优化算法的目标大多是提高索引结构的空间利用率,这也就导致了其创建效率往往不高。例如Yata等人提出了一种压缩的双数组索引结构,其将字符信息存储在CHECK数组中来提升空间效率,然而这种方法需要额外的开销来满足BASE值的唯一性,从而导致双数组创建效率的降低。为提高索引创建效率,Jia等人提出了一种基于首字母分区的双数组索引结构,这种结构根据字符串的首字母将字符串划分到不同的分区中,从而可将冲突限定在分区内,降低了冲突的数量及冲突处理的代价。其算法可有效提高双数组构造效率,但其各个分区的字符串数量并不均衡,因此并不适用于并行环境。上述工作多为串行算法,未能充分利用目前越来越广泛的多核CPU的处理能力,因此效率有待提升。OpenMP是一种已被广泛接受的,用于共享内存并行系统的多处理器程序设计的一套指导性编译处理方案,可很好地用于实现并行分区双数组的构建及字符串查询工作。
发明内容
本发明要解决的技术问题是提供一种基于OpenMP的并行字符串查询方法,用于解决上述问题。
本发明的技术方案是:一种基于OpenMP的并行字符串查询方法,具体为:
字符串数据集预处理步骤:将字符串数据集按字典序升序排序,按首字母分区,并统计各分区的字符串的数量,将查询集同样按字典序升序排序;
索引创建步骤:基于贪婪分区方法将数据集分区并创建分区表简称PT,通过OpenMP并行为每个分区创建分区双数组(DA)索引结构;
查询步骤:对待查询的字典序有序的一批字符串,在相应的DA上进行检索,获取查询结果。
所述字符串数据集预处理步骤具体为:
Step110:将字符串数据集按字典序升序排序;
Step120:统计各首字母对应的字符串数量La,Lb,Lc…Lz
Step130:将查询集按字典序升序排序。
所述索引创建步骤具体为:
Step210:构建分区表PT,将数据集划分为K个近似均匀的分区;
Step220:基于OpenMP为每个分区构建独立的DA索引结构。
所述Step 210具体为:
Step211:初始化分区表PT,PT的每一项包含首字母C、字符串数量L、分区号P三个属性,并依次写入预处理阶段得到的每个首字母及其对应的字符串数量,分区号均初始化为0;第i行,0≤i≤25对应的字符、字符串数量和分区号分别用Ci,Li和Pi表示;
Step212:将分区表PT按照字符串数量降序排序,置PT的前K项,0到K-1项的分区号为1,2,3…K;
Step213:按照L的大小,为PT中前K个表项建造一个小根堆,记堆顶元素对应的字符串数量和分区号分别为LH和PH
Step214:将PT的第i项,K≤i≤25归并到堆顶,置Pi=PH,更新堆顶元素LH=LH+Li后调整小根堆;
Step215:重复步骤214直到PT中的所有项都归并到堆中;
Step216:将分区表PT按照首字母C升序排序。
所述Step 220具体为:
Step221:基于OpenMP启动K个线程,并行地为每个分区创建分区双数组索引结构,第i个线程负责第i个分区双数组的构建;对线程i读取的字符串s,将其特定长度的前缀(s能与任何其他字符相区别的前缀)中的字符插入到第i个分区双数组中;对待插入字符ch,从状态x转换到状态y,对应的状态转移公式为:
BASE[x]+CODE[ch]=y (1)
CHECK[y]=x (2)
式中,CODE[ch]表示字符ch的数值编码,将字符“#”,“a”,“b”,“c”···“z”的编码值设置为1,2,3,4···27;
所述查询步骤具体为:
Step310:将一系列按字典序有序排序的字符串集Q组成一个查询池;
Step320:每个线程取Q中一个字符串,根据所取字符串的首字母ch在Pch-‘a’对应的分区内执行DA的检索算法,并返回检索结果。
本发明的有益效果是:本发明解决了传统双数组索引结构创建效率过低的问题,大大提升了双数组索引结构的创建效率,分区负载更为均衡,对比现有技术,时间更短,效率更高,可显著提升双数组创建和查询效率。
附图说明
图1是本发明基于分区双数组的索引查询功能模块图;
图2是本发明初始小根堆的示意图;
图3是本发明归并第一个表项后的小根堆示意图;
图4是本发明最终小根堆示意图;
图5是本发明字符串集合T及其对应的分区表;
图6是本发明双数组的初始化图;
图7是本发明插入“beach#”后的reducedtrie以及双数组示意图;
图8是本发明插入“beach#”和“bedam#”的reduced trie以及双数组示意图;
图9是本发明1号分区创建索引完成后的reducedtrie以及双数组示意图;
图10是本发明2号分区创建索引完成后的reducedtrie以及双数组示意图;
图11是本发明2号分区创建索引完成后的reducedtrie以及双数组示意图;
具体实施方式
下面结合附图和具体实施方式,对本发明作进一步说明。
字符串数据集预处理步骤,对字符串数据集按字典序升序排序,以字符串集合T={“abcde”,“bedf”,“eak”,“cabin”,“fate”,“cbmpelete”,“dache”,“beach”,“dirivation”,“dafch”,“eaghe”,“bedam”,“end”,“bagage”,“dack”,“dabia”,“dacela”}为例,为了区分“ab”和“abc”这样的字符串,在每个字符串后面加上“#”作为标记,则集合T1={“abcde#”,“bedf#”,“eak#”“cabin#”,“fate#”,“cbmpelete#”,“dache”,“beach#”,“diribation#”,“dafch#”,“eaghe#”,“bedam#”,“end#”,“baggage#”,“dack#”,“dabia#”,“dacela#”},对字符串集合T1进行字典序排序后得到T2={“abcde#”,“baggage#”,“beach#”,“bedf#”,“bedam#”,“cabin#”,“cbmpletes#”,“dabia#”,“dacela#”,“dache#”,“dack#”,“dafch#”,“diribation#”,“eak#”,“eaghe#”“end#”,“fate#”}。
统计各首字母对应的字符串数量并设置分区参数为K=3,对于集合T2中,La=1,Lb=4,Lc=2,Ld=6,Le=3,Lf=1。
建立分区表PT,表中的表项为<a,1,0>,<b,4,0>,<c,2,0>,<d,6,0>,<e,3,0>,<f,1,0>。
对分区表PT按字符长度从大到小排序,排序结果为<d,6,0>,<b,4,0>,<e,3,0>,<c,2,0>,<a,1,0>,<f,1,0>,分区参数为3,置前三项分区号为1,2,3即<d,6,1>,<b,4,2>,<e,3,3>。
建立一个大小为3的堆,堆中存储PT的前三项即<d,6,1>,<b,4,2>,<e,3,3>,对堆根据已存储表项中的字符串数量从小到大排序,生成的堆如图3所示,堆顶为L最小的一项<e,3,3>。
从PT表中的第四项开始将表项归并到小根堆堆顶,将<c,2,0>归并到堆顶表项<e,3,3>中,更新分区表中的<c,2,0>为<c,2,3>,堆顶为<e,5,3>,调整小根堆,结果如图3所示。
重复上述步骤直到PT中所有表项都归并到堆中,最后堆中存储的表项为<d,6,1>,<e,5,3>,<b,6,2>,如图4所示,最终构建的分区表如图5所示。
在DA索引结构中,建立了两个一维整数数组BASE和CHECK来存储每个字符串能够相互区分的前缀部分(例如字符串“beach#”和字符串“bedam#”,只需要在BASE和CHECK中存储前缀“bea”和“bed”就能使这两个字符串区分开来)即redecetrie部分,其余部分存储在TAIL数组中。BASE数组中存储的是状态转移的基值,CHECK数组中存储校验值,用于检验状态转移的正确性。在DA索引结构中,一个字符的状态转移需要满足以下两个关系式:
BASE[x]+CODE[ch]=y (1)
CHECK[y]=x (2)
在上述公式中CODE[ch]表示字符ch的数值编码,在本发明中,英文字符“#”,“a”,“b”,“c”···“z”的编码值分别对应1,2,3,4···27。
对于数组BASE和CHECK中存储的值,当下标i中的BASE[i]和CHECK[i]中的值为0时表明该位置为空,该位置可以插入字符,BASE[i]中的值为负数时表明该字符串前缀部分索引结束,该负值的绝对值指向该字符串的后缀部分在TAIL数组中的位置。
下面以字符串“beach#”,“bedam#”为例说明DA索引结构的创建过程。
双数组Trie的初始状态如图6所示,其中POS的值表明当前向TAIL数组中插入字符的位置。
插入字符串“beach#”,按以下步骤执行:
步骤A1:从BASE数组位置1开始字符的插入,字符'b'的编码值为3,根据公式(1)和(2):
BASE[1]+CODE['b']=1+3=4,CHECK[4]=0≠1
步骤A2:CHECK值为0表明要将剩余的字符串插入到TAIL数组中,此时BASE数组中仅存储了字符'b',将剩余部分“each#”从POS=1处开始依次插入到TAIL数组中。
步骤A3:字符串“beach#”插入完成,更新数组中的值
BASE[4]←-POS=-1
表明字符串的剩余部分在TAIL数组中开始插入的位置,再更新POS的值
POS=1+length(“each#”)=1+5=6
表明下一个需要插入的字符串的后缀在TAIL数组中的起始位置;
最后,更新CHECK值:
CHECK[4]=1
表明节点4是从节点1跳转过来的,此时构造的reducetrie以及其DA索引结构如图7所示
接着插入字符串“bedam#”:
步骤B1:从BASE数组位置1开始进行索引的创建,字符'b'的编码值为3,根据公式(1)和(2):
BASE[1]+CODE['b']==1+3=4,CHECK[4]=1
CHECK值非0说明字符'b'已经存储在数组中。
步骤B2:需要索引更多的字符到双数组中以区分这两个字符串,从节点4开始继续插入字符,此时BASE[4]=-1,表明前缀部分索引结束。将当前BASE[4]的值存在一个临时变量TEMP中,访问X_CHECK(LIST)(X_CHECK(LIST)函数是返回最小的整数q,q满足q>0并且CHECK[q+c]=0即找到一个空位置,c是LIST里的字符,q的值总是从1开始递增)函数并为BASE[4]寻找一个新的基值。
TEMP←BASE[4]=-1
步骤B3:为BASE[4]寻找一个新的基值使得字符'e'能够插入空位置,编码值为6,接着访问X_CHECK(LIST)函数,从q=1开始
CHECK[q+'e']=CHECK[1+6]=CHECK[7]=0
表明该位置可用,且q的值为1,更新BASE[4]的值:
BASE[4]=1
步骤B4:将字符'a','d'分别插入数组中以区分“beach#”,“bedam#”,访问X_CHECK(LIST)函数找到空位置插入字符'a','d',即为BASE[7]寻找一个合适的基值进行状态的转移:
CHECK[q+“a”]=CHECK[1+2]=CHECK[3]=0,q=1可用
因为字符'a'和'd'需要从同一个状态转移过来,所以继续用q=1尝试能不能存储字符'd',即
CHECK[1+“d”]=CHECK[1+5]=CHECK[6]=0
表明q=1可用,更新BASE[7]的值:
BASE[7]=1
此时字符串的前缀部分插入结束,将字符串的剩余部分“am#”插入到TAIL数组中,更新BASE[3]和BASE[6]的值,其绝对值指向字符串在TAIL中的起始位置:
BASE[3]=TEMP=-1
BASE[6]=-POS=-6
更新POS的值:
POS=6+length(“am#”)=9
此时字符串“bedam#”和“beach#”插入完成。
字符串“bedam#”和“beach#”插入完成后的reducedtrie和双数组索引结构如图8所示。分区1、分区2、分区3索引创建完成后的reducedtrie和双数组索引结构分别如图9、10、11所示。
DA索引结构的检索过程以字符串“end#”为例,根据图11中的DA索引进行检索。
字符串“end#”的首字母为'e',查分区表可知在三号分区内查找
步骤D1:从BASE[1]开始检索。
步骤D2:检索第一个字符'e',根据公式(1):
BASE[1]+CODE['e']=1+6=7且CHECK[7]=1
步骤D3:检索第二个字符'n',根据公式(1)
BASE[7]+CODE['n']=4+15=19且CHECK[19]=-20<0
检索到负值表明该字符串在BASE和CHECK数组中的查询结束,继续在TAIL数组中即TAIL[20]开始检索到该字符串的剩余部分“k#”,此时字符串“end#”的查询结束,返回查询结果。
以上结合附图对本发明的具体实施方式作了详细说明,但是本发明并不限于上述实施方式,在本领域普通技术人员所具备的知识范围内,还可以在不脱离本发明宗旨的前提下作出各种变化。

Claims (3)

1.一种基于OpenMP的并行字符串查询方法,其特征在于:
字符串数据集预处理步骤:将字符串数据集按字典序升序排序,按首字母分区,并统计各分区的字符串的数量,将查询集同样按字典序升序排序;
索引创建步骤:基于贪婪分区方法将数据集分区并创建分区表简称PT,通过OpenMP并行为每个分区创建分区双数组索引结构;
查询步骤:对待查询的字典序有序的一批字符串,在相应的DA上进行检索,获取查询结果;
所述字符串数据集预处理步骤具体为:
Step110:将字符串数据集按字典序升序排序;
Step120:统计各首字母对应的字符串数量La,Lb,Lc…Lz
Step130:将查询集按字典序升序排序;
所述索引创建步骤具体为:
Step210:构建分区表PT,将数据集划分为K个近似均匀的分区;
Step220:基于OpenMP为每个分区构建独立的DA索引结构;
所述Step 210具体为:
Step211:初始化分区表PT,PT的每一项包含首字母C、字符串数量L、分区号P三个属性,并依次写入预处理阶段得到的每个首字母及其对应的字符串数量,分区号均初始化为0;第i行,0≤i≤25对应的字符、字符串数量和分区号分别用Ci,Li和Pi表示;
Step212:将分区表PT按照字符串数量降序排序,置PT的前K项,0到K-1项的分区号为1,2,3…K;
Step213:按照L的大小,为PT中前K个表项建造一个小根堆,记堆顶元素对应的字符串数量和分区号分别为LH和PH
Step214:将PT的第i项,K≤i≤25归并到堆顶,置Pi=PH,更新堆顶元素LH=LH+Li后调整小根堆;
Step215:重复步骤214直到PT中的所有项都归并到堆中;
Step216:将分区表PT按照首字母C升序排序。
2.根据权利要求1所述的基于OpenMP的并行字符串查询方法,其特征在于所述Step220具体为:
Step221:基于OpenMP启动K个线程,并行地为每个分区创建分区双数组索引结构,第i个线程负责第i个分区双数组的构建;对线程i读取的字符串s,将其特定长度的前缀中的字符插入到第i个分区双数组中;对待插入字符ch,从状态x转换到状态y,对应的状态转移公式为:
BASE[x]+CODE[ch]=y (1)
CHECK[y]=x (2)
式中,CODE[ch]表示字符ch的数值编码,将字符“#”,“a”,“b”,“c”···“z”的编码值设置为1,2,3,4···27。
3.根据权利要求1所述的基于OpenMP的并行字符串查询方法,其特征在于所述查询步骤具体为:
Step310:将一系列按字典序有序排序的字符串集Q组成一个查询池;
Step320:每个线程取Q中一个字符串,根据所取字符串的首字母ch在Pch-‘a’对应的分区内执行DA的检索算法,并返回检索结果。
CN201910666139.2A 2019-07-23 2019-07-23 一种基于OpenMP的并行字符串查询方法 Active CN110457531B (zh)

Priority Applications (1)

Application Number Priority Date Filing Date Title
CN201910666139.2A CN110457531B (zh) 2019-07-23 2019-07-23 一种基于OpenMP的并行字符串查询方法

Applications Claiming Priority (1)

Application Number Priority Date Filing Date Title
CN201910666139.2A CN110457531B (zh) 2019-07-23 2019-07-23 一种基于OpenMP的并行字符串查询方法

Publications (2)

Publication Number Publication Date
CN110457531A CN110457531A (zh) 2019-11-15
CN110457531B true CN110457531B (zh) 2022-11-01

Family

ID=68483134

Family Applications (1)

Application Number Title Priority Date Filing Date
CN201910666139.2A Active CN110457531B (zh) 2019-07-23 2019-07-23 一种基于OpenMP的并行字符串查询方法

Country Status (1)

Country Link
CN (1) CN110457531B (zh)

Families Citing this family (2)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
CN111339381A (zh) * 2020-03-06 2020-06-26 昆明理工大学 一种字典序分区双数组的字符串批量查询方法及装置
CN112364027B (zh) * 2020-12-09 2023-06-30 北京海量数据技术股份有限公司 并行创建openGauss分区表索引方法、装置及系统

Citations (3)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
CN107239549A (zh) * 2017-06-07 2017-10-10 传神语联网网络科技股份有限公司 数据库术语检索的方法、装置及终端
CN107798054A (zh) * 2017-09-04 2018-03-13 昆明理工大学 一种基于Trie的范围查询方法及装置
CN108509505A (zh) * 2018-03-05 2018-09-07 昆明理工大学 一种基于分区双数组Trie的字符串检索方法及装置

Family Cites Families (2)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
CN102810096B (zh) * 2011-06-02 2016-03-16 阿里巴巴集团控股有限公司 一种基于单字索引系统的检索方法和装置
US9471596B2 (en) * 2013-08-13 2016-10-18 Mapquest, Inc. Systems and methods for processing search queries utilizing hierarchically organized data

Patent Citations (3)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
CN107239549A (zh) * 2017-06-07 2017-10-10 传神语联网网络科技股份有限公司 数据库术语检索的方法、装置及终端
CN107798054A (zh) * 2017-09-04 2018-03-13 昆明理工大学 一种基于Trie的范围查询方法及装置
CN108509505A (zh) * 2018-03-05 2018-09-07 昆明理工大学 一种基于分区双数组Trie的字符串检索方法及装置

Non-Patent Citations (1)

* Cited by examiner, † Cited by third party
Title
基于双数组Trie的高效索引结构及其并行化的研究;陈文焰;《中国优秀硕士学位论文全文数据库 信息科技辑》;20190115;全文 *

Also Published As

Publication number Publication date
CN110457531A (zh) 2019-11-15

Similar Documents

Publication Publication Date Title
JP3771271B2 (ja) コンパクト0完全木における順序付けられたキーの集まりの記憶と検索のための装置及び方法
CN108509505B (zh) 一种基于分区双数组Trie的字符串检索方法及装置
US10521441B2 (en) System and method for approximate searching very large data
Wang et al. Trie-join: Efficient trie-based string similarity joins with edit-distance constraints
US7697518B1 (en) Integrated search engine devices and methods of updating same using node splitting and merging operations
US8332410B2 (en) Bit string merge sort device, method, and program
EP1234258B1 (en) System for managing rdbm fragmentations
US8214405B2 (en) Longest-match/shortest-match search apparatus, search method, and program
CN110457531B (zh) 一种基于OpenMP的并行字符串查询方法
CN111339381A (zh) 一种字典序分区双数组的字符串批量查询方法及装置
CN101944086A (zh) 全字索引词典
Ghanem et al. Bulk operations for space-partitioning trees
CN112817530A (zh) 一种多线程安全高效读写有序数据的方法
Nishimoto et al. An optimal-time RLBWT construction in BWT-runs bounded space
US8204887B2 (en) System and method for subsequence matching
Kärkkäinen et al. Full-text indexes in external memory
Gupta et al. A framework for dynamizing succinct data structures
Gagie et al. New algorithms for position heaps
Blelloch et al. Space-efficient finger search on degree-balanced search trees
CN105824927A (zh) 一种基于树状自动机的域名匹配方法
Ma et al. An Algorithm for Reducing Approximate Nearest Neighbor to Approximate Near Neighbor with Query Time
Ehrenfeucht et al. String searching
Policriti et al. Average linear time and compressed space construction of the Burrows-Wheeler transform
US8849866B2 (en) Method and computer program product for creating ordered data structure
Zhenguo et al. An improved fp-growth algorithm based on compound single linked list

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