书签 分享 收藏 举报 版权申诉 / 12

一种数据压缩存储并检索的方法及系统.pdf

  • 上传人:00****42
  • 文档编号:972034
  • 上传时间:2018-03-22
  • 格式:PDF
  • 页数:12
  • 大小:526.80KB
  • 摘要
    申请专利号:

    CN200910025815.4

    申请日:

    2009.03.10

    公开号:

    CN101499094A

    公开日:

    2009.08.05

    当前法律状态:

    授权

    有效性:

    有权

    法律详情:

    授权|||实质审查的生效|||公开

    IPC分类号:

    G06F17/30

    主分类号:

    G06F17/30

    申请人:

    焦点科技股份有限公司

    发明人:

    李仁勇; 成俊杰

    地址:

    210061江苏省南京市高新技术产业开发区星火路软件大厦A座8-12F

    优先权:

    专利代理机构:

    南京知识律师事务所

    代理人:

    张苏沛

    PDF完整版下载: PDF下载
    内容摘要

    本发明公开了一种数据压缩存储和快速检索的装置和方法。目前对词典进行前缀检索一般采用Trie树(字符树),它的每一个节点上存储的是一个字符,这样就造成了空间的极大浪费。本发明将字符Trie树改进为字符串Trie树,有效降低了空间浪费问题。在内存要求比较严格的系统中,对字符串Trie树中节点的内容进行压缩处理,给出了压缩算法。该装置可用于对内存空间要求比较严格的移动存储设备中,在词典数据非常大的情况下,越能体现出该方法的优越性。另外该装置还可以用于目前互联网的搜索接口的Suggest功能,存在性检查以及类型的查询功能。

    权利要求书

    1、  一种数据压缩存储与检索方法,包括步骤:
    (1)根据用户检索情况,选择合适类型节点,将词典或特征数据用改进的字符串Trie树结构表示;
    (2)对字符串Trie树进行压缩,优化;
    (3)根据用户的输入,在字符串Trie树中进行检索。

    2、
      根据权利要求1所述的数据压缩存储与检索方法,其特征在于:扫描词典数据或特征数据,将数据插入到改进的字符串Trie树中。

    3、
      根据权利要求1所述的数据压缩存储与检索方法,其特征在于:遍历字符串Trie树中的节点数据,并对节点数据进行统计,并采用压缩算法对字符串Trie树进行压缩处理。

    4、
      根据权利要求1所述的数据压缩存储与检索方法,其特征在于:将字符串Trie树用于后缀查找。

    5、
      根据权利要求1所述的数据压缩存储与检索方法,其特征在于:将字符串Trie树用于<key,value>类型的查找。

    6、
      根据权利要求1所述的数据压缩存储与检索方法,其特征在于:将字符串Trie树用于数据存在性检测。

    7、
      根据权利要求3所述的数据压缩存储与检索方法,其特征在于,所述压缩算法:统计字符串Trie树中节点内容出现情况,选择可能被替换的字符串,列举出每种字符串所有可能的替换,通过删除候选替换,检测冲突并解决冲突,从而获得字符串Trie树的最佳字符串替换方案,实现对字符串Trie树的压缩处理;当访问字符串Trie树时,检测节点的类型,如果是压缩节点,则从映射表中读取真正内容。

    说明书

    一种数据压缩存储并检索的方法及系统
    技术领域
    本发明涉及通讯及计算机领域,在移动设备、互联网、输入法等方面均有特定的应用。
    背景技术
    词典的数据量是几十万甚至上百万,对其进行快速检索是迫切需要解决的问题。快速定位词典中单词所在的记录不仅仅在移动设备上有非常广泛的用途,而且在信息检索领域中也属于基础检索技术。对词典的查询非常频繁,对其查询速度和存储空间的任何改进都具有重大意义。
    目前大量应用系统中常常需要给出某字符串的唯一Id标识,该字符串可以为某特征字符串。通常的做法是在数据库中建立一张表,该表的两列分别存储字符串及其对应的Id,并对String建立索引,而且还需要保证Id的唯一性。另外一种比较直接的做法是采用Map结构,但Map结构在处理大数据量时将消耗大量的内存资源。
    另一方面,大量系统都需要支持编辑建议和输入建议功能,如目前的许多代码编辑系统中的代码援助功能,都需要支持前缀查询、后缀查询功能,前缀查询一般采用类似于数据库中的Like匹配策略,或者使用Trie树结构或者一些其它检索树(如B-树,B+树以及它们的变形),但是目前公布的对Trie树的优化算法都无法同时获得较高的查询效率以及消耗较小的内存空间。
    存在性检测通常用于检测某数据是否被处理过,例如判断url是否被爬虫程序获取过,以及判断某串是否出现在某词典中,以便判断该串是否是一个词等问题。
    数据压缩算法主要分为有损压缩和无损压缩两种。无损压缩就是能够完全还原的压缩算法,通常压缩算法是将数据加载到内存中,对其进行压缩处理后,将其持久化。在实际使用时,需要将持久化的数据解压后放在内存中,所以实际上对内存的消耗并没有真正的减少。本发明采用通过对内存数据进行压缩,然后再对其进行持久化的策略。
    有没有一种结构能够同时支持上述功能呢?本发明将公布这种结构。目前对词典进行前缀检索一般采用Trie(字符树),它的每一个节点上存储的是一个字符,这样就造成了空间的极大浪费。针对空间浪费的问题,我们需要设计一种压缩装置来解决空间浪费问题。
    Trie树对一个节点的孩子节点存储时,可以使用数组或者链式结构,并没有考虑查询单词的使用频率,通过采用特定的置换算法可以改善查询命中率。本发明改进了Trie树的结构,将其命名为字符串Trie树,并对其字符串Trie树中的内容进行压缩处理。
    发明就是针对上述情况进行处理和解决。
    发明内容
    目前大部分数据压缩方法不具有查询功能,本发明设计的压缩技术支持前缀查询和存在性检测。本发明提出了一种对Trie树结构进行改进的词典管理和检索方法。将字符Trie树改进为基于字符串的Trie树。在构造Trie树的过程中提出了一种优化策略,将节点中的数据进行替换压缩处理。在对内存要求比较严格或面对大数据量处理时,提出了一种内外存方式来实现对Trie树的动态加载。本发明根据常见需求的不同,给出了在设计Trie树节点时的一些区别。本发明提供了一种快速检索词典,并对词典数据进行压缩存储的方法。该方法能够高度压缩词典数据,并且本身就带有查询功能,在查询速度上也进行了改进,能够取得不错的效果。
    实现本发明所采用的技术方案为:一种数据压缩存储与检索方法,包括步骤:
    步骤一、根据用户检索情况,选择合适类型节点,将词典或特征数据用改进的字符串Trie树结构表示;
    步骤二、对字符串Trie树进行压缩,优化;
    步骤三、根据用户的输入,在Trie树中进行检索。
    上述的数据压缩存储与检索方法,其进一步特征在于:扫描词典数据或特征数据,将数据插入到改进的字符串Trie树中。
    上述的数据压缩存储与检索方法,其进一步特征在于:将字符串Trie树用于前缀查找;将字符串Trie树用于<key,value>类型的查找;将字符串Trie树用于数据存在性检测。
    上述的数据压缩存储与检索方法,其更进一步特征在于:遍历字符串Trie树中的节点数据,并对节点数据进行统计,并采用发明中所述的压缩算法对字符串Trie树进行压缩处理。所述的压缩算法是字符串替换算法,即将Tire树中节点存储的单词片段替换为另外一个较短的串,从而节省内存消耗。
    本发明的有益效果:解决了现有Trie树结构的缺点,比现有词典方法查询效率更高,占用空间更少。由于每个节点都记录着被访问的次数和访问时间,所以在遍历某节点的孩子节点时,充分利用它们进行排序,加速查找过程。另外本文提出的字符串Trie树解决了传统Trie树的空指针浪费的问题,并且本文采用特定的字符串替换算法进一步压缩了字符串Trie树的内存消耗。
    附图说明
    图1为本发明实施例的字符串Trie树插入数据示例图。
    图2为本发明实施例的字符串Trie树首字节点图。
    图3为本发明实施例的根据内存状态动态加载节点图。
    图4为本发明实施例的字符串Trie树生成及查询流程图。
    具体实施方式
    以下结合附图和实施例对本发明作进一步详细陈述。
    本发明的目的是为了解决Trie树结构现有的缺点,提供一种比现有词典方法查询效率更高,占用空间更少的词典管理和检索方法。该结构支持如下功能:前缀查询,后缀查询,特征串到Id的映射查询,存在性检查。
    1.改进Trie树结构
    本发明将Trie树结构改进成字符串Trie树。基本过程如下:
    构建字符串Trie树的过程大体上分为下面几步:
    A.采用改进的字符串Trie树对词典中的所有数据建立索引
    A1.设计字符串Trie树中的节点能够存储单词的片断;
    A2.设计字符串Trie树中的节点的孩子节点类型为链式结构
    A3.设计字符串Trie树中节点中设置链接类型字段:节点分为过渡节点、数据节点、混合节点。
    A4.扫描词典,并将数据存储到改进的结构中。
    改进的Trie树具有每个节点至少两个子节点。如图1所示,为本发明实施例的字符串Trie树插入数据示例图,图1展示了字符串Trie树在插入数据时的节点所作出的调整。根据查询需求不同,字符串Trie树每个节点包含不同的内容。节点的kind属性代表了该节点的类型,kind=2代表该节点是一个过渡节点,kind=3代表该节点是数据节点,其数据内容是从根节点到当前节点所连接起来的串(不包括根节点)。kind=6时,代表该节点既是一个过渡节点又是一个数据节点。kind=kind*7代表该节点中的数据为压缩数据,通过Map可以查询得到该节点的真实数据,什么类型节点中的内容数据需要压缩将在下面进行详细描述,kind=kind*(-1)代表该节点存储在硬盘上,该节点被动态加载到Cache中。基于上述基本定义,我们在判断节点类型时,将采用表1中所示的规则。
     

    节点类型kind属性满足数据节点Mod(3)=0过渡节点Mod(2)=0既是数据节点又是过渡节点Mod(6)=0压缩节点Mod(7)=0外存节点Kind<0

    表1.节点类型与kind属性之间的对应关系
    关于字符串Trie树的构建,常见的操作有:插入操作和删除操作。在插入数据的过程中,需要分裂部分节点,并根据需要修改节点的类型。而在删除数据的过程中,需要对节点进行合并,确保每个节点的孩子个数要大于2。
    根据上述的描述过程,我们可知由于没有浪费的孩子节点指针,字符串Trie树有效地降低了字符Trie树的空间浪费问题。
    2.对字符串Trie树进行压缩处理
    由于trie树中节点的内容往往重复出现,例如许多节点的内容都为“abc”,当重复出现的次数非常多时,将“abc”替换成a,能够节省一定的内存消耗,这非常有利于对内存要求比较严格的系统。所以需要统计出各节点内容的出现次数统计情况。遍历Trie树,统计Trie树中所含内容的长度大于2的所有节点,并且该内容出现的次数大于1次的这些单词片段,否则没有压缩的必要。获取节点统计信息。下面将重点描述字符串Trie树的压缩算法的整个过程。
    算法准备:
    1.遍历字符串Trie树,对节点的内容长度大于1的节点进行出现次数统计,当遍历完字符串Trie树时,就完成了各串出现次数的统计。将统计结果按照长度升序,出现次数降序进行排列,以下表的形式展现出来。
    2.由于长度为两位的串被替换成一位才能够节省内存空间,我们选定的替换字符为(a……z;A……Z;0……9),单字符的个数为63个,所以出现次数是前63位的长度为2的串被替换能够获得一定的收益,长度为N的串被小于N的串替换能够带来收益。根据此原理,删除原始表中不可能被替换的记录。
    3.针对每一行记录,按照收益从小到大排序的方式给出替换选择方案,例如节点内容为“ell”的记录,其对应的替换方案是{<2,T3845>,<1,(3-1)*T3845>},<2,T3845>是一个替换,其中的2表示使用长度为2的串进行替换,T3845是替换所获得的收益。
    最佳替换生成算法:
    对于每行记录选择第一个替换,组成一个替换方案。显然,但该方案并不是最优方案,下面给出生成最优替换方案的算法。
    算法假设:节点内容最长的串为L。由于算法设计一些操作,定义如下:
    1.删除操作:将某条记录第一个替换删去,此时该记录采用后面的替换。
    2.冲突操作:扫描所有记录的第一个替换,如果序号出现的次数超过其能够表达的个数,此时就存在冲突。
    3.冲突解决:对于序号的冲突的解决,删除该序号对应的最小收益的那个二元组。算法过程如下。
    1.从长度最大(L)的第一个记录开始,删除该记录对应的替换集合中的第一个替换,如果引起冲突,则评估解决冲突后带来的收益与不删除该替换所获得的收益进行对比。依次处理长度为L的第二个记录,直到处理到某记录,该记录的第一个替换不需要删除为止。调整影响由于解决冲突所影响到的记录的位置。
    2.按照步骤1依次处理长度L-1,L-2,……,2的记录。
    3.如果某次没有任何替换可以删除,则算法结束,否则,重复步骤(1),(2)
     节点内容出现次数替换选择,逗号分隔abT1{<1,T1>}utT2{<1,T1>}rtT62{<1,T62>}ellT3845{<2,T3845>,<1,(3-1)*T3845>}

     ……xyzT3906{<2,T3906>,<1,(3-1)*T3906>}xxxxxxxxTx{<i,(8-i)*Tx>,其中i=7…1}zzzzzzzzTz{<i,(8-i)*Tx>,其中i=7…1}

    表2.遍历字符串Trie树后获得的统计数据
    根据表2建立如下的映射表3。
     x1x62x63a9aa99Aaa999aaaa

    表3.根据表2建立的映射表
    根据映射表中的映射规则,通过遍历字符串Trie树,将Trie树中节点的节点内容根据映射规则替换成对应的内容。对Trie树中需要进行压缩处理的节点,将对应节点的kind属性设置为负数。
    3.采用内存+外存存储字符串Trie树策略
    当处理上亿数据时,无法将字符串Trie树中的所有节点数据都加载到内存中,必须将部分节点进行持久化处理,根据访问Trie树时的情况,当真正访问到该节点时,才将节点数据加载进入内存。
    为了评估字符串Trie树中的哪些节点应该被持久化,需要计算字符串Trie树中的节点的一些附加属性,例如:该节点被访问的次数,该节点的大小等信息,访问次数越少的节点越应该被持久化。如图3所示:分割线上方的数据被加载到内存中,分割线下方的数据被持久化在硬盘上,当需要访问时,根据指定的置换策略进行置换处理。
    如图3,为本发明实施例的根据内存状态动态加载节点图,所示节点t3,t4,t9,t11将被持久化,而根节点被加载到内存中,由于节点之间存储链接关系,节点t1,t2,t5,t6,t10也被加载在内存中,而节点t7,t8,t13,t14,t15,t16中的信息也被持久化。
    4.孩子节点类型与查询策略改进
    在初始化字符串Trie树时,将字符串Trie树的孩子节点类型为链式结构,当数据全部插入到Trie树中时,由于孩子节点的个数已经比较稳定,所有采用数组对链式结构进行替换,避免链式结构在空间上的浪费。
    对字符串Trie树中的某节点而言,在访问其孩子节点时,在没有先验知识的前提下,只能顺序访问其所有的孩子节点。为了获得较快的查找速度,我们将按照该节点的各孩子节点的访问频率和最近访问情况进行排序,使得在遍历Trie树的过程中,优先访问最近访问节点的和访问频率比较高的节点。
    基于Trie树的词典机制一般是对词的首字计算Hash值,建立首字hash表或者直接根据首字的内部编码进行转换成数组的下标,正如图2所示,图2为本发明实施例的字符串Trie树首字节点图。然后建立字符串Trie索引树。
    5.Trie树的序列化
    当将字符串Trie树用于传输词典数据时,需要对其进行序列化处理。对图1所示的Trie树进行序列化处理,其结果为ab[ut,rt),b(a(idu,nk),ell)。其中定义了映射规则:
    (1)Mod(abs(kind),2)=0时,节点内容后紧跟‘(’;
    (2)Mod(abs(kind),3)=0时,节点内容后紧跟‘[’;
    (3)kind<0时,节点内容后紧跟‘{’;
    (4)孩子节点的内容之间采用逗号进行分割。
    对字符串Trie树序列化后,通过扫描该字符串序列,可以重建出该序列化文件对应的字符串Trie树。
    6.改进传统查询
    查询1:给定某词典D和某前缀p,查询D中所有以p为前缀的数据。
    1.用户输入查询前缀串;
    2.从Trie树的根节点开始,获得当前节点的孩子节点,通过孩子节点的数量识别孩子节点是数组类型还是链表类型。如果是数组类型,则直接定位到该孩子节点;
    3.链式孩子节点,将顺序扫描节点,在扫描过程中,如果该节点为压缩节点,则通过Map取出相应的数据,然后进行匹配,如果第一个字母相同,则找到节点。如果用户输入匹配当前节点数据,则当前节点就是要找的数据;
    4.获取该节点所有的孙子节点中kind属性满足Mod(kind,3)为0的节点,将他们的内容形成列表,该列表就是返回给用户相应的前缀查询数据。
    查询2:存在性检测
    传统的存在性检测可以采用Set方式实现,而本发明也可以支持存在性检测。如果用户输入串,完全匹配从根节点到找到的节点的串路径上串的和,则完全匹配;否则,未找到。该节点所指向的位置就是用户所要查询的位置,据此,用户可以获得关于用户输入串的一切信息。
    查询3:给定某映射关系,<键,值>对中的键,查询该键对应的值。
    传统的键值关系映射查询主要采用Map结构进行实现,而本发明也可以支持对键值映射关系的查询。首先查询键在字符串Trie树中的位置,即获得键在Trie树中对应的节点,然后通过访问该节点中存储的值,从而获得键与值之间的对应关系。
    图4为本发明实施例的字符串Trie树生成及查询流程图。
    虽然本发明以较佳实施例公开如上,但它们并不是用来限定本发明,任何熟悉此技艺者,在不脱离本发明之精神和范围内,自当可作各种变化或润饰,因此本发明的保护范围应当以本申请的权利要求保护范围所界定的为准。

    关 键  词:
    一种 数据压缩 存储 检索 方法 系统
      专利查询网所有文档均是用户自行上传分享,仅供网友学习交流,未经上传用户书面授权,请勿作他用。
    0条评论

    还可以输入200字符

    暂无评论,赶快抢占沙发吧。

    关于本文
    本文标题:一种数据压缩存储并检索的方法及系统.pdf
    链接地址:https://www.zhuanlichaxun.net/p-972034.html
    关于我们 - 网站声明 - 网站地图 - 资源地图 - 友情链接 - 网站客服 - 联系我们

    copyright@ 2017-2018 zhuanlichaxun.net网站版权所有
    经营许可证编号:粤ICP备2021068784号-1