高级数据库解压缩的制作方法

文档序号:23383956发布日期:2020-12-22 13:48阅读:90来源:国知局
高级数据库解压缩的制作方法

对相关申请的交叉引用

本申请要求lasch等人于2019年6月21日提交的名称为“advanceddatabasecompressiononmodernhardware”的美国临时专利申请no.62/864,782的优先权,通过引用将其全部公开内容合并于此。

本公开通常涉及数据处理,更具体地,涉及数据库压缩和解压缩。



背景技术:

在数据库中,域编码是一种广泛用于列存储以压缩和查询加速的技术。它用唯一的整数值标识符来替换列中的值。从标识符回到实际值的映射被存储在附加数据结构(字典)中。这意味着使用域编码表示列需要两个数据结构:字典和值标识符数组。字典将不同的值存储在列中,并提供从唯一标识符到值的映射。值标识符数组充当字典的索引。这也称为索引向量。

在列中多次出现的值仅在字典中存储一次。这意味着通过此方法,显著地压缩了仅包含在列中多次出现的几个不同值的列。这是因为用于替换值的值标识符通常显著小于实际值。通过用值标识符替换值,域编码还可以提高性能,因为某些可以在不进行域编码的情况下对值本身执行的操作也可以直接在值标识符上执行。

对于存储字符串的列,用于域编码的字典是字符串字典。字符串字典是一种数据结构,实现从字符串集合x到唯一整数标识符的字符串双射映射。对于字符串字典,实现压缩的最简单方法之一是按字典顺序对字典中的字符串进行排序,然后应用前端编码,将每个字符串与其前任进行比较(即,(块的)第一个字符串被完全存储。后续字符串存储与前任共享的前缀和压缩后缀的长度)。前端编码通常被应用于固定大小的字符串存储桶。



技术实现要素:

在一些实现方式中,当前主题涉及用于执行数据解压缩的计算机实现的方法。所述方法可以包括:响应于访问存储压缩块集合中的数据的请求,识别存储压缩块集合中的一个或多个压缩块;使用前端编码对识别的压缩块内的字符串前缀进行解压缩;使用重新配对解压缩对识别的压缩块内的字符串后缀进行解压缩;以及生成未压缩数据。

在一些实现方式中,当前主题可以包括以下可选特征中的一个或多个。在一些实现方式中,重新配对解压缩可以包括迭代扩展符号树中与存储在识别的压缩块中的数据相对应的每个符号。符号树可以包括多个节点。压缩块可以是从字典中的字符串的一个或多个前端编码存储桶生成的。前端编码存储桶被配置为被采样以形成一个或多个超级块。超级块的每一个可以被配置为被压缩以生成用于压缩压缩块的共享语法。多个节点可以包括以下至少之一:末端字符、非末端字符及其任意组合。在一些实现方式中,所述方法还可以包括并行执行多个重新配对解压缩。末端字符的数量可以被限制为预定数量。此外,每个符号的迭代扩展次数可以基于预定数量来确定。

在一些实现方式中,重新配对解压缩可以包括:初始化与符号树中的每个符号相对应的存储器中的堆栈位置;使用向量化重新配对扩展将符号树中的每个符号从存储装置同时加载到存储器中;通过评估与符号相关联的一个或多个谓词,将加载的符号合并到未压缩数据中;以及使用预定数量重复同时加载和合并。

在一些实现方式中,压缩块集合中的每个块可以包括存储桶头和压缩存储桶的序列。块大小可以至少为以下之一:固定大小和可变大小。此外,可以使用重新配对压缩对压缩块进行压缩。

在一些实现方式中,当前主题涉及用于执行数据库压缩的计算机实现的方法。所述方法可以包括:从数据集生成具有块大小和前端编码存储桶大小的压缩字符串字典;将前端编码应用于具有前端编码存储桶大小的字典中的字符串的一个或多个存储桶,以生成字符串的一个或多个前端编码存储桶;将生成的字符串的前端编码存储桶的一个或多个部分级联,以形成具有块大小的一个或多个块;压缩一个或多个块中的每一个;以及存储一个或多个压缩块集合,其中,压缩块集合存储数据集中的所有字符串。

在一些实现方式中,当前主题可以包括以下可选特征中的一个或多个。在一些实现方式中,压缩块集合中的每个块可以包括存储桶头和压缩存储桶的序列。

在一些实现方式中,该方法还可以包括在字符串的多个前端编码存储桶中的字符串的存储桶之间插入终止符。终止符可以未压缩。

在一些实现方式中,每个字符串可以包括字符串终止符,其中每个字符串终止符被压缩。

在一些可选实现方式中,每个字符串的长度可以被存储并与该字符串一起压缩。

在一些实现方式中,块大小可以是以下至少之一:固定大小和可变大小。

在一些实现方式中,压缩可以包括独立地并行执行多个存储桶中的每个前端编码存储桶的压缩。

在一些实现方式中,一个或多个前端编码存储桶可以被配置为被采样以形成一个或多个超级块。每个超级块可以被配置为随后被压缩以生成用于压缩块的共享语法。例如,共享语法可以用于执行块的加速压缩。

在一些实现方式中,块的压缩可以包括重新配对压缩。

在一些实现方式中,该方法还可以包括:接收访问存储压缩块集合中的数据的请求;响应于接收的请求,识别存储压缩块集合中的一个或多个压缩块;以及至少部分地解压缩识别的压缩块以生成未压缩数据。解压缩可以包括:使用前端编码对识别的压缩块内的字符串前缀和后缀进行解压缩;以及使用重新配对解压缩对识别的压缩块内的字符串后缀进行解压缩。此外,重新配对解压缩可以包括迭代扩展符号树中与存储在识别的压缩块中的数据相对应的每个符号。

还描述了存储指令的非暂时性计算机程序产品(即,物理体现的计算机程序产品),当指令由一个或多个计算系统的一个或多个数据处理器执行时,使至少一个数据处理器执行本文中的操作。类似地,还描述了计算机系统,可以包括一个或多个数据处理器和耦合到一个或多个数据处理器的存储器。存储器可以临时或永久地存储使至少一个处理器执行本文描述的一个或多个操作的指令。另外,方法可以由单个计算系统内的一个或多个数据处理器或分布在两个或多个计算系统之间的一个或多个数据处理器来实现。这样的计算系统可以被连接并且可以经由一个或多个连接来交换数据和/或命令或其他指令等,这些连接包括但不限于通过网络(例如,互联网、无线广域网、局域网、广域网、有线网络等),通过多个计算系统中的一个或多个之间的直接连接等。

在附图和以下描述中阐述了本文描述的主题的一个或多个变型的细节。从说明书和附图以及从权利要求书中,本文描述的主题的其他特征和优点将是显而易见的。

附图说明

结合在本说明书中并构成本说明书的一部分的附图示出了本文所公开的主题的某些方面,并且与说明书一起帮助解释了与所公开的实现方式相关联的一些原理。在附图中:

图1示出示例性的普通前端编码压缩方法;

图2a示出根据当前主题的一些实现方式的用于执行字典压缩的示例性系统;

图2b示出根据当前主题的一些实现方式的用于执行图2a所示的字典压缩的示例性系统的更多细节;

图3示出根据当前主题的一些实现方式的示例性实验数据集;

图4示出根据当前主题的一些实现方式的示例性实验测量压缩次数;

图5示出根据当前主题的一些实现方式的用于执行字典数据压缩的示例性处理;

图6示出根据当前主题的一些实现方式的字典/字符串压缩处理的替代实现方式;

图7a示出示例性extract(提取)函数;

图7b示出locate(定位)函数的示例性实现方式;

图8示出用于递归扩展非末端的示例性处理,该处理是对每个符号执行的操作以解压缩用重新配对压缩的文本。

图9示出根据当前主题的一些实现方式的用于执行数据的解压缩和/或访问的示例性系统;

图10示出示例性expandsymbol(扩展符号)函数;

图11a示出根据当前主题的一些实现方式的expandsymbol算法的示例性迭代版本;

图11b示出根据当前主题的一些实现方式的可被用于执行图11a中所示的算法的示例性代码;

图12是示出根据当前主题的一些实现方式的包括数据存储应用的示例性系统的示图;

图13是示出图12的系统的细节的示图;

图14是根据当前主题的一些实现方式的示例性系统;

图15是根据当前主题的一些实现方式的示例性方法;以及

图16是根据当前主题的一些实现方式的示例性方法。

具体实施方式

为了解决当前可用解决方案的这些和潜在的其他缺陷(例如,用于前端编码的低压缩率,用于其他压缩方案的高压缩时间和提取时间等),当前主题的一种或多种实现方式涉及方法、系统、制造品等,可以提供执行数据库压缩以及解压缩和访问压缩数据的能力。

数据压缩

在一些实现方式中,当前主题涉及数据库压缩。数据库压缩可以通过在数据集中生成具有块大小和前端编码存储桶大小的压缩字符串字典来实现。可以对具有块大小和前端编码存储桶大小的组合的字典中的每个字符串应用前端编码,以生成字符串的多个前端编码存储桶。多个字符串的前端编码存储桶可以被级联。可以在字符串的多个前端编码存储桶中的字符串的存储桶之间插入终止符。多个字符串的前端编码存储桶可以被压缩。基于压缩的前端编码存储桶,可以生成并存储与字典中的每个字符串相对应的压缩块集合。在一些实现方式中,压缩块集合中的每个块可以包括存储桶头和压缩存储桶的序列。终止符可以未压缩。在一些实现方式中,每个字符串可以包括字符串终止符,其中每个字符串终止符被压缩。

存储器内数据库管理系统(imdbms)已在许多领域使用,并且仍在越来越广泛地使用。imdbms通常依靠数据压缩来促进将其整个工作集保存在主存储器中。然而,此类系统通常具有千兆字节(multi-terabyte)的存储器占用量。特别是,但不是唯一地,在云方案中,主存储器的成本是总拥有成本(tco)中最大的因素之一。因此,作为减少tco的手段,非常需要减少imdbms的存储器占用量。

对真实世界的imdbms系统进行的调查显示,字符串字典是单个最大存储器消耗者。因此,它们的压缩显著影响系统的总存储器占用量。存在大量用于严重压缩字符串字典的技术,但是实际上,imdbms仍然依赖轻量级方法,因为它们提供了更快的压缩速度,更重要的是,访问操作的速度是重量级方法的几倍。尽管相关工作关注于通过算法改进和新颖方法来弥补这一差距,但是在很大程度上尚待探索利用现代硬件的进步来改进现有方法。

在一些实现方式中,当前主题涉及一种用于通过优化字符串字典压缩处理来执行数据库压缩的计算机实现的方法。当前的主题方法可以包括基于块的重新配对压缩算法,在不大幅降低压缩率的情况下,可是实现实际压缩时间能比某些现有处理快24倍。

字典压缩是数据库中减少其存储器需求的一种流行方法。字典将列(或多个)(的集合)的域的值映射到值标识符(id)。在记录中,这些值被对应的值id取代,这可以导致节省空间(尤其是对于字符串),并使得能够对字典编码的值进行有效处理。然后,字符串字典提供两种访问操作:1)给定值idid,extract(id)返回字典中的对应字符串,2)给定字符串str,如果str在字典中,则locate(str)返回str的唯一值id,否则返回大于str的最小字符串的值id。

存在几种执行字符串字典压缩的方法。这些包括前端编码、霍夫曼-塔克(huffman-tucker)编码、n-gram压缩和re-pair(重新配对)压缩。普通前端编码(pfc)是一种轻量级方法,用于压缩排序的字符串字典。字符串由公共前缀的长度及其在字典中的前任以及剩余的后缀表示,如图1中的第二行所示,示出了示例性pfc压缩方法100。如图1所示,每个框代表字典中一个字符串。使用前端编码表示,压缩最后两个字符串。第一个没有,因为它没有前任。pfc对固定大小的存储桶操作。在一些示例性实现方式中,存储桶大小可以是16个字符串。每个存储桶的第一个字符串(存储桶头)未压缩地存储。这有利于随机访问字符串字典。在没有存储桶的情况下,每次访问都需要对字典中的所有先前字符串进行解码。在使用存储桶的情况下,只需从包含所需字符串的存储桶的开头开始解码字符串。

重新配对压缩方法是基于语法的压缩方法。它从输入文本t迭代获得语法,并将文本转换为符号的压缩序列。在每次迭代中,它首先找到t中最频繁的一对符号ab。如果存在具有相同频率的多个符号对,则随机选择一个候选。然后,它将规则r→ab添加到语法中,其中r是先前未在t或语法中出现的非末端符号,而a和b可以是任何符号(末端或非末端)。然后,t中每次出现ab时用r替换。当在t中没有剩下出现多于一次的符号对时,此迭代终止。

在pfc之上的重新配对(重新配对前端编码(rpfc))方法提供了压缩的另一种选择。回到参照图1,第三行示出了如何在pfc上应用重新配对。rpfc在字典中所有前端编码存储桶的顶部应用重新配对,但是存储桶头被剩下不被压缩。将为整个字典创建一个语法。如图1所示,该语法可以被可视化为二进制树集合,其中内部节点是非末端,而叶节点是末端。

然而,现有的压缩方法,包括用于rpfc压缩的re-pair压缩算法,在执行大字符串字典的压缩时具有各种缺点。特别是对于rpfc,与轻量级压缩方法相比,其所需的压缩时间非常高。此外,压缩时间以超线性方式随着输入数据大小的增加而增长,这在压缩不同大小的数据集时可以观察到。一旦未压缩的字符串字典的大小超过几百兆字节,则这会使rpfc所需的压缩时间很快变得不切实际。其次,该算法的存储消耗等于输入文本大小的多倍。

为了解决这些问题,在一些实现方式中,当前主题提供了可以通过减小将使用重新配对方法压缩的文本t的大小来执行的块重新配对前端编码(brpfc)方法。特别是,为了减小t的大小,在对每个块分别应用重新配对压缩之前,可以将字典拆分为包含固定数量的前端编码存储桶的块。

具有块大小b和前端编码存储桶大小b的brpfc压缩字符串字典可以按以下方式构造:对于按字典顺序排序的字典中的每个b·b字符串,可以首先应用前端编码。这将导致b个字符串的前端编码存储桶。然后,可以将存储桶级联,省略存储桶头。可以在每个存储桶之间插入终止符t。可以使用不同的终止符u来终止存储桶中的前端编码字符串。现在可以使用重新配对对级联的存储桶进行压缩。重新配对算法可以忽略终止符t,但是可以压缩用于终止字符串的终止符u。因此,在重新配对压缩之后,存储桶边界可以在整数个符号,但是字符串边界不是必须的。在重新配对压缩之后,可以将压缩后的序列拆分为子序列,子序列可以对应于每个前端编码存储桶。这些可以与它们相应的存储桶头重新组合,并最终级联在连续序列中。每个存储桶开头的偏移可以被存储在单独的数组中,并且由重新配对生成的语法也可以作为每个块的一部分被存储。此处理得到压缩块集合,每个存储b·b个字符串,最后一个块除外,如果字典中的字符串数量不是b·b的倍数,则最后一个块可能包含较少的字符串。每个块可以包括存储桶头和压缩存储桶、相对于存储桶头的偏移数组的序列。

图2a-2b示出根据当前主题的一些实现方式的用于执行字典压缩的示例性系统200。系统200可以包括通信地耦合至持久层206的数据存储应用204。数据存储应用204可以被配置为包括用于执行字典压缩的计算组件214-220,如本文所讨论的(如图2a所示)。特别地,一旦数据存储应用204接收到未压缩的字典202数据(图2b中示出的状态230),则计算组件214可以被配置为生成一个或多个逻辑块。使用生成的逻辑块,计算组件216可以被配置为应用前端编码以生成固定数量的前端编码存储桶232(如图2b所示)。计算组件218可以使用前端编码存储桶来准备用于重新配对压缩的块。特别地,如上所述,可以对前端编码存储桶进行级联,其中可以省略存储桶头。可以在存储桶之间插入终止符t。可以使用不同的终止符u来终止存储桶中的前端编码字符串。然后,组件220可以使用级联的准备好的块来使用重新配对算法应用逐块压缩,以生成一个或多个压缩块236(如图2b所示,在压缩状态240)。

如上所述,重新配对算法可以忽略终止符t,并且可以压缩终止符u。在重新配对压缩之后,可以将压缩后的序列拆分为与每个前端编码存储桶相对应的子序列,这些子序列可以与它们相应的存储桶头重新组合,并最终级联在连续序列中。每个存储桶开头的偏移可以被存储在单独的数组中,并且通过重新配对生成的语法也可以作为每个块的一部分被存储。该处理得到压缩块集合236,每个块存储b·b字符串,最后一个块除外,如果字典中的字符串数量不是b·b的倍数,则最后一个块可能包含较少的字符串。然后可以将压缩的字典发送到持久层206以进行存储。

图3-4示出字典数据集的压缩时间的各种实验测量。特别地,图3示出示例性实验数据集300。例如,如图3所示,strings可以指数据集中不同字符串的数量,size可以指所有字符串的总大小,以字节为单位,包括终止符,并且aver.size可以指数据集中单个字符串的平均大小。可以选择这些数据集来覆盖字符串列的常见用例,诸如自然语言(enwiki)、名称(geonames)和机器可读数据(indochina,uk)。它们的范围也从短平均字符串大小(geonames,enwiki)到长平均字符串大小(indochina,uk)。

图4示出示例性实验测量压缩时间400。如图4所示,每列示出四个评估数据集(如图3所示)中的一个的压缩率。每行对应于不同的压缩方法。对于brpfc816bps方法,已经评估了每个块的不同块大小b,范围从128到128k前端编码存储桶。结合压缩时间结果,确定了压缩时间与压缩率之间具有最佳折衷的块大小。

如图4所示,方法rpfc816bps压缩时间比rpfc快。这是因为符号的数量受到rpfc816bps中的16位表示的限制,从而减少了算法执行的迭代次数。此外,brpfc816bps压缩方法在较小的块大小时比rpfc显著更快,并且即使在较大的块大小时也保持较快,除了geonames数据集(在b=32k时,brpfc变得比rpfc慢)。brpfc816bps压缩时间随着块大小的增加而缓慢增加。然而,对于uk、enwiki和geonames,压缩时间在b=4k和b=8k之间急剧增加,并且对于indochina,压缩时间在b=8k和b=16k之间增加。这是因为在这些块大小,重新配对算法的工作数据集超过了cpu高速缓存,从而显著增加了运行时间。

图5示出根据当前主题的一些实现方式的用于执行字典数据压缩的示例处理500。处理500可以由图2所示的字典数据压缩系统200执行。在502,数据存储应用204(如图2所示)可以被配置为生成具有块大小和前端编码存储桶大小的压缩字符串字典。在504,应用204可以被配置为将前端编码应用于字典中的每个字符串,其中,字符串具有前端编码存储桶大小。结果,应用可以被配置为生成多个字符串的前端编码存储桶。随后,在506,可以将字符串的前端编码存储桶的一个或多个部分级联以形成具有预定块大小的块。在一些示例性实现方式中,可以在字符串的存储桶之间插入终止符。应用204然后可以在508压缩每个块,从而在510生成与字典中的每个字符串相对应的压缩块集合。应用204然后还可以将压缩块存储在持久层206中。

图6示出了根据当前主题的一些实现方式的字典/字符串压缩处理600的替代实现方式。处理600可以类似于图2a-2b中所示的处理。图6中所示的压缩处理600可以被称为基于采样块的重新配对压缩。处理600可以被配置为通过消除块的语法规则的重叠来改变图2a-b中所示的处理,这可以提高压缩质量。因为不必对整个字典执行完全重新配对压缩,而仅对字典的较小部分进行压缩,所以可以加快压缩速度。

如图6所示,处理600可以以与图2a-2b所示的处理类似的方式开始(在未压缩状态230),通过将前端编码216应用于从未压缩字典字符串创建的逻辑块来创建前端编码存储桶232。然后,处理600可以被配置为在前端编码阶段之后生成单个重新配对语法610。然后可以将该语法用于压缩字典的所有块。可以通过在602对选定数量的前端编码存储桶232进行采样以形成超级块604来生成语法。超级块604可以包括一个或多个前端编码存储桶以达到预定目标大小。可以确定目标大小以优化生成的语法。为了将前端编码存储桶232包括在超级块604中的目的,对它们进行选择和/或采样(例如无需替换的采样,得到采样字符串的均匀分布的vandecorput序列和/或任何其他采样方法)在达到目标大小时终止。然后可以使用重新配对算法608压缩超级块,并且可以将所得到的语法610用作共享语法(如虚线箭头所示)。

然后,可以将重新压缩606应用于字典的块234。它的输入可以是共享语法和未压缩块。重新压缩606可以生成一个或多个压缩块612。对于重新压缩,可以生成包含来自共享语法的所有扩展规则的树,其中可以用规则的非末端符号来标记与扩展规则相对应的树节点。然后可以使用该共享语法的表示来压缩每个块。在块文本的每个位置,可以使用文本中的符号来遍历树。结果,可能会找到几个规则扩展与文本中当前位置的字符串匹配。可以选择最长的一个,并用规则的非末端替换文本中的该段。可以在文本中被替换的段之后的下一个位置重复此处理,并继续进行直到压缩整个文本为止。如果在扩展规则中找不到匹配,则重新压缩算法可以继续到文本中的下一个位置。

解压缩和访问压缩数据

在一些实现方式中,当前主题可以被配置为执行解压缩和/或访问压缩数据。特别地,当前主题可以被配置为对rpfc、brpfc和采样brpfc压缩字符串字典加快压缩数据访问时间,特别是extract(提取)和locate(定位)函数时间。为了提高访问时间,可以实现extract和locate操作的不同部分。

图7a示出示例性extract函数700,其可以被配置为:如果请求的字符串存在于字典中,则将具有值标识符id的字符串提取到预分配的输出缓冲器outputbuffer中,并返回所提取的字符串的长度。否则,返回-1以用信号表示请求的值标识符无效。有效标识符在[1;e]范围内,其中e是字典中的字符串数量。如果请求的标识符有效,则首先确定请求的字符串所驻留的存储桶,然后确定该字符串在该存储桶中的位置。

一旦确定了请求的字符串所驻留的存储桶,就可以使用getbucketheader函数将该存储桶的头复制到输出缓冲器。此函数将bucketid引用的存储桶的零终止存储桶头复制到输出缓冲器outputbuffer,并通过其第三个参数length报告复制的字符串的长度。最后,该函数返回指向压缩桶的指针,该指针紧随压缩字典中的存储桶头之后。如果extract中请求的字符串是存储桶头,即位置等于0,则可以直接返回存储桶头的长度,因为输出缓冲器已包含请求的字符串。

否则,将对存储桶的其余部分进行部分解压缩,直到到达请求的字符串的位置为止。此解压缩涉及重新配对解压缩,以及在重新配对解压缩后解码前端编码字符串。此处理以交错方式进行。一次扩展一个或两个重新配对符号,然后该算法继续使用扩展的重新配对符号的输出对尽可能多的前端编码字符串进行解码。字符串被直接解码到预分配的输出缓冲器。一旦达到了请求的字符串在存储桶中的位置并对该字符串进行了解码,就可以返回解码字符串的长度。这样,仅存储桶中提取请求的字符串所必需的部分被解压缩和解码,而存储桶的其余部分则保持不变,从而避免了不必要地解压缩整个存储桶。当然,如果请求的字符串是存储桶中的最后一个字符串,则必须对整个存储桶进行解压缩以提取该字符串。

如图7a所示,包含压缩存储桶而无头的缓冲器由变量bucket指示,并且在函数decodestring中实现单个字符串的解压缩,该函数在第10行中由提取函数重复调用,直到请求的字符串被解码为止。decodestring函数由已包含先前解码的字符串的输出缓冲器和包含头之后的压缩存储桶的存储桶缓冲器调用。通过decodestring函数将length参数分配给解码字符串的长度,而offset参数用于跟踪压缩存储桶已经被解码多少位。

图7b示出locate函数710的示例性实现。该函数将字符串string作为其输入,并且如果string未包含在字典中则返回0,或者如果string包含在字典中则返回有效值标识符。通过首先对压缩字典中的存储桶的头执行二进制搜索来执行该函数。在locatebucke函数中实现该二进制搜索。如果二进制搜索确定搜索到的字符串可能所在的潜在存储桶,则对此存储桶进行扫描。如果扫描在存储桶中找到了所需的字符串,则可以返回其值标识符,否则操作的结果是该字符串不在字典中。如果二进制搜索未找到潜在存储桶,情况也是如此。在这些情况下,返回无效值标识符0,以用信号表示字典中不存在搜索到的字符串。

如果搜索到的字符串被识别为二进制搜索返回的存储桶的头,则locatebucket函数还将头布尔标志设置为true(真)。在这种情况下,无需对存储桶进行附加扫描。与上述讨论的extract操作类似,对二进制搜索识别的存储桶进行扫描。使用decodestring函数将存储桶中的字符串顺序解压缩到缓冲器outputbuffer中。然后将解压缩的字符串与搜索到的字符串进行比较,直到找到匹配或到达块的末尾为止。

图8示出用于递归扩展非末端的示例性处理800,该处理是对每个符号执行的操作以解压缩使用重新配对压缩的文本。处理800包括在rpfcextract和locate实现方式中使用的expandnonterminal函数,目的在于解压缩应用于前端编码之上的重新配对压缩。它的参数是要被扩展的非末端nonterminal、位打包语法数组grammar和预分配的输出缓冲器outputbuffer,其中存储了扩展的字符。该函数返回其扩展的字符数。

为了扩展非末端,首先使用getfield函数从语法数组中提取它映射到的两个符号。在此步骤之后,首先将非末端映射的左符号递归扩展,然后对右符号执行相同的操作。然而,对于左符号和右符号二者,首先检查符号是否已经是末端,在这种情况下,无需执行附加扩展,并且可以将符号写入输出缓冲器。这是递归的末尾情况。如果符号小于末端数n,则该符号为末端。这是因为末端被编码为范围[0;n)内的整数符号,并且非末端被编码为范围[n;n+n]内的整数符号,其中,n是非末端的数量。由于非末端符号的整数值从n开始,但是语法数组的索引从0开始,因此在将非末端符号用于在语法数组中进行查找之前必须先从其中减去n。如图8所示,当在第8行和第14行递归调用expandnonterminal时,就会发生这种情况。已被扩展的字符总数在扩展变量中被跟踪,并最终作为函数结果返回。

在某些情况下,extract函数可以通过首先确定请求的字符串在字典中驻留的存储桶而被实现用于重新配对压缩字典。然后,该实现可以接收该存储桶的头,然后对存储桶中的字符串进行解码,直到已达到请求的字符串的位置为止。类似地,locate函数实现方式可以确定搜索到的字符串可以驻留的候选存储桶,然后扫描该存储桶,直到找到该字符串或到达存储桶的末尾为止。然而,对于这两个函数,对存储桶中的字符串进行解压缩将占用整个操作的大部分cpu时间。更准确地说,对字典存储桶中的字符串进行解码首先需要将重新配对符号扩展为非末端的序列,然后从压缩序列中的前端编码表示中解码完整字符串。

图9示出根据当前主题的一些实现方式的用于执行数据的解压缩和/或访问的示例性系统900。系统900可以包括与图2a所示的组件相似的组件。特别地,系统900可以包括通信地耦合到持久层206的数据存储应用204。系统900可以被配置为接收查询(呼叫、请求等)902以提取特定数据(例如,extract(vid))。数据存储应用204可以包括逻辑块确定组件914,逻辑块确定组件914可以被配置为确定可以对应于接收的请求902的特定逻辑块。

为了可以由组件916执行的解压缩,在932从持久层206获得响应于接收的请求的数据。可以通过在922使用前端编码对前缀进行解压缩来执行解压缩。然后在924使用重新配对算法对后缀进行解压缩。

在一些实现方式中,为了执行重新配对解压缩,当前主题可以被配置为利用expandsymbol函数替换如上所述的expandnonterminal函数,用于在extract和locate操作中执行重新配对符号扩展。expandsymbol函数可以被配置为接受符号而不是非末端索引。示例性expandsymbol函数1000在图10中示出,其中,n和n可以分别表示非末端和末端的数量。算法1000可以进一步被配置为允许重新配对查找的向量化。这样做的必要先决条件是去除expandnonterminal函数的递归性质。

在一些实现方式中,expandsymbol可以被配置为执行符号树的深度优先遍历,从而输出叶(即,末端)。这可以通过在每次迭代中处理一个树节点来迭代执行直到符号扩展完成为止。当前节点被存储在current中,其被初始化为expandsymbol的输入符号,即符号树的根。遇到的每个节点都可以是末端(叶节点)或非末端(内部节点)。如果它是内部节点(分支1,第7-10行,如图10所示),则使用getfield获取(fetch)该节点的左右子节点,可以被配置为解码位打包语法数组中的符号。可以将右子节点放到堆栈上以供以后使用,而左子节点可以成为下一个迭代的current。这样,总是会遍历树中的左路径,直到遇到叶为止。当这种情况发生时(分支2,第12-13行,如图10所示),可以输出叶节点(它是末端),并且可以从堆栈中去除节点以在下一次迭代中处理。一旦从堆栈中去除最后一个叶节点并输出,则该树已被完全遍历。

在一些实现方式中,重新配对查找的向量化可以被配置以下先决条件中的一个或多个。特别地,图9中所示的应用204的组件922可以被配置为使用向量指令并行执行多个expandsymbol操作。如上所述,expandsymbol可以包括对符号树上的深度优先搜索,并且由于后者可以具有任意深度,因此一起执行的遍历必须具有相似的迭代次数才能使向量化有效。因此,当前主题可以被配置为限制非末端可以被配置为扩展到的末端的数量,这可以等同于限制符号树中的叶的数量,从而允许向量化代码执行固定数量的迭代。可以在压缩时强制执行此限制。在一些示例性实现方式中,当前主题可以被配置为具有非末端可以扩展到的8个末端,这可以允许向量化代码执行15次迭代。另外,为了减少每次向量化循环迭代中的计算,还可以将重新配对语法中每个符号的位数固定(例如,16位),可以被配置为避免对位打包语法数组进行解码。这可以允许将符号直接从语法数组加载到cpu寄存器中,而无需位偏移计算和位移位。这同样可以应用于从压缩字典中的压缩存储桶中加载符号。

图11a示出根据当前主题的一些实现方式的示例性向量化重新配对扩展算法1100。可以使用以下五个阶段来执行向量化算法1100:初始化1102、branch1(分支1)和branch2(分支2)1104、条件/谓词评估1106和结果输出1108。为了便于说明和讨论,在图11b中示出可以用于执行算法1100的示例性代码。示出了示例性expand16symbols函数的代码(例如,可以由能够执行英特尔高级向量扩展(inteladvancedvectorextensions)512指令的处理器执行)。

如图11a所示,在初始化1102期间,可以将标量版本的堆栈高度的16倍的堆栈进行零初始化。之所以执行此操作,是因为要扩展的16个符号中的每一个可能需要其自己的堆栈区域。堆栈高度可以固定为每个遍历10个。由于此示例函数的符号扩展限制为8个字符(即expand16symbols),因此堆栈高度可以为8,但是可以在堆栈底部添加两个其他元素,以允许从堆栈中读取和向堆栈写入,而不必检查可能已完成扩展的符号。对于所有元素,可以将堆栈位置初始化为两个。这样,堆栈位置1可以表示符号已完全扩展。一旦发生这种情况,则此符号的堆栈位置在后续迭代中不会改变。

在初始化之后,示例性向量化重新配对扩展处理1100可以被配置为出于加载符号的目的而分别执行branch1(分支1)1104a和branch2(分支2)1104b。特别地,分支11104a可以负责从语法数组中加载当前符号的子符号,并将正确的符号存储在堆栈中。分支21104b可以负责从堆栈中加载新的当前符号。可以同时对所有符号(例如,16个符号)执行加载。

一旦加载完成,则在1106,示例性向量化重新配对扩展算法1100可以被配置为执行谓词/条件评估。在1106,可以基于谓词的评估来组合如在1104处执行的符号加载的结果。

一旦完成谓词评估,就可以在1108将向量化算法1100配置为输出结果。特别地,可以对所得的单个扩展字符串进行处理以形成与所有16个符号的扩展相对应的单个连续字符串。

在一些实现方式中,向量化处理1100可以被配置为改善对压缩数据的访问时间。特别地,与使用现有的解压缩处理的系统相比,实现处理1100的上述extract和locate操作可以更快地执行2-2.7倍。

在一些实现方式中,当前主题(包括上面讨论的压缩和解压缩/访问处理)可以在各种存储器内数据库系统中实现,诸如德国sapse,walldorf开发的高性能分析设备(“hana”)系统。各种系统,诸如企业资源计划(“erp”)系统、供应链管理系统(“scm”)系统、供应商关系管理(“srm”)系统、客户关系管理(“crm”)系统等可以与存储器内系统交互,以访问数据。其他系统和/或系统的组合可以用于当前主题的实现。以下是示例性存储器内系统的讨论。

图12示出根据当前主题的一些实现方式的示例性系统1200,其中计算系统1202可以包括一个或多个可编程处理器,这些处理器可以被并置、经由一个或多个网络链接、等等,执行数据存储应用1204的一个或多个模块、软件组件等。数据存储应用1204可以包括数据库、企业资源程序、分布式存储系统(例如,可从sunnyvale,ca的netapp公司获得的netappfiler)等中的一个或多个。

计算系统1202的本地用户以及通过网络连接1210从一个或多个客户端机器1206访问计算系统1202的远程用户可以访问一个或多个模块、软件组件等。由一个或多个第一模块产生的用户界面屏幕可以经由本地显示器或经由与客户端机器1206之一相关联的显示器向用户显示。数据存储应用1204的数据单元可以被瞬时存储在持久层1212(例如,页面缓冲器或其他类型的临时持久层),可以将存储页面形式的数据写入一个或多个存储装置1214,例如,经由输入/输出组件1216。一个或多个存储装置1214可以包括一个或多个物理存储介质或设备(例如,硬盘驱动器、永久性闪存、随机存取存储器、光学介质、磁性介质等),被配置为写入数据以进行长期存储。应当注意,尽管存储装置1214和输入/输出组件1216在图12中被示为在计算系统1202的外部,但是它们可以被包括在计算系统1202中。

可以将存储在长期存储装置1214中的数据组织成页面,为每个页面分配了定义的存储空间量。在一些实现方式中,分配给每个页面的存储空间量可以是恒定的并且是固定的。然而,分配给每个页面的存储空间量可以变化的其他实现方式也在当前主题的范围之内。

图13示出根据当前主题的一些实现方式的示例性软件架构1300。可以以硬件和软件中的一个或多个来实现的数据存储应用1204可以包括数据库应用、网络连接的存储系统等中的一个或多个。根据当前主题的至少一些实现方式,这样的数据存储应用1204可以例如经由持久接口1302包括持久层1212或其他类型的存储器缓冲器或与持久层1212或其他类型的存储器缓冲器接口。持久层1212内的页面缓冲器1304可以存储一个或多个逻辑页面1306,并且可选地可以包括影子页面、活动页面等。可以经由输入/输出组件1216将保留在持久层1212中的逻辑页面1306写入存储装置(例如,长期存储装置等)1214,可以是软件模块、以一个或多个软件和硬件实现的子系统等。存储装置1214可以包括一个或多个数据卷1310,其中在物理存储器块处分配存储的页面1312。

在一些实现方式中,数据存储应用1204可以包括页面管理器1314和/或保存点管理器1316或与之通信。页面管理器1314可以在持久层1212与页面管理模块1320通信,页面管理模块1320可以包括空闲块管理器1322,监视页面状态信息1324,例如存储装置1214中的物理页面的状态以及持久层1212中(以及可选地在页面缓冲器1304中)的逻辑页面的状态。保存点管理器1316可以与持久层1212处的保存点协调器1326通信以处理保存点,这些保存点用于创建数据库的一致的持久状态以在可能的崩溃之后重新启动。

在数据存储应用1204的一些实现方式中,持久层1212的页面管理模块可以实现影子分页。页面管理模块1320内的空闲块管理器1322可以维护物理页面的状态。页面缓冲器1304可以包括如本文所讨论的那样操作的固定页面状态缓冲器。可以是页面管理模块1320的一部分或与页面管理模块1320通信的转换器组件1340可以负责写入存储装置1214的逻辑页面和物理页面之间的映射。转换器1340可以维护在转换器表1342中逻辑页面到对应物理页面的当前映射。转换器1340可以维护在一个或多个转换器表1342中逻辑页面1306到对应物理页面的当前映射。当从存储装置1214中读取逻辑页面1306时,要加载的存储页面可以使用转换器1340从一个或多个转换器表1342中查找。当在保存点之后第一次将逻辑页面写入存储装置1214时,将新的空闲物理页面分配给逻辑页面。空闲块管理器1322将新物理页面标记为“已使用”,并且新映射被存储在一个或多个转换器表1342中。

持久层1212可以确保在数据存储应用1204中进行的改变是可持续的,并且可以确保数据存储应用1204可以在重启之后恢复到最近的提交状态。向存储装置1214的写入数据不需要与写入事务的结束同步。这样,在写入事务完成时,未提交的更改可以写入磁盘,而提交的更改可能尚未写入磁盘。系统崩溃后,可以回滚尚未完成的事务所做的更改。在此处理中,不会丢失已提交事务引起的更改。还可以包括记录器组件1344,以将对数据存储应用的数据所做的更改存储在线性日志中。记录器组件1344可在恢复期间用于重放操作,因为最后一个保存点可确保所有操作都应用于数据,并确保在恢复处理结束时在回滚尚待处理的事务之前提交具有录入的“提交”记录的事务。

对于某些数据存储应用,将数据写入磁盘不一定与写入事务的结束同步。可能会发生以下情况:未提交的更改被写入磁盘,而与此同时,当写入事务完成时,提交的更改尚未写入磁盘。在系统崩溃之后,必须回滚尚未完成的事务所做的更改,并且提交事务所做的更改一定不能丢失。

为了确保提交的更改不会丢失,每当做出更改时,记录器组件1344都可以写入重做日志信息。当交易结束时,此信息可以被最晚写入磁盘。可以将日志条目持久保存在单独的日志卷中,而将常规数据写入数据卷中。使用重做日志,即使未将对应数据页面写入磁盘,也可以恢复已提交的更改。为了撤消未提交的更改,持久层1212可以使用撤消日志条目(来自一个或多个日志)和影子分页的组合。

持久接口1302可以处理存储(例如,存储器内存储等)的读取和写入请求。持久接口1302还可以提供用于在记录和不记录的情况下写入数据的写入方法。如果使用记录的写入操作,则持久接口1302调用记录器1344。此外,记录器1344提供允许存储(例如,存储器内存储等)直接将日志条目添加到日志队列中的接口。记录器接口还提供用于请求将存储器内日志队列中的日志条目刷新到磁盘的方法。

日志条目包含日志序列号、日志条目的类型和事务的标识符。根据操作类型,附加信息由记录器1344记录。例如,对于类型“更新”的条目,这将是受影响的记录的标识以及修改后的数据的余像。

当数据应用1204重启时,需要处理日志条目。为了加快此处理,并非总是从头开始处理重做日志。而是,如上所述,可以定期执行保存点,将自上次保存点以来所做的所有更改写入磁盘(例如,在存储器内等)。当启动系统时,仅需要处理在最后一个保存点之后创建的日志。在下一次备份操作之后,可以删除保存点位置之前的旧日志条目。

当记录器1344被调用用于写入日志条目时,它不会立即写入磁盘。而是,它可以将日志条目放入存储器中的日志队列中。当对应事务完成(提交或中止)时,日志队列中的条目可以最晚写入磁盘。为了确保提交的更改不会丢失,在将对应日志条目被刷新到磁盘之前,提交操作未成功完成。将日志队列条目写入磁盘也可以由其他事件触发,例如,当日志队列页面已满时或当执行保存点时。

使用当前主题,记录器1344可以以自然顺序(例如,先后顺序等)将数据库日志(或在本文中简称为“日志”)顺序地写入存储器缓冲器中。如果使用多个物理硬盘/存储设备存储日志数据,则可以定义多个日志分区。此后,记录器1344(如上所述,其作用是生成和组织日志数据)可以负载均衡所有可用日志分区上对日志缓冲器的写入。在某些情况下,负载均衡是根据循环分配方案进行的,在该方案中,各种写入操作以顺序和连续的方式定向到日志缓冲器。通过这种安排,写入多分区日志的特定分区的单个日志段的日志缓冲器不连续。然而,可以在恢复期间将所有分区的日志段中的日志缓冲器重新排序为正确的顺序。

如上所述,数据存储应用1204可以使用影子分页,使得保存点管理器1316可以写入事务上一致的保存点。通过这种安排,数据备份包括特定保存点中包含的所有数据页的副本,这是数据备份处理的第一步。当前主题还可以应用于其他类型的数据页存储装置。

在一些实现方式中,当前主题可以被配置为在系统1400中实现,如图14所示。系统1400可以包括处理器1410、存储器1420、存储设备1430和输入/输出设备1440。组件1410、1420、1430和1440中的每一个可以使用系统总线1450互连。处理器1410可以被配置为处理用于在系统1400内执行的指令。在一些实现方式中,处理器1410可以是单线程处理器。在可选实现方式中,处理器1410可以是多线程处理器。处理器1410还可以被配置为处理存储在存储器1420或存储设备1430中的指令,包括通过输入/输出设备1440接收或发送信息。存储器1420可以在系统1400内存储信息。存储器1420可以是计算机可读介质。在可选实现方式中,存储器1420可以是易失性存储器单元。在又一些实现方式中,存储器1420可以是非易失性存储器单元。存储设备1430可以能够为系统1400提供大容量存储。在一些实现方式中,存储设备1430可以是计算机可读介质。在可选实现方式中,存储设备1430可以是软盘设备、硬盘设备、光盘设备、磁带设备、非易失性固态存储器或任何其他类型的存储设备。输入/输出设备1440可以被配置为系统1400提供输入/输出操作。在一些实现方式中,输入/输出设备1440可以包括键盘和/或指示设备。在可选实现方式中,输入/输出设备1440可以包括用于显示图形用户界面的显示单元。

图15示出根据当前主题的一些实现方式的用于执行数据压缩的示例性处理1500。处理1500可以由图2a中所示的系统200执行,并且特别是使用数据存储应用204。在1502,数据存储应用204可以接收压缩数据(例如,字典字符串)的请求(例如,图2a所示的请求202),并且可以生成具有块大小和前端编码存储桶大小的压缩字符串字典。在1504,可以将前端编码应用于具有前端编码存储桶大小的字典中的字符串的一个或多个存储桶,以生成多个字符串的前端编码存储桶(例如,如图2a中的216所示)。在1506,可以将字符串的多个前端编码存储桶的一个或多个部分级联以形成具有块大小的一个或多个块。然后,在1508,可以压缩一个或多个块。在1510,可以将与字典中的每个字符串相对应的压缩块集合存储在持久层206中,如图2a所示,其中,压缩块集合可以将所有字符串存储在数据集中。

在一些实现方式中,当前主题可以包括以下可选特征中的一个或多个。在一些实现方式中,压缩块集合中的每个块可以包括存储桶头和压缩存储桶的序列。

在一些实现方式中,该方法还可以包括在字符串的多个前端编码存储桶中的字符串的存储桶之间插入终止符。终止符可以未压缩。

在一些实现方式中,每个字符串可以包括字符串终止符,其中每个字符串终止符被压缩。

在一些可选实现方式中,每个字符串的长度可以被存储并与该字符串一起压缩。

在一些实现方式中,块大小可以是以下至少之一:固定大小和可变大小。

在一些实现方式中,压缩可以包括独立地并行执行多个存储桶中的每个前端编码存储桶的压缩。

在一些实现方式中,一个或多个前端编码存储桶可以被配置为被采样以形成一个或多个超级块。每个超级块可以被配置为随后被压缩以生成用于压缩块的共享语法。例如,共享语法可以用于执行块的加速压缩。

在一些实现方式中,块的压缩可以包括重新配对压缩。

在一些实现方式中,方法1100还可以包括:接收访问存储压缩块集合中的数据的请求;响应于接收的请求,识别存储压缩块集合中的一个或多个压缩块;以及至少部分地解压缩识别的压缩块以生成未压缩数据。解压缩可以包括:使用前端编码对识别的压缩块内的字符串前缀和后缀进行解压缩;以及使用重新配对解压缩对识别的压缩块内的字符串后缀进行解压缩。此外,重新配对解压缩可以包括迭代扩展符号树中与存储在识别的压缩块中的数据相对应的每个符号。

图16示出根据当前主题的一些实现方式的用于执行数据解压缩的示例性处理1600。处理1600可以由图2a所示的系统200执行,并且特别是使用数据存储应用204。在1602,可以响应于访问存储压缩块集合中的数据的请求来识别存储压缩块集合中的一个或多个压缩块。在1604,可以使用前端编码对识别的压缩块内的字符串前缀进行解压缩。在1606,可以使用重新配对解压缩来对识别的压缩块内的字符串后缀进行解压缩。在1608,可以生成未压缩数据。

在一些实现方式中,当前主题可以包括以下可选特征中的一个或多个。在一些实现方式中,重新配对解压缩可以包括迭代扩展符号树中与存储在识别的压缩块中的数据相对应的每个符号。符号树可以包括多个节点。压缩块可以从字典中的一个或多个字符串的前端编码存储桶生成。前端编码存储桶可以被配置为被采样以形成一个或多个超级块。每个超级块可以被配置为被压缩以生成用于压缩块的压缩的共享语法。多个节点可以包括以下至少之一:末端字符、非末端字符及其任意组合。在一些实现方式中,该方法还可以包括并行执行多个重新配对解压缩。末端字符的数量可以被限制为预定数量。此外,可以基于预定数量来确定每个符号的迭代扩展次数。

在一些实现方式中,重新配对解压缩可以包括:初始化与符号树中的每个符号相对应的存储器中的堆栈位置,使用向量化重新配对扩展将符号树中的每个符号从存储装置同时加载到存储器中,通过评估与符号相关联的一个或多个谓词将加载的符号合并到未压缩数据中,以及使用预定数量重复同时加载和合并。

在一些实现方式中,压缩块集合中的每个块可以包括存储桶头和压缩存储桶的序列。块大小可以是以下至少之一:固定大小和可变大小。此外,可以使用重新配对压缩对压缩块进行压缩。

本文公开的系统和方法可以以各种形式来体现,包括例如数据处理器,诸如也包括数据库、数字电子电路、固件、软件或它们的组合的计算机。此外,可以在各种环境中实现本公开的实现的上述特征以及其他方面和原理。这样的环境和相关应用可以被特别地构造用于根据所公开的实现方式来执行各种处理和操作,或者它们可以包括通用计算机或计算平台,该通用计算机或计算平台被代码选择性地激活或重新配置以提供必要的功能。本文公开的处理并非固有地与任何特定计算机、网络、架构、环境或其他装置相关,并且可以通过硬件、软件和/或固件的适当组合来实现。例如,各种通用机器可以与根据所公开的实现的教导编写的程序一起使用,或者可以更加方便地构造专用装置或系统来执行所需的方法和技术。

本文公开的系统和方法可以被实现为计算机程序产品,即,有形地体现在信息载体(例如机器可读存储设备或传播的信号)中的计算机程序,以由数据处理设备(例如,可编程处理器或一个或多个计算机)执行或控制该操作。可以以任何形式的编程语言(包括编译或解释语言)编写计算机程序,并且可以以任何形式(包括作为独立程序或模块、组件、子例程或其他适合在计算环境中使用的单元)来部署计算机程序。可以将计算机程序部署为在一个站点上或分布在多个站点上并通过通信网络互连的一个或多个计算机上执行。

如本文所使用的,术语“用户”可以是指包括人或计算机的任何实体。

尽管在某些情况下诸如第一、第二等序数可以与顺序相关;但是本文档中使用的序号不一定表示顺序。例如,序数仅可用于区分一项与另一项。例如,为了将第一事件与第二事件区分开来,但不必暗示任何时间顺序或固定的参考系统(以使描述的一个段落中的第一事件可以与描述的另一段落中的第一事件不同)。

前面的描述旨在说明而非限制本发明的范围,本发明的范围由所附权利要求的范围限定。其他实现方式在所附权利要求的范围内。

这些计算机程序(也可以称为程序、软件、软件应用、应用、组件或代码)包括用于可编程处理器的机器指令,并且可以以高级过程和/或面向对象的编程语言和/或汇编/机器语言来实现。如本文所用,术语“机器可读介质”是指用于向可编程处理器提供机器指令和/或数据的任何计算机程序产品、装置和/或设备,例如磁盘、光盘、存储器和可编程逻辑设备(pld),包括接收机器指令作为机器可读信号的机器可读介质。术语“机器可读信号”是指用于向可编程处理器提供机器指令和/或数据的任何信号。机器可读介质可以非暂时性地存储这样的机器指令,例如非暂时性固态存储器或磁性硬盘驱动器或任何等效存储介质。机器可读介质可以可选地或另外地以暂时方式存储这种机器指令,例如处理器高速缓存或与一个或多个物理处理器核相关联的其他随机存取存储器。

为了提供与用户的交互,本文描述的主题可以在具有显示设备以及键盘和指示设备的计算机上实现,该显示设备例如是用于向用户显示信息的阴极射线管(crt)或液晶显示器(lcd)监视器,键盘和指示设备例如是鼠标或轨迹球,用户可以通过它们向计算机提供输入。其他种类的设备也可以用于提供与用户的交互。例如,提供给用户的反馈可以是任何形式的感觉反馈,例如视觉反馈、听觉反馈或触觉反馈等,并且可以以任何形式接收来自用户的输入,包括但不限于声音、语音或触觉输入。

本文描述的主题可以在计算系统中实现,该计算机系统包括:包括后端组件(诸如一个或多个数据服务器),或包括中间件组件(例如一个或多个应用服务器),或包括前端组件,诸如具有图形用户界面或web浏览器的一个或多个客户端计算机,用户可通过其与本文所述主题的实现进行交互,或此类后端组件、中间件或前端组件的任意组合。系统的组件可以通过任何形式或介质的数字数据通信(例如通信网络)互连。通信网络的示例包括但不限于局域网(lan)、广域网(wan)和互联网。

计算系统可以包括客户端和服务器。客户端和服务器通常但并非唯一地彼此远离,并且通常通过通信网络进行交互。客户端和服务器之间的关系是通过在各自计算机上运行并彼此具有客户端-服务器关系的计算机程序产生。

前述描述中阐述的实现方式并不代表与本文所述主题一致的所有实现方式。而是,它们仅是和与所描述的主题有关的方面一致的一些示例。尽管上面已经详细描述了一些变型,但是其他修改或添加是可能的。特别地,除了本文阐述的那些特征和/或变化之外,还可以提供其他特征和/或变化。例如,上述实现方式可以针对所公开特征的各种组合和子组合和/或以上所公开的若干其他特征的组合和子组合。另外,附图中描绘的和/或本文中描述的逻辑流程不一定需要按照所示的特定顺序或连续顺序来实现期望的结果。其他实现方式可以在所附权利要求的范围内。

当前第1页1 2 
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1