使用辅助存储器的低ram空间、高吞吐量的持久键值存储的制作方法

文档序号:6437256阅读:203来源:国知局
专利名称:使用辅助存储器的低ram空间、高吞吐量的持久键值存储的制作方法
技术领域
本发明涉及使用辅助存储器来实现低RAM空间、高吞吐量的持久键值存储的方法和系统。
背景技术
闪速介质具有优于RAM和硬盘存储的优点,S卩与RAM不同,闪速介质是持久的,并且与硬盘存储不同,闪速介质提供快得多的数据访问次数,例如,处于比硬盘访问快成百上千或成千上万的次数数量级。因此,许多应用程序可从闪速介质的使用中受益。然而,闪速介质是昂贵的,目前每千兆字节要比硬盘存储多花十至二十倍的费用。 而且,闪速设备会因为页面损耗而减少寿命,因此较小的随机写入(它也具有相对较高的等待时间)并不是合乎需要的。所需要的是使用提供较高性能的闪速介质(或其他非RAM、 非硬盘存储),同时兼顾成本考虑、效率和介质寿命的技术。已转让给本发明的受让人并通过引用结合在此的美国专利申请12/773859描述了具有这些所期望的特征的基于闪速或其他辅助存储的存储器高速缓存,以诸如用于存储键值对。然而,所使用的RAM的量处于对于辅助(例如,闪速)存储中维护的每一键值对用六个字节(两个签名字节加上四个指针字节)的数量级。在许多情形下,减少所使用的RAM 的量是合乎需要的。

发明内容
提供本发明内容以便以简化形式介绍将在以下的详细描述中进一步描述的一些代表性概念。本发明内容不旨在标识出所要求保护的主题的关键特征或必要特征,也不旨在以限制所要求保护的主题的范围的任何方式来使用。简言之,在此描述的主题的各个方面涉及使辅助存储设备(例如,闪存)包含经链接记录的桶(bucket)的技术,在该技术中,记录的桶是通过将该记录的键映射至基于RAM 的索引来确定的,基于RAM的索引具有与指向桶的指针相对应的槽。存在比槽/桶更多的可能键,结果使得冲突是通过以下方式来处理的按从最新近到最早的排序来搜索桶,直到找到匹配(如果任何匹配存在的话)为止。为了维护该排序,每一记录都与指向其桶中的在先记录的指针相关联,并以此类推,以形成记录链表。在新记录被插入辅助存储时,将基于RAM的索引中的在先指针与要插入的记录相关联(例如,作为包括该新记录的页面书写的一部分),并将该索引更新为指向该新记录,由此来维护该链表的排序。在一个方面,一计数器可与索引中的每一槽相关联,以指示在与这个槽相对应的桶中的记录链的大小。如果这个大小过大,则可执行压缩,以将桶中的多个非连续记录写入到各连续记录的单个页面中。在一个方面,一布隆过滤器可与每一槽相关联,以用较高的概率来指示记录的键是否在与这个槽相对应的桶中。如果为否,则不需要搜索桶来得到这个键。
在一替换例中,负载平衡机制可用来使各桶中的链大小平衡。例如,可通过多个映射函数来将要插入的键映射至多个候选槽,其中一个候选槽是基于各候选桶中的链大小来选择的。然后,将这个键插入到与所选的槽相对应的桶中。布隆过滤器可用来避免在稍后查看该记录时搜索两个候选桶。在一个替换例中,索引可包括第一索引组成部分和第二索引组成部分。第一索引中的各个槽可被配置来指示已通过第一映射函数而被映射至该第一索引中的这种槽的键将随后通过第二映射函数而被映射至第二索引中的槽。这有助于诸如在第一索引槽与过多键相对应时,将第一索引中的槽拆分成子槽。结合附图阅读以下详细描述,本发明的其他优点会变得显而易见。


作为示例而非限制,在附图中示出了本发明,附图中相同的附图标记指示相同或相似的元素,附图中图1是表示通过使用相对较小大小的RAM占用量来将各记录映射至辅助存储的示例性体系结构和数据结构的框图。图2是表示用于查找辅助存储中包括的记录键(例如,键值对)的示例性步骤的流程图。图3是表示用于将经键化的记录插入到辅助存储(作为各记录的页面的一部分) 中的示例性步骤的流程图。图4是使计数器保持与索引表的各指针相关联的数据结构的表示。图5是表示用于将记录链压缩在辅助存储中的单个页面上的示例性步骤的流程图。图6是表示示出了压缩和无用信息收集的示例性体系结构和数据结构的框图。图7是表示示出了负载平衡的示例性体系结构和数据结构的框图。图8是使布隆过滤器和计数器保持与索引表的指针相关联的数据结构的表示。图9是表示示出了将第一索引表中的索引槽拆分成第二索引表中的多个槽的示例性体系结构和数据结构的框图。图10示出可以将本发明的各方面并入其中的计算环境的说明性示例。
具体实施例方式在此描述的技术的各个方面一般涉及以仅使用与其他技术相比相对非常小大小的RAM占用量的方式,将辅助存储(例如,闪速介质存储)用于诸如存储键值对。为此,使各键值对通过它们的键而映射至顺序辅助存储中的(经链接的记录)的各桶,指针链使每一桶中的记录与该桶中的其他条目相关。由此,将各映射冲突放置到相同的桶中,该桶被搜索来找到匹配键。结果,不是在RAM中维护各指针,而是在辅助存储中维护这些指针中的许多。在一个实现中,这导致RAM占用量处于RAM中的每个键值对用一个字节(加上或减去半个字节)的数量级。应当理解,此处的任何示例都是非限制性的。实际上,在此描述的技术可应用于比盘访问更快的任何类型的非易失性存储中,而不限于所示的和作为示例引用在此的闪速介质。因此,如在此所使用地,“闪存”只是一个示例,它并不一定意味着常规的闪速介质,而一般指任何辅助存储(常规的RAM被认为是主存储)。而且,在此描述的数据结构只是示例; 实际上,对任何经键化的记录(并不一定是键值对)的存储都可从在此描述的技术中受益。 如此,本发明不限于此处所描述的任何特定实施例、方面、概念、结构、功能或示例。相反,这里所描述的任何一个实施例、方面、概念、结构、功能或示例都是非限制性的,且本发明可以按一般而言在计算和数据存储和检索方面提供好处和优点的各种方式来使用。图1示出使用相对非常快的RAM 102和非易失性辅助存储104(例如,与硬盘存储相比相对较快)来维护的键值存储的一个实现的示例性体系结构组件,该非易失性辅助存储104可用组织成页面的闪速介质来配置。在一个实现中,基本上将辅助存储104/闪存安排为顺序日志/文件。更具体地,闪存为经键化的记录(例如,键值对)提供持久存储,并且在一个实现中将闪存组织成循环附加日志。将各键值对写入以页面大小为单位的闪存中, 直至到达日志的尾部。当日志所累积的无用信息(如下所述,包括已删除的记录、经更新的记录和/或孤立记录的较早值)超过可配置阈值时,循环使用闪存上从日志头部开始的各页面,使得将从日志头部开始的有效条目写回日志的末端。以下还描述了将给定桶中的各记录压缩在闪存上的单个页面中,如以下所描述地,这可提高读取性能。如同在前面提到的第12/773859号美国专利申请中一般描述地,RAM 102包括写缓存器106,该写缓存器包括用于缓存各键值写入的(例如,固定大小的)数据结构,使得仅当存在足够的数据来填充闪存页面(其大小一般为2KB或4KB)后,才发生对闪存的写入。 如在此还描述地,写入还可在达到可配置超时间隔时发生。RAM 102还包括例示为索引表108的索引数据结构(目录),该索引表具有指向在辅助存储104上存储的键值对的指针(每一指针都是页面指针和页面偏移量的组合)。键映射机制/函数110(诸如,包括散列函数或范围映射函数)将键值对IU1-IUm中每一键都映射至索引表108中的N个槽中的一个(每一槽都与一桶相对应),其中N对于给定实现是可配置的,由此控制用于索引的RAM的量。换言之,散列函数或范围映射函数将任何键值映射至其多个槽中的一个槽,槽的数量取决于映射函数,并因此是可配置的。每一槽都包括指向辅助存储104中的一个或多个记录的链(链表)的指针。因此, 各记录包括形成链的指针字段。更具体地,除了键和值字段以外,辅助存储104中每一键值对记录还包括指向下一记录的指针(以其相应链中的次序),即将顺序日志中映射至同一槽的在先记录(键值对)作为新键值对。由每一槽所指向的闪存上的记录链因此包括索引表108中与这个槽相对应的各记录的桶。因此应该理解,通过用闪存中存储的各个链来进行线性链接可解决映射冲突。桶中的记录的平均数k一般是可配置的参数。更具体地,由于每一桶中的键值对的链通常是不连续地存储在闪存上的,因此可在在该存储中查找键时引起多个闪存读取。在查找次数和每键值对所用的RAM空间开销之间存在一折衷。桶中的平均键数k是可配置的参数,该参数允许控制在RAM空间使用和查找次数之间的折衷。作为进一步的解释,如在图2和3的流程图中分别概述地,在由客户应用程序来执行的键查找和插入操作中考虑以下访问序列。如图2中的步骤202所表示地,键查找(获取)操作首先在RAM写缓存器106中查找键。在未找到时(步骤204),操作转向步骤206 来在索引表108中查找键,以找到指向最新近写入到该桶中的记录在辅助存储104中的位置的指针。例如,查找键的操作使用散列映射或范围映射函数来确定给定键所属于的索引表槽,其中该槽中的指针标识这个键的桶在辅助存储中的起始地址。查找操作从存储在这个槽中的指针开始,跟随闪存上的记录链来搜索键,例如通过读取合适的页面并搜索这个页面来查找匹配键。如果这个页面不包括匹配键,则步骤 212重复使用在该地址处的键记录中的指针的过程;(注意,如果该指针指向新页面,则只需要读入新页面)。如由步骤214所表示地,当在链中找到了其键与搜索键相匹配的第一记录时,查找操作返回与这个键相关联的值;(如果不存在匹配键,则经由步骤216来返回空值)。这种查找的平均闪存读取数为2/k,且在最差情况下为桶链的大小k。如在图3中一般表示地,键插入(即,更新/设定)操作将键值对写入到RAM写缓存器106中(步骤30 。如由步骤304所表示地,当RAM写缓存器106中存在足够的键值对来填充闪存页面时(或者,在步骤306处,可配置超时间隔已由于客户调用而过期了诸如一毫秒的数量级时),将所缓存的条目写入到辅助存储104中。由此,在步骤308处,对于要写入到辅助存储104中的每一键值对,在步骤310处将之前在这个键槽中的指针也写入辅助存储104中,以例如作为页面中的 <似7八£111^,?11 >(<键、值、指针)>记录。在步骤312 处,将索引表槽中的指针改变为指向新写入的键值对的地址。注意,在构建页面时,保持排序,使得索引表指向最新近插入的记录,而该记录指向次新近插入的记录,并以此类推。简言之,对于给定键,插入操作使用映射函数来确定这个键所属于的索引表槽。例如,如果al表示这个链中的第一记录在闪存上的地址(即,槽中的指针当前所指向的地址),则在闪存中创建一记录,该记录与所插入的(即,更新后的)键值对相对应,且该记录的下一指针字段等于al。该记录附加到闪存上的日志中其自己的闪存地址a2处;并且将闪存上的该a2地址作为指针在RAM中的相应槽中的值来放置。实际上,该新写入的记录被插在与这个桶相对应的链的开始处。注意,如果插入操作与对较早插入的键进行的更新操作相对应,则将在查找操作期间(正确地)读取键的最新近值,因为通过跟随从最新近写入的记录一直链接到较早写入的记录的链可到达该最新近值。在到达较新近的一个键之前不会到达任何较早的键,因为较早的值在链的更下方;如以下将描述地,较早的键将作为日志中的无用信息而被清除。通过对键插入空值来支持对该键进行的删除操作。最终,闪存上的键的空条目以及任何较早插入的值都是所收集到的无用信息。在一个实现中,当闪存日志中的闪存使用和/或无用信息记录部分超过某一阈值时,启用无用信息收集(和压缩)操作,以回收闪存上的存储。转向维护操作(即压缩和无用信息收集),如将会理解地,压缩有助于通过在搜索桶时减少闪存读取数来改进查找等待时间。无用信息收集回收闪存上的存储,并且是以日志结构方式来使用闪存的结果。关于压缩,如前面所描述地,查找操作涉及跟随闪存上的桶中的键值记录链。对于桶中c个记录的链长度,这涉及c/2个闪存读取的平均数。随着时间流逝,由于将键插入到了桶中,并且更新了较早插入的键,因此这个桶的链长度会持续增大,从而降级了查找次数。可通过周期性地将闪存上的链压缩在一桶中来解决这种情况,这个桶一般将这个链中的各有效键(未被删除的或未用新值来更新的那些键)连续放置在附加到日志尾部的一个或多个闪存页面上。因此,如果可将m个键值对打包到单个闪存页面上(一般地说),则在k条记录的桶中搜索键所需的闪存读取数平均为kA2m),且在最差情况下最多为Dc/m]。注意,已压缩的键值对保持在其之前在闪存上的位置中,直到收集到无用信息为止;这些键值对被称为孤立键值对。为了确定是否要压缩经链接键值对的桶,可在与这个桶相对应的每一槽的索引表中维护一计数器(Ctr),而不是跟随每一链并计算其长度。在图4的索引表408中,这一般由与N个槽的指针Ptrl-PtrN相关联的计数器Ctrl-CtrN来表示(虽然可替换地利用关联该数据的其他安排)。一般而言,计数器可以是一个字节的长度,并且被增加到与未压缩记录的链大小相匹配,直至达到其上限。压缩操作可例如经由压缩机制660 (图6)在诸如图5所示的每个槽/桶所用的时间内前进,(该压缩机制可用以下描述的无用信息收集机制集成)。最初,因为各键值对在不同的时间被添加到桶中,因此这些键值对出现在不同的闪存页面上,并且在闪存上被个别地链接在一起。诸如由槽的计数器所跟踪地,当桶中累积了足够的有效记录来填充闪存页面(例如,如在步骤502处评估到有效记录中的m个)时,压缩这些记录并在诸如日志结尾处将其附加到新闪存页面上。为此,链中的各有效记录经由步骤504、506和510来找到, 并且在步骤508处将这些有效记录添加到RAM中的压缩缓存器606(图6)中。当缓存了这些记录后,将压缩缓存器606写入到闪存页面中,并在槽处更新索引以指向该页面(步骤 512)。链现在包括单个闪存页面大小并需要一个闪存读取(而不是大约为m个读取)来进行完全搜索。之后,如在图6中一般表示地,由于更多的记录661和662被附加到了桶中时,因此这些记录被逐个地链接在一起,并且这些记录在链中的压缩记录组之前,即在闪存页面 664(在图6中以阴影示出)之前被搜索。因此,一旦在任何给定时间对每一桶在闪存上的链进行了压缩以后,这个链可起始于一个或多个单独记录661、662的经链接序列,随后是各压缩记录组,其中每一压缩记录组出现在同一闪存页面上(例如,页面664)。随着时间流逝,可将足够的新记录累积在桶中,以允许将这些新记录压缩到第二闪存页面中,并且以此类推。为此,压缩过程重复,因此现在链包括两个压缩闪存页面,并且以此类推。因为插入操作可使压缩页面上的记录无效,因此之前压缩过的页面可被重新压缩。注意,当键值对大小相对较小时,例如为64字节,则桶中不存在足够的记录来填充闪存页面,因为参数k(大致)是该数目的上限。在这种情况下,通过将该过程一次应用于多个桶中的各链组,可以得到压缩的好处。因为压缩将各记录复制到了日志的尾部(或者可选地,复制到其他日志处),并相应地调整了指针,因此并不删除原始记录,但是不再存在指向这些原始记录的任何指针。这些不再被指向的记录被称为闪存日志中的孤立记录(一种无用信息)。如前面提到地,作为键更新和删除操作的结果,在日志中也累积其他无用信息记录,即存在无效记录。这些孤立的和无效的记录是所收集的无用信息。在一个实现中,无用信息收集操作先从日志的(当前)头部扫描键值对,然后跳过无用的(无效的或孤立的)键值对记录,并将有效的键值对记录从日志头部复制到日志尾部,这包括将指针调整为适合于该新的位置。一旦已复制了页面的有效记录,可在循环日志中稍后又需要时重新使用这个页面。可在达到下阈值(floor threshold)时停止无用信息收集,使得闪存使用和/或无用信息记录部分保留在闪存日志中。更具体地,当某一可配置的无用信息部分(根据所占用的空间)在日志中累积时, 执行清除操作来清除和压缩该日志。该清除操作以最早的第一次序来考虑当前使用的闪存页面,并重新分配这些页面。对每一页面扫描键值对的序列,以确定这些键值对是否是有效的。对闪存上的键值对记录的分类是通过查找从索引表开始的各个键来得到的(如果该记录与由该查找返回的记录相同,则该记录是有效的)。如果该记录在链中出现的要比这个键的有效记录晚,则该记录是无效的且对应于该键的过时版本;否则,该记录是孤立的,并且无法通过跟随来自索引表的指针来到达该记录(例如,这可因压缩过程而发生)。当在日志的头部遇到孤立记录时,可跳过该孤立记录,并使该日志的头部位置前进至下一记录。如前面所描述地,参考插入操作,每一桶链中的第一记录(由索引表槽指向的记录)都是最新近插入的记录,而链中的最后记录则是最早插入到桶中的记录。因此,在无用信息收集过程期间都会先遇到桶链中的最后记录,该最后记录可能是有效记录或无效记录(各个键的过时版本)。需要将有效记录重新插入在日志的尾部,而可将无效记录跳过。在两种情况下,都需要更新在链中其前导记录内的下一指针。为了避免在闪存上进行就地更新(随机写入), 需要在前进至链中的第一记录的整个行程上都对前导记录等进行重分配。在一种实现中,闪存上的整个桶链都是一次收集到的无用信息。当在无用信息收集期间在日志中遇到桶链中的最后记录时,将这个链中的所有有效记录进行压缩,并将其重分配到日志的尾部。换言之,当调用了无用信息收集器后,通过从日志的(当前)头部开始并跳过孤立记录来进行扫描,直到遇到第一有效或无效记录(它是某一桶链的一部分) 为止。然后,无用信息收集器收集该整个桶链,压缩该链中的有效记录,并将这些有效记录写入到日志尾部,然后返回。该无用信息收集策略提供了好处,因为将桶中的整个记录链写入到日志尾部还允许压缩这些记录以及将这些记录连续地放置在一个或多个闪存页面上,并且有助于加速对这些键的查找操作。另一好处在于由于无用信息(孤立)记录被创建在(当前)头部和尾部之间(对应于重分配前的链中的所有记录的位置)的日志的更下方,因此在随后遇到各个页面时可对该各个页面加速无用信息收集过程,因为孤立记录可被简单地丢弃。注意,在一个实现中,在多线程体系结构中,客户端键查找/插入操作、将键值对写入闪存和更新RAM索引的操作、以及对闪存页面返回空间的操作各自都由单独的线程来处理。转至一般在图7中表示的替换方面,可使用负载平衡来减少桶大小(其对应于链长度和关联的查找次数)的变化。另外,将键映射至桶可导致每一桶链中的键的数目的偏态分布,由此跨各桶的平均查找次数产生了变化。可使用跨各桶的键的负载平衡来使每一桶链都保持大致相同的大小。实现负载平衡的一个直接方式是使用已知量的(例如,两个)选项概念。例如, 通过使用散列表映射函数的负载平衡设计,可使用两个散列函数710A和710B来将每一键 (例如,图7中的112》散列化成两个候选散列表目录桶。可由负载平衡逻辑770来访问索引表708中的计数器,该计数器跟踪链的大小。选择具有较少数目的键的候选桶,以将记录插入附加到该桶中,并且增加其相应的槽计数器。在图7的示例中,用来自键映射函数710A 的实线(而非来自710B的虚线)来表示所选择的槽/桶。
以上描述的负载平衡替换例只会导致增加查找期间所需的闪存读取数。S卩,对于查找操作而言,可能需要在每一键的两个候选桶中搜索该键,由此使得闪存读取的平均数以及在最差情况下的数目(因此对应于查找次数)都翻倍。为了避免这种等待时间,如在图8中一般表示地,可向每一索引表槽都添加布隆过滤器,其中每个索引表槽都汇总了已被插入到相应桶中的各键,因此在查找期间只需搜索闪存上的一个桶链(这大多时候都有相对较高的概率)。一般而言,布隆过滤器包括一条目,该条目要么保证键不在链中,要么保证以较高的概率来指示键可能在链中;即,不存在错误的否定,虽然可能存在错误的肯定。注意,可基于所期望的特征来将每一槽中的布隆过滤器的大小设定为例如包含大约k个键,因为负载平衡确保在散列表达到其预算的全部容量时,每一桶将包括不远多于k 个的键(这具有非常高的概率)。将布隆过滤器的大小设定为每个键使用一个字节会导致百分之二的错误肯定概率;因此,每一槽中的布隆过滤器的大小可以是k个字节。较大的布隆过滤器可减少错误肯定率,但这是以存储器为代价的,反之亦然。而且,布隆过滤器的引入具有另一合乎需要的副效果,即查找不存在的键将(几乎经常)不需要任何闪存读取,因为键的两个候选槽中的布隆过滤器可能会在该键不存在时进行指示,并且在键实际上并不存在时很少会表明该键是存在的。这与不具有布隆过滤器相反,在不具有布隆过滤器时,查找不存在的键会导致涉及遍历相应桶中的整个链的闪存读取;(实际上,为了避免查找不存在的键,可在不进行负载平衡的情况下使用布隆过滤器,这包括使用或不使用计数器)。此外,尽管在使用双选项负载平衡时,在每一桶中都具有布隆过滤器可以减少查找次数,但布隆过滤器本身也可从负载平衡中受益。更具体地,负载平衡的目标是使每一桶中的键数保持为(大致)以参数k为上限。这有助于使这个桶中的布隆过滤器错误肯定概率保持为以经设定大小的k个键的容量为限。若没有负载平衡,则会将远多于k个的键插入给定桶中,从而使相应布隆过滤器的错误肯定率增加到超过所设定的大小。在图8中表示了向索引表中的每一槽所添加的附加字段,其中在一个实现中每个布隆过滤器(BF)用k个字节,每个链大小计数器(Ctr)用一个字节,且每个指针(Ptr)用四个字节。在查找操作期间,将一键映射至它的两个候选目录桶,且仅在相应的布隆过滤器指示该键可能在该桶中时,才搜索闪存上的链。因此,考虑布隆过滤器错误肯定,假设布隆过滤器是根据如上所述来设定大小的,则搜索闪存上的链的成功率不低于查找的百分之二。注意,当负载平衡和插入操作与更新较早插入的键相对应时,记录会被插入到与较早的记录相同的桶中,即使由负载平衡(从两个候选桶中)所确定的选项是另一个桶时也如此。否则,可将键插入到两个候选槽的布隆过滤器中,这可导致在查找期间遍历一个以上的闪存上的桶链。而且,当允许将不同版本的键插入到两个候选桶中时,在查找期间会引起关于版本决定的类似问题。这还会在无用信息收集操作期间导致效率问题,因为键的过时值出现在闪存上的同一桶链中。注意,在应用程序没有对较早插入的键执行更新时,可以避免覆盖插入桶的基于负载平衡的选项,但这种更新会发生在某些应用(诸如去除存储中的重复)中。可以容易地理解,在此处描述的实现中,所使用的RAM空间的量减少了。例如,考虑要在每一槽中闪存的指针是四个字节,这可提供至多4GB的字节可寻址日志。如果各记录具有固定大小,诸如六十四个字节,则这可提供至多256KB的可寻址日志,该可寻址日志的间隔大小为64字节。(可根据应用的需要而使用较大的指针大小。)因此,当平均的桶大小值为k = 10时,RAM空间开销仅为每一条目使用4/k = 0. 4字节=3. 2比特,该开销与键值大小无关。每次查找所用的闪存读取的平均数是k/2 = 5 ;在当前闪速介质在10毫秒的范围内实现各闪存读取次数时,该平均数与大约50毫秒的查找等待时间相对应。由此, 参数k提供了用于在低RAM空间使用和低查找等待时间之间实现折衷的机制。在具有布隆过滤器的实现中,每个桶所用的RAM空间开销具有三个组成部分,例如k个字节的过滤器、一个字节的链大小计数器和四个字节的指针。将每个槽所用的空间开销在(这个桶中的)k个键的平均数上分摊,其中每个条目所用的RAM空间开销是由 (k+1+4)/k= l+5/k来计算的,当k= 10时每个条目所用的RAM空间开销约为1.5个字节。 每次查找所用的闪存读取的平均数是k/2 = 5(这具有较高的概率)。而且,(与没有布隆过滤器的实现相比),在本实现中,由于跨各个桶对各键进行了负载平衡使得桶链具有大约相同的大小,因此不同的键在查找等待时间中的变化得到了更多的控制。转至另一替换例,图9示出了一实现,在该实现中,由第二映射函数992将第一索引表908中与辅助存储中的桶相对应的槽990映射至第二索引表909中与子桶相对应的子槽。一般来说,这种经由二级映射实现的拆分可在桶相对于其中的记录数而言变得过大时使用。作为示例,考虑第一映射函数是范围映射函数,该范围映射函数基于各键的范围 (例如,使用简单的号码)来将这些键映射至槽,具有在一和十之间的值的键定位到槽1,在十一和二十之间的键定位到槽2,并以此类推。如果与给定槽相关联的计数器超过了某一拆分值,则由第二映射函数来拆分槽/桶,例如在十一和十五之间的键定位到子槽995,同时在十六和二十之间的键定位到子槽996。第一索引表中的指针(或另一指示符)可用来判断对于给定的键,该指针直接指向了辅助存储桶,还是指示了需要使用第二映射函数来找到子槽中的子桶指针。注意,尽管以上例示的示例使用了将范围分成两半的基本划分,但可使用更复杂的函数。例如,可使用动态B++树负载平衡函数等来更平均地拆分桶,使得子槽/子桶的计数能确定如何划分各键,例如键十一到十三可在一个子桶中,且键十四到二十可在另一子桶中,这可根据需要来重新调整。而且,还可使用令每个主槽有两个以上的子槽/子桶。注意,以上拆分操作涉及改变指针,这相对较复杂。然而,上述压缩过程固有地调整指针,并由此可执行对每一子桶(例如,子范围)中的记录的压缩,以自动调整指针。范围映射的一个好处是位置。例如,来自同一网站或其它来源的键值对可具有在数值上彼此接近的键。对这些键的查找可在大约相同的时间发生。通过范围映射和压缩, 可减少闪存读取,因为在许多情况下,通常在大约相同的时间来查找的、数值上接近的键将在同一压缩页面上。示例性操作环境图10示出图1-9的示例可在其上实现的合适计算和联网环境1000的示例。l-9may be implemented.计算系统环境1000只是合适计算环境的一个示例,而非意在暗示对本发明使用范围或功能有任何限制。也不应该将计算环境1000解释为对示例性操作环境1000 中示出的任一组件或其组合有任何依赖性或要求。
本发明可用各种其他通用或专用计算系统环境或配置来操作。适用于本发明的公知计算系统、环境、和/或配置的示例包括但不限于个人计算机、服务器计算机、手持式或膝上型设备、平板设备、多处理器系统、基于微处理器的系统、机顶盒、可编程消费电子产品、网络PC、微型计算机、大型计算机、包括任何以上系统或设备的分布式计算环境等等。本发明可在诸如程序模块等由计算机执行的计算机可执行指令的通用上下文中描述。一般而言,程序模块包括执行特定任务或实现特定抽象数据类型的例程、程序、对象、 组件、数据结构等等。本发明也可以在其中任务由通过通信网络链接的远程处理设备执行的分布式计算环境中实现。在分布式计算环境中,程序模块可以位于包括存储器存储设备在内的本地和/或远程计算机存储介质中。参考图10,用于实现本发明的各方面的示例性系统可包括计算机1010形式的通用计算设备。计算机1010的组件可以包括但不限于处理单元1020、系统存储器1030和将包括系统存储器在内的各种系统组件耦合至处理单元1020的系统总线1021。系统总线 1021可以是若干类型的总线结构中的任一种,包括使用各种总线体系结构中的任一种的存储器总线或存储器控制器、外围总线,以及局部总线。作为示例而非限制,这样的体系结构包括工业标准体系结构(ISA)总线、微通道体系结构(MCA)总线、增强型ISA(EISA)总线、 视频电子标准协会(VESA)局部总线,以及也称为夹层总线的外围部件互连(PCI)总线。计算机1010通常包括各种计算机可读介质。计算机可读介质可以是能由计算机 1010访问的任何可用介质,并包含易失性和非易失性介质以及可移动和不可移动介质。作为示例而非限制,计算机可读介质可包括计算机存储介质和通信介质。计算机存储介质包括以存储诸如计算机可读的指令、数据结构、程序模块或其他数据之类的信息的任何方法或技术实现的易失性和非易失性、可移动和不可移动介质。计算机存储介质包括,但不仅限于,RAM、ROM、EEPR0M、闪存或其他存储器技术、CD-ROM、数字多功能盘(DVD)或其他光盘存储、磁带盒、磁带、磁盘存储或其他磁存储设备,或可以用来存储所需信息并可以被计算机 1010访问的任何其他介质。通信介质通常以诸如载波或其他传输机制的已调制数据信号来体现计算机可读指令、数据结构、程序模块或其他数据,并包括任意信息传送介质。术语“已调制数据信号”是指具有以在信号中编码信息的方式被设定或改变的一个或多个特征的信号。作为示例而非限制,通信介质包括诸如有线网络或直接线连接之类的有线介质,以及诸如声学、RF、红外及其他无线介质之类的无线介质。上面各项中的任何项的组合也包括在计算机可读介质的范围内。系统存储器1030包括易失性和/或非易失性存储器形式的计算机存储介质,如只读存储器(ROM) 1031和随机存取存储器(RAM) 1032。基本输入/输出系统1033 (BIOS) 包括如在启动时帮助在计算机1010内的元件之间传输信息的基本例程,它通常储存在ROM 1031中。RAM 1032通常包含处理单元1020可以立即访问和/或目前正在操作的数据和/ 或程序模块。作为示例而非限制,图10示出了操作系统1034、应用程序1035、其他程序模块1036和程序数据1037。计算机1010也可以包括其他可移动/不可移动、易失性/非易失性计算机存储介质。仅作为示例,图10示出了从不可移动、非易失性磁介质中读取或向其写入的硬盘驱动器1041,从可移动、非易失性磁盘1052中读取或向其写入的磁盘驱动器1051,以及从诸如CD ROM或其他光学介质等可移动、非易失性光盘1056中读取或向其写入的光盘驱动器1055。可在示例性操作环境中使用的其他可移动/不可移动、易失性/非易失性计算机存储介质包括但不限于,磁带盒、闪存卡、数字多功能盘、数字录像带、固态RAM、固态ROM等。 硬盘驱动器1041通常由诸如接口 1040的不可移动存储器接口连接至系统总线1021,并且磁盘驱动器1051和光盘驱动器1055通常由诸如接口 1050的可移动存储器接口连接至系统总线1021。以上描述并在图10中示出的驱动器及其相关联的计算机存储介质为计算机1010 提供了对计算机可读指令、数据结构、程序模块和其他数据的存储。例如,在图10中,硬盘驱动器1041被示为存储操作系统1044、应用程序1045、其他程序模块1046和程序数据 1047。注意,这些组件可以与操作系统1034、应用程序1035、其他程序模块1036和程序数据1037相同,也可以与它们不同。操作系统1044、应用程序1045、其他程序模块1046和程序数据1047在这里被标注了不同的附图标记是为了说明至少它们是不同的副本。用户可通过诸如平板或者电子数字化仪1064、话筒1063、键盘1062和定点设备1061(通常指的是鼠标、跟踪球或触摸垫)等输入设备向计算机1010输入命令和信息。图10中未示出的其他输入设备可以包括操纵杆、游戏手柄、圆盘式卫星天线、扫描仪等。这些和其他输入设备通常由耦合至系统总线的用户输入接口 1060连接至处理单元1020,但也可以由诸如并行端口、游戏端口或通用串行总线(USB)等其他接口和总线结构来进行连接。监视器1091或其他类型的显示设备也通过诸如视频接口 1090的接口连接至系统总线1021。监视器1091 也可以与触摸屏面板等集成。注意到监视器和/或触摸屏面板可以在物理上耦合至其中包括计算设备1010的外壳,诸如在平板型个人计算机中。此外,诸如计算设备1010等计算机还可以包括其他外围输出设备,诸如扬声器1095和打印机1096,它们可以通过输出外围接口 1094等连接。计算机1010可使用至诸如远程计算机1080之类的一个或多个远程计算机的逻辑连接在网络化环境中操作。远程计算机1080可以是个人计算机、服务器、路由器、网络PC、 对等设备或其他常见网络节点,并且通常包括许多或所有以上关于计算机1010所描述的元件,尽管在图10中仅示出了存储器存储设备1081。图10中所示的逻辑连接包括一个或多个局域网(LAN) 1071和一个或多个广域网(WAN) 1073,但也可以包括其他网络。这样的联网环境在办公室、企业范围计算机网络、内联网和因特网中是常见的。当在LAN联网环境中使用时,计算机1010通过网络接口或适配器1070连接至LAN 1071。当在WAN联网环境中使用时,计算机1010通常包括调制解调器1072或用于通过诸如因特网等WAN 1073建立通信的其他手段。可为内置或可为外置的调制解调器1072可以经由用户输入接口 1060或其他合适的机制连接至系统总线1021。诸如包括接口和天线的无线联网组件可通过诸如接入点或对等计算机等合适的设备耦合到WAN或LAN。在网络化环境中,相对于计算机1010所描述的程序模块或其部分可被存储在远程存储器存储设备中。作为示例而非限制,图10示出了远程应用程序1085驻留在存储器设备1081上。可以理解,所示的网络连接是示例性的,也可以使用在计算机之间建立通信链路的其他手段。辅助子系统1099(例如,用于内容的辅助显示)可经由用户接口 1060连接,从而即使计算机系统的主要部分处于低功率状态中,也允许诸如程序内容、系统状态和事件通知等数据被提供给用户。辅助子系统1099可连接至调制解调器1072和/或网络接口 1070, 从而在主处理单元1020处于低功率状态中时,也允许在这些系统之间进行通信。
结论尽管本发明易于作出各种修改和替换构造,但其某些说明性实施例在附图中示出并在上面被详细地描述。然而应当了解,这不旨在将本发明限于所公开的具体形式,而是相反地,旨在覆盖落入本发明的精神和范围之内的所有修改、替换构造和等效方案。
权利要求
1.一种计算环境中的系统,该系统包括维护在主存储(102)中的索引(108)以及映射机制(110),所述索引(108)用于索引辅助存储(104)中的数据,所述映射机制(110)用于将记录的键映射至基于该键的索引的槽,在所述映射机制(110)中存在比槽更多的可能键,所述索引中的每一槽都被配置来维护指向所述辅助存储(104)中的一个或多个记录的相应桶的指针,在所述辅助存储(104)中该槽的相应桶中的每一记录都具有映射至该槽的键。
2.如权利要求1所述的系统,其特征在于,还包括用于基于输入键来找到辅助存储中的记录的查找操作,所述查找操作被配置来确定所述输入键所映射至的槽;基于在该槽内维护的指针来访问所述辅助存储,以找到与该槽相对应的桶;以及搜索所述桶,以得到具有与所述输入键相匹配的键的记录。
3.如权利要求2所述的系统,其特征在于,所述桶包括链接在一起的多个记录,其中所述槽中的所述指针指向写入到所述桶的最后记录,且所述桶中的每一记录维护指向写入到所述桶的较早记录的指针,并且其中所述查找机制通过以下方式来搜索所述桶跟随从一个记录到另一记录的链接,直到找到具有与所述输入键相匹配的键的记录为止,或者直到找到没有至另一记录的链接的记录为止。
4.如权利要求1所述的系统,其特征在于,还包括用于基于所述记录的键来向所述辅助存储添加输入记录的插入操作,所述插入操作被配置来确定所述记录的键所映射至的槽;将维护在所述槽中的在先指针与要写入到辅助存储中的所述输入记录相关联;以及, 将所述在先指针改变成新指针,该新指针指向所述输入记录写入到所述辅助存储中的位置。
5.如权利要求1所述的系统,其特征在于,还包括压缩机制,该压缩机制将桶中的多个记录写入到所述辅助存储中的单个页面或其他存储单元中;或者,还包括负载平衡机制,该负载平衡机制用于平衡各个桶中的链大小;或者,还包括压缩机制和负载平衡机制两者,该压缩机制将桶的多个记录写入到所述辅助存储中的单个页面或其他存储单元中,该负载平衡机制用于平衡各个桶中的链大小。
6.如权利要求1所述的系统,其特征在于,还包括无用信息收集机制,所述无用信息收集机制将无效记录或者孤立记录或者无效记录和孤立记录两者从所述辅助存储处移除,其中所述无效记录包括已被覆写或删除的记录,且所述孤立记录包括已被压缩的记录;或者还包括与每一槽相关联的布隆过滤器,所述布隆过滤器以高概率来指示记录的键是否在与该槽相对应的桶中;或者还包括无用信息收集机制和布隆过滤器两者。
7.一种在计算环境中、至少部分地在至少一个处理器上执行的方法,包括在主存储(102)中维护索引(108),该索引(108)具有指向辅助存储(104)中的各个桶的指针,其中所述辅助存储以日志结构的方式来维护,且新数据被附加到所述日志的末端, 每一桶包括一个或多个记录,在存在任何在先记录时,桶中的每一记录与该桶中的在先记录相链接;通过以下方式来将输入记录插入(308)到所述辅助存储中将该记录的键映射至所述各个桶中的一个桶;将维护在该桶的索引中的在先指针与所述输入记录相关联,以将所述输入记录链接至所述在先记录;以及,将所述在先指针改变成新指针,该新指针指向所述输入记录写入到所述辅助存储中的位置;以及通过以下方式来查找(206)记录将所述记录的键映射至所述各个桶中的一个桶;基于与该桶相关联的指针来访问(208)所述辅助存储;以及,搜索该桶,以得到具有与所述输入键相匹配的键的记录。
8.如权利要求7所述的方法,其特征在于,还包括通过以下方式来压缩桶将来自该桶的各记录的数据写入到压缩缓存器中;以及将所述压缩缓存器写入到所述辅助存储中的连续存储器位置中。
9.如权利要求7所述的方法,其特征在于,所述索引包括第一索引组成部分以及零个或多个第二索引组成部分,并且其中将所述键映射至所述各个桶中的一个桶包括经由第一映射机制来将所述键映射至所述第一索引组成部分中的槽,该槽包括指针,所述指针指示所述指针指向记录还是指向第二索引组成部分,其中在所述指针指向记录时,映射至该槽的多个记录形成所述辅助存储上的链,而在所述指针指向第二索引组成部分时,应用第二映射机制来将所述键映射至在所述第二索引组成部分中的第二槽,其中映射至所述第二索引组成部分中的槽的多个记录形成所述辅助存储上的链。
10.如权利要求7所述的方法,其特征在于,一计数器与每一槽相关联,其中每一槽的计数器指示在与该槽相对应的桶中的记录链的大小,其中在所述第一索引组成部分中的槽指向记录,并且所述方法还包括每当与该槽相关联的桶中的记录链的大小超过某一阈值时,创建附加的第二索引组成部分,其中在所述第一索引组成部分的槽中的指针指向该新创建的第二索引组成部分,并且与所述第一索引组成部分中的槽的桶相关联的记录是通过所创建的第二索引组成部分来重新映射的;以及,形成记录的多个子槽。
全文摘要
本发明涉及使用辅助存储器的低RAM空间、高吞吐量的持久键值存储。所描述地是使用闪存(或其他辅助存储)、基于RAM的数据结构和机制,仅用低的RAM空间占用量来访问存储在该闪存中的键值对。映射(例如,散列)函数将键值对映射至基于RAM的索引中的槽。槽包括指向闪存上各记录的桶的指针,这些记录各自都具有映射至该槽的键。例如用从最新近写入记录到最早写入记录的各指针来将各记录的桶安排成经线性链接的链表。还描述了将桶中的非连续记录压缩在单个闪存页面上,以及无用信息收集。另外描述了可减少桶大小的变化的负载平衡,该负载平衡使用每槽一个布隆过滤器来避免不必要的搜索,并且描述了将槽拆分成子槽。
文档编号G06F12/02GK102436420SQ20111034051
公开日2012年5月2日 申请日期2011年10月20日 优先权日2010年10月20日
发明者B·K·德布纳斯, J·李, S·森古普塔 申请人:微软公司
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1