使用节点缓冲区搜索键值索引的制作方法

文档序号:28262736发布日期:2021-12-31 16:49阅读:75来源:国知局
使用节点缓冲区搜索键值索引的制作方法
使用节点缓冲区搜索键值索引


背景技术:

1.数据缩减技术可以用于减少存储系统中所存储的数据量。示例数据缩减技术包括重复数据删除。重复数据删除识别重复的数据单元,并且设法减少或消除存储系统中所存储的重复数据单元的实例数目。
附图说明
2.相对于以下附图描述一些实施方式。
3.图1a至1b是根据一些实施方式的示例系统的示意图。
4.图2是根据一些实施方式的示例键值索引的图示。
5.图3a至3b是根据一些实施方式的键值索引的示例节点的图示。
6.图4是根据一些实施方式的示例过程的图示。
7.图5是根据一些实施方式的示例过程的图示。
8.图6是根据一些实施方式的示例过程的图示。
9.图7是根据一些实施方式的示例过程的图示。
10.图8是根据一些实施方式的示例过程的图示。
11.图9是根据一些实施方式的示例过程的图示。
12.图10是根据一些实施方式的示例过程的图示。
13.图11是根据一些实施方式的存储指令的示例机器可读介质的图。
14.图12是根据一些实施方式的示例计算装置的示意图。
15.图13是根据一些实施方式的示例过程的图示。
16.图14是根据一些实施方式的存储指令的示例机器可读介质的示意图。
17.图15是根据一些实施方式的示例计算装置的示意图。
18.贯穿所有附图,相同的附图标记表示相似但不一定相同的元件。附图不一定按比例绘制,并且一些部分的大小可以被夸大以更清楚地说明所示的示例。此外,附图提供了与描述一致的示例和/或实施方式;然而,描述不限于附图中所提供的示例和/或实施方式。
具体实施方式
19.在本公开中,术语“一(a)”、“一个(an)”或“该(the)”的使用旨在还包括复数形式,除非上下文清楚地另有指示。同样,当在本公开中使用时,术语“包括(includes,including)”、“包含(comprises,comprising)”或“具有(have,having)”指定了所陈述元件的存在,但是不排除其他元件的存在或添加。
20.在一些示例中,存储系统使用索引来指示键与值之间的关系或映射(本文还称为“键值对”)。键值索引的一个示例使用是基于传入数据单元的“指纹”来执行重复数据删除的存储系统,其中每个指纹识别特定数据单元。将传入数据单元的指纹与指纹索引进行比较,该指纹索引可以是键值索引,其中指纹是键并且相应的数据位置是值。该指纹与指纹索引中所存储的指纹之间的匹配指示传入数据单元可能是已经存储在存储系统中的数据单
元的副本。如果传入数据单元是已经存储的数据单元的副本,则代替存储重复的传入数据单元,可以递增存储系统中所存储的参考计数以指示已经接收的数据单元的实例数目。
[0021]“指纹”是指通过对数据单元的内容应用函数而得到的值(其中“内容”可以包括数据单元的内容的全部或子集)。可以应用的函数的示例包括基于传入数据单元产生散列值的散列函数。散列函数的示例包括密码散列函数,诸如安全散列算法2(sha

2)散列函数,例如sha

224、sha

256、sha

384等。在其他示例中,可以采用其他类型的散列函数或其他类型的指纹函数。
[0022]“存储系统”可以包括存储装置或存储装置阵列。存储系统还可以包括管理存储装置的访问的存储控制器。“数据单元”可以指能够在存储系统中单独识别的任何数据部分。在一些情况下,数据单元可以指块(chunk)、块集合或任何其他数据部分。在一些示例中,存储系统可以将数据单元存储在持久性存储器(persistent storage)中。持久性存储器可以使用以下一者或多者实现:持久性(例如,非易失性)存储装置,诸如基于磁盘的存储装置(例如,硬盘驱动器(hdd));固态装置(ssd),诸如闪存装置;类似装置;或者其组合。
[0023]“控制器”可以指硬件处理电路,其可以包括微处理器、多核微处理器的核心、微控制器、可编程集成电路、可编程门阵列、数字信号处理器或另一种硬件处理电路中的任一者或某种组合。或者,“控制器”可以指硬件处理电路和能够在硬件处理电路上执行的机器可读指令(软件和/或固件)的组合。
[0024]
在一些示例中,键值索引可以呈包括以分层方式排列的节点的b树索引的形式。b树索引的叶节点包括将键映射到值的条目。例如,在去重系统中,b树索引的叶节点将指纹映射到存储位置指示符(例如,顺序块号(sequential block number))。b树索引的内部节点可以用于基于键来找到b树索引的匹配条目。然而,使用b树索引可能与各种问题相关联。例如,更新b树索引以包括新的键值对可能涉及将b树索引的整个叶节点从持久性存储器加载到内存(memory)中,处理叶节点以插入新的键值对,并且将整个叶节点重新写入到持久性存储器。此外,此类更新还可能涉及多个内部节点的类似加载、处理和重新写入以反映新键值对的位置。如此,每次索引更新可能消耗与持久性存储器的输入/输出操作相关联的大量内存、cpu和磁盘带宽开销。与索引更新相关联的开销量可以在本文中称为“写入放大”。
[0025]
根据本公开的一些实施方式,不是将键值索引存储在b树中,而是可以将键值索引存储为树结构,其中每个内部节点(本文称为“间接”节点)可以包括用于存储键值对的缓冲区(还称为“节点缓冲区”)。间接节点的缓冲区继续存储键值对,直到达到缓冲区的阈值水平,这可能导致所有存储的键值对被批量传送到子节点(即,在单次传送操作中)。在一些示例中,从源节点到子节点(例如,其他间接节点或叶节点)的键值对的批量传送可以减少内存与持久性存储器之间的传送和更新操作的数目,并且因此可以减少与键值索引相关联的写入放大。
[0026]
然而,从键值索引读取键值对数据可能涉及将每个节点的缓冲区加载到内存中并且在加载于内存中的缓冲区中搜索键。如此,读取每个键值对的数据也可能消耗大量内存和带宽(本文称为“读取放大”)。根据本公开的一些实施方式,键值索引的每个节点可以包括布隆过滤器和栅栏指针。在一些示例中,如果节点的布隆过滤器指示特定键存储在缓冲区中,则搜索节点的缓冲区以查找特定键。以此方式,布隆过滤器可以用于避免将缓冲区加载到内存中,并且从而可以减少与读取键值对相关联的读取放大。
[0027]
根据本公开的一些实施方式,节点的缓冲区可以被划分成片段或“缓冲块(buffer chunk)”。此外,在一些示例中,节点的每个栅栏指针可以指示相应缓冲块中所包括的键值的下限。在其他示例中,栅栏指针可以指示相应缓冲块中所包括的键值的上限。当布隆过滤器指示键值对存储在缓冲区中时,栅栏指针可以用于识别有可能存储键值对的特定缓冲块。代替将整个缓冲区加载到内存中,仅将所识别的缓冲块加载到内存中。以此方式,使用栅栏指针可以减少读取放大。
[0028]
根据本公开的一些实施方式,可以根据索引中的相应级别来确定索引的节点缓冲区的大小。在一些示例中,给定级别中的总缓冲区大小与下一较低级别(即,较靠近叶节点的一个级别)处的总缓冲区大小的比率被设置为预定义值。这个比率的值可以由用户设置以调整与索引相关联的写入放大的级别。
[0029]
根据本公开的一些实施方式,可以确定索引的各个级别处的布隆过滤器的大小以使得较高级别处(即,较靠近根节点)的节点中的布隆过滤器与比起较低级别处(即,较靠近叶节点)的那些布隆过滤器相对较低的误报率相关联。以此方式,可以优化与布隆过滤器相关联的内存使用。
[0030]
根据本公开的一些实施方式,每个间接节点的压缩可以作为后台进程运行,同时即使在压缩由达到缓冲区的阈值水平的缓冲区水平(即,存储在缓冲区中的数据量)触发之后也允许将额外条目添加到缓冲区。在缓冲区水平上升到高于阈值时,后台进程的优先级可以增加多倍。以此方式,对索引的更新可以继续而不会中断节点的使用。
[0031]
根据本公开的一些实施方式,响应于检测到多个顺序键值对加载到索引中,索引的操作可以临时改变为在处理顺序加载期间表现为b树。这种临时改变可以在顺序加载期间提供更有效的操作。
[0032]
1、包括具有节点缓冲区的键值索引的存储系统
[0033]
图1a示出了根据一些实施方式的包括存储控制器110和持久性存储器140的存储系统100的示例。如图所示,存储控制器110可以包括更新引擎120、合并引擎150、内存130和查询引擎160。在一些示例中,内存130可以包括更新缓冲区135,并且持久性存储器140可以包括键值索引145。在一些实施方式中,键值索引145可以包括被组织为节点树的键值数据。键值索引145的示例实施方式在下面参考图2进行描述。在一些示例中,持久性存储器140可以包括一个或多个非暂时性存储介质,诸如硬盘驱动器(hdd)、固态驱动器(ssd)、光盘等,或者其组合。内存130可以包括半导体存储器装置,诸如动态或静态随机存取存储器(dram或sram)、非易失性双列直插式存储器模块(nvdimm)等。
[0034]
在一些实施方式中,更新引擎120可以接收对持久性存储器140中的键值索引145的更新105。例如,每个更新105可以是待添加到键值索引145的键值对。在一些示例中,更新引擎120可以将更新105的全部或一部分存储在内存130中所存储的更新缓冲区135中。此外,合并引擎150可以用更新缓冲区135中所存储的键值对更新键值索引145。请注意,虽然图1中仅示出了一个更新缓冲区135,但在其他示例中,存储控制器110可以包括多个更新缓冲区135。在一些示例中,内存130可以用一个或多个易失性存储装置实现。
[0035]
在一些实施方式中,查询引擎160可以接收指定给定键的查询165,并且可以访问键值索引145(和在一些示例中的更新缓冲区135)或与之交互以确定与查询165中所指定的键匹配的值。此外,查询引擎160可以响应于查询165而返回匹配值。在一些示例中,查询165
可以是用户创建的查询(例如,sql查询、对数据元素的读取请求等)。
[0036]
如本文所使用的,“引擎”可以指硬件处理电路,其可以包括微处理器、多核微处理器的核心、微控制器、可编程集成电路、可编程门阵列、数字信号处理器或另一种硬件处理电路中的任一者或某种组合。或者,“引擎”可以指硬件处理电路和能够在硬件处理电路上执行的机器可读指令(存储在至少一个机器可读存储介质上的软件指令和/或固件指令)的组合。
[0037]
现在参考图1b,示出了用于重复数据删除的示例存储系统102。具有存储系统100(图1a示出)的相同附图标记的存储系统102的元件表示相似但不一定相同的元件。如图所示,在存储系统102中,存储控制器117可以包括去重引擎127,并且持久性存储器140可以包括指纹索引147。指纹索引147可以大体上对应于持久索引145(图1a示出)的示例实施方式。此外,数据单元107可以是与对向存储系统102写入数据的写入请求相关联的传入数据单元。在一些示例中,用于数据单元107的指纹索引更新(或等效地,“指纹索引条目”)可以包括用于数据单元107的指纹和/或相应存储位置指示符。在此类示例中,指纹索引147可以存储多个指纹和相应位置数据。
[0038]
在一些实施方式中,去重引擎127可以基于数据单元107来生成指纹。在一些示例中,由去重引擎127产生的指纹可以包括基于数据单元107的完整或部分散列值。在其他示例中,去重引擎127可以生成另一种类型的指纹。
[0039]
在一些实施方式中,去重引擎127可以基于指纹索引147来确定存储系统102是否实际包含传入数据单元107的副本。更具体地说,去重引擎127可以将针对数据单元107生成的指纹与指纹索引147中所存储的指纹进行比较。如果所生成的指纹与所存储的指纹匹配,则去重引擎127可以确定存储系统102已经存储了传入数据单元107的副本。结果,去重引擎127可以决定不存储传入数据单元107,而是可以更新共享匹配指纹的数据单元的数目的计数。另一方面,如果针对传入数据单元107计算出的指纹不匹配指纹索引147中的任何指纹,则去重引擎127可以确定存储系统100没有存储数据单元107的副本,并且作为响应,可以在存储系统102中新存储数据单元107。
[0040]
2、使用节点缓冲区的示例键值索引
[0041]
图2示出了根据一些实施方式的示例键值索引200的图示。在一些示例中,键值索引200可以大体上对应于键值索引145(图1a示出)和/或指纹索引147(图1b示出)的示例实施方式。此外,在一些示例中,键值索引200可以由存储控制器110(图1a示出)和/或存储控制器117(图1b示出)生成。在一些示例中,键值索引200可以将数据单元的指纹映射到那些数据单元的位置。在其他示例中,键值索引200可以是将容量或偏移量映射到生成标识符(例如,容量的快照的版本号)和存储位置标识符(例如,顺序块号)的组合的块索引(block index)。在另外其他示例中,键值索引200可以是将不同类型的块(block)映射到其磁盘位置(例如,将存储位置标识符映射到块的磁盘位置、将生成标识符和偏移量的组合映射到磁盘位置,等等)的磁盘索引以及其他信息(例如,完整指纹、块的压缩大小等)。在又一个示例中,键值索引200可以是将生成标识符和用户定义值的组合映射到块的块位置和压缩大小的组合的缓存索引。上述各项的其他组合或其变化也是可能的。
[0042]
如图2所示,键值索引200可以被排列成包括多个节点的树结构。该节点可以被组织成形成父子关系的各种级别。例如,第一级别210可以包括根节点211,并且第二级别220
可以包括作为根节点211的子节点的间接节点221至224。此外,第三级别230可以包括作为间接节点222(在第二级别220中)的子节点的间接节点231至234,并且第四级别240可以包括作为间接节点233(在第三级别230中)的子节点的叶节点241至244。在一些示例中,与每个父节点相关的子节点的数目可以由与键值索引200相关联的扇出参数来指定。
[0043]
在本文的示例中,键值索引的每个节点可以是叶节点或间接节点(即,除了叶节点以外的任何节点,包括根节点)。在一些实施方式中,键值索引200的每个间接节点(例如,根节点211、间接节点221至224、间接节点231至234)可以包括用于存储键值数据的缓冲区(本文还称为“节点缓冲区”,并且图2中未示出)。在一些示例中,键值索引200的每个叶节点可以存储键值数据。下面参考图3a描述包括节点缓冲区的间接节点的示例实施方式。
[0044]
在一些实施方式中,键值索引200的节点可以从树结构的顶部到底部以逐步方式生成。例如,在初始化键值索引200后(例如,在首次使用时),键值索引200可以仅包括根节点211。在这个示例中,添加到键值索引200的键值对可以存储在根节点211的节点缓冲区中。
[0045]
在一些实施方式中,当存储在根节点211的节点缓冲区中的键值数据达到阈值水平(例如,特定数目的存储键值对、总容量的特定百分比等等)时,可以触发压缩过程。如本文所使用的,“压缩”可以指将键值数据从父节点传送到一个或多个子节点。在一些示例中,根节点211在第一次被压缩时,可以生成间接节点221至224(即,根节点211的直接子节点)。此外,根节点211在每次被压缩时,存储在根节点211的节点缓冲区中的键值数据可以被传送到间接节点221至224的节点缓冲区。如本文所使用的,“传送”数据是指将数据移动到目的地节点,使得数据不再存在于源节点中。在一些示例中,间接节点221至224中的每一者可以与根节点211的节点缓冲区中的键范围的不同部分相关联。因此,在此类示例中,根节点211的每个键值对可以根据与每个子节点相关联的范围分配给子节点221至224中的不同者。一旦根节点211的压缩完成,根节点211的节点缓冲区便是空的,并且此后,在根节点211处接收的任何新的键值更新将被存储在根节点211的节点缓冲区中。
[0046]
在一些实施方式中,可以针对每个间接节点类似地重复上述压缩过程。例如,间接节点222在第一次被压缩时(即,当间接节点222的节点缓冲区达到阈值时),可以生成间接节点231至234(即,间接节点222的直接子节点),并且存储在间接节点222的节点缓冲区中的键值数据可以被传送到间接节点231至234的节点缓冲区。在另一个示例中,间接节点233在第一次被压缩时,可以生成叶节点241至244(即,间接节点233的直接子节点),并且存储在间接节点233的节点缓冲区中的键值数据可以被传送到叶节点241至244。
[0047]
在一些实施方式中,键值索引200可以将每个键和相应值存储为两个独立的存储元素。然而,实施方式不限于此。例如,在一些实施方式中,键可以由相应值在节点或存储元件内的偏移量或位置来暗示或指示。在此类实施方式中,“键值对”可以指与隐式键相关联的存储值。
[0048]
请注意,虽然为了清楚起见而未在图2中示出,但是其他间接节点可以在键值索引200的各种级别中具有子节点。例如,贯穿键值索引200,随时间推移,间接节点221可以在第三级别230中具有多个子节点,间接节点234可以在第四级别240中具有多个子节点,等等。
[0049]
3、键值索引的示例节点
[0050]
图3a示出了根据一些实施方式的示例间接节点300的图示。间接节点300可以大体
上对应于图2所示的任何间接节点(例如,根节点211、间接节点221至224和/或间接节点231至234)的示例实施方式。如图3a所示,间接节点300可以包括子指针310、栅栏指针320、布隆过滤器330和/或节点缓冲区340中的一些或全部。
[0051]
在一些实施方式中,节点缓冲区340可以包括多个用于存储键值数据(例如,数据单元的指纹和用于该数据单元107的相应存储位置指示符)的缓冲块345a至345n(本文还称为“缓冲块345”)。缓冲块345a至345n可以根据键依序排列(例如,以数字次序、以字母次序等等)。例如,缓冲块345a可以存储用于最低键范围的键值数据,而缓冲块345n可以存储用于最高键范围的键值数据。在一些示例中,每个缓冲块345可以具有相等或相似的大小(例如,32kb、64kb等)。在一些实施方式中,节点缓冲区340的大小可以基于级别比率来确定。在一些示例中,级别比率可以是键值索引的两个相邻级别中的总缓冲区大小之间的固定比率。此外,级别比率可以基于用户指定的参数来确定以调整与键值索引相关联的写入放大水平。
[0052]
在一些实施方式中,子指针310可以指向或以其他方式识别作为间接节点300的直接子节点的任何节点。例如,参考键值索引200(图2示出),根节点211可以包括相应的子指针310,其指向间接节点221至224(即,根节点211的直接子节点)中的每一者。在一些示例中,子指针310可以在第一次压缩间接节点300时(例如,当节点缓冲区340达到预定义阈值水平时)生成。
[0053]
在一些实施方式中,布隆过滤器330可以允许确定哪些键不包括在节点缓冲区340中以及哪些键可能包括在节点缓冲区340中(即,具有误报可能性)。换句话说,布隆过滤器330指示不包括在节点缓冲区340中的键,并且指示可能包括在节点缓冲区340中的键,其具有针对至少一些键提供误报指示(即,当一个键未包括在节点缓冲区340中时指示该键包括在节点缓冲区中)的可能性。因而,如果布隆过滤器330指示特定键不包括在节点缓冲区340中,则可以避免与将该节点缓冲区340加载到内存中并搜索以查找该特定键相关联的处理时间和/或带宽,因为布隆过滤器330的使用可以准确地指示何时该键不包括在节点缓冲区340中。相反,如果布隆过滤器330指示特定键包括在节点缓冲区340中,则可以接着搜索节点缓冲区340以查找该特定键。在一些实施方式中,布隆过滤器330的大小可以被确定为使得较高级别处的节点中的布隆过滤器330相对大于较低级别处的节点中的布隆过滤器330。
[0054]
在一些实施方式中,当搜索节点缓冲区340以查找特定键时,栅栏指针320可以用于识别有可能存储与特定键相关联的数据的特定缓冲块345。在一些示例中,栅栏指针320可以识别每个缓冲块345的最低和/或最高键值。例如,每个栅栏指针320可以识别相应缓冲块345中所包括的键值的下限。因此,栅栏指针320可以用于识别哪个缓冲块345包括所搜索的键落入的键范围。因而,代替将整个节点缓冲区340加载到内存中,只需要将所识别的缓冲块345加载到内存中。以此方式,栅栏指针320可以减少与间接节点300相关联的读取放大。
[0055]
在一些实施方式中,缓冲块345可以存储在一起或者存储在单独的数据块(data block)中。此外,缓冲块345可以与间接节点300的剩余元件(即,子指针310、栅栏指针320和/或布隆过滤器330)分开存储。在一些示例中,子指针310、栅栏指针320和布隆过滤器330可以在将任何缓冲块345加载到内存中之前加载到内存中。此外,如果布隆过滤器330指示所搜索的键包括在节点缓冲区340中,则栅栏指针320可以用于识别单个缓冲块345,并且接
着仅该识别出的缓冲块345被加载到内存中。
[0056]
图3b示出了根据一些实施方式的示例叶节点350的图示。叶节点350可以大体上对应于图2所示的任何叶节点(例如,叶节点241至244)的示例实施方式。如图3b所示,叶节点350可以包括键值数据360。
[0057]
4、键值索引中的压缩过程
[0058]
图4示出了根据一些实施方式的示例过程400。在一些示例中,过程400可以使用存储控制器110(图1a示出)或存储控制器117(图1b示出)中的一些或全部来执行。过程400可以用硬件或硬件与编程(例如,能够由处理器执行的机器可读指令)的组合实现。机器可读指令可以存储在非暂时性计算机可读介质(诸如光学、半导体或磁性存储装置)中。机器可读指令可以由单个处理器、多个处理器、单个处理引擎、多个处理引擎等来执行。为了说明起见,过程400的细节可以在下面参考图1a至3b进行描述,图1a至3b示出了根据一些实施方式的示例。然而,其他实施方式也是可能的。
[0059]
框410可以包括接收用于将键值对添加到索引的写入请求。例如,参考图1a,更新引擎120可以将更新105存储在更新缓冲区135中,并且合并引擎150可以用存储在更新缓冲区135中的键值对数据来更新键值索引145。在一些示例中,键值索引145可以被排列成包括多个节点的树结构。此外,在一些示例中,键值索引145可以将数据单元的指纹映射到那些数据单元的位置。
[0060]
框420可以包括将键值对存储在索引的间接节点的节点缓冲区中。假设在图4的示例中,间接节点比任何叶节点高一个以上级别。换句话说,在图4的示例中,存储键值对(在框420处)的间接节点的任何子节点也是间接节点。例如,参考图1a至3a,存储控制器110和/或合并引擎150可以将所接收的键值对存储在根节点211的节点缓冲区340中。在一些示例中,根节点211的布隆过滤器330可以被配置(例如,通过设置比特值)为指示所接收的键值对存储在根节点211的节点缓冲区340中。
[0061]
菱形430可以包括确定间接节点的节点缓冲区是否超过预定义阈值。如果确定节点缓冲区没有超过阈值,则过程400可以返回到框410(即,以接收另一个键值对)。例如,参考图1a至3a,存储控制器110可以确定根节点211的节点缓冲区340是否超过预定义填充水平(例如,90%满、100%满、给定数目的键值对等等)。
[0062]
然而,如果在菱形430处确定节点缓冲区超过阈值,则过程400可以在菱形440处继续,这可以包括确定间接节点是否具有任何现有的子间接节点。例如,参考图1a至3a,存储控制器110可以确定根节点211的节点缓冲区340已经被填充到预定义水平,并且作为响应,可以确定根节点211是否具有任何直接子节点(即,比根节点211低一个级别的任何子节点)。请注意,如图2所示,根节点211的直接子节点是间接节点而不是叶节点。
[0063]
如果在菱形440处确定间接节点不具有任何现有的子间接节点,则过程400可以在框450处继续,这可以包括基于级别比率来确定用于子间接节点的缓冲区大小。框460可以包括确定用于子间接节点的布隆过滤器大小。例如,参考图1a至3a,存储控制器110可以确定根节点211不具有任何子节点,并且作为响应,可以使用级别比率来确定用于根节点211的子节点的缓冲区大小。在一些示例中,级别比率可以是键值索引200的两个相邻级别中的总缓冲区大小之间的计算比率。因此,在此类示例中,间接节点221至224的总缓冲区大小可以不同于根节点211的节点缓冲区的大小。此外,每个间接节点221至224的节点缓冲区可以
不同于(例如,小于或大于)根节点211的节点缓冲区。此外,存储控制器110可以为根节点211的子节点确定布隆过滤器大小。在一些示例中,布隆过滤器大小可以基于与键值索引200的不同级别相关联的误报率来确定。
[0064]
框470可以包括使用所确定的缓冲区大小和布隆过滤器大小来初始化一组子节点。例如,参考图1a至3a,存储控制器110可以将间接节点221至224初始化为根节点211的直接子节点。此外,子节点221至224中的每一者可以包括特定缓冲区大小(在框450处确定)的节点缓冲区340和特定布隆过滤器大小(在框460处确定)的布隆过滤器330。
[0065]
在框470之后,或者如果在菱形440处确定间接节点具有现有子节点,则过程400可以在框480处继续,这可以包括将所有键值对从间接节点的节点缓冲区传送到子节点(在框470处初始化)的节点缓冲区。例如,参考图1a至3a,存储控制器110可以将所有键值对从根节点211的节点缓冲区传送到子节点221至224的节点缓冲区。在一些示例中,基于与子节点221至224相关联的不同键范围来将每个所转移的键值对分配给子节点221至224中的一者。
[0066]
框490可以包括设置子节点的布隆过滤器以指示所传送的键值对。例如,参考图1a至3a,存储控制器110可以设置子节点221的布隆过滤器330以指示从根节点211传送到子节点221的键值对。存储控制器110可以类似地设置剩余子节点222至224的布隆过滤器330。在框490之后,过程400可以返回到框410(即,继续接收用于将键值对添加到索引的写入请求)。请注意,可以针对键值索引200的不同间接节点(例如,针对间接节点221至224、231至234中的每一者)类似地重复过程400,并且还可以在相同的间接节点处重复过程400(例如,用于多次压缩)。
[0067]
在一些示例中,过程400可以允许生成具有可变大小的节点缓冲区和布隆过滤器的子间接节点。以此方式,过程400可以允许调整与索引的使用相关联的写入放大以及优化与布隆过滤器相关联的内存使用。请注意,如上所讨论的,在框410中存储键值对的间接节点比任何叶节点高一个以上级别。换句话说,在间接节点具有作为叶节点的直接子节点的情况下,不针对子叶节点执行框450至490的动作(例如,确定节点缓冲区大小、确定布隆过滤器、初始化节点缓冲区和布隆过滤器等)。
[0068]
5、使用布隆过滤器的读取过程
[0069]
图5示出了根据一些实施方式的示例过程500。在一些示例中,过程500可以使用存储控制器110(图1a示出)或存储控制器117(图1b示出)中的一些或全部来执行。过程500可以用硬件或硬件与编程(例如,能够由处理器执行的机器可读指令)的组合实现。机器可读指令可以存储在非暂时性计算机可读介质(诸如光学、半导体或磁性存储装置)中。机器可读指令可以由单个处理器、多个处理器、单个处理引擎、多个处理引擎等来执行。为了说明起见,过程500的细节可以在下面参考图1a至3b进行描述,图1a至3b示出了根据一些实施方式的示例。然而,其他实施方式也是可能的。
[0070]
框510可以包括接收对键值索引的间接节点处的键值对的读取请求。例如,参考图1a至2,查询引擎160可以接收指定键的查询165。响应于查询165,查询引擎160可以通过以自上而下的模式分析或读取键值索引145的节点来搜索查找该键。因而,查询引擎160可以在根节点211(即,键值索引200中的最高级别节点)处开始搜索查找键。
[0071]
菱形520可以包括确定间接节点的布隆过滤器是否指示键值对包括在间接节点的节点缓冲区中。例如,参考图1a至3a,存储控制器110可以确定根节点211的布隆过滤器330
是否指示根节点211的节点缓冲区340包括键值对。
[0072]
如果在菱形520处确定布隆过滤器指示键值对不包括在间接节点的节点缓冲区中,则过程500可以在框560(下文描述)处继续。否则,如果在菱形520处确定布隆过滤器指示键值对包括在间接节点的节点缓冲区中,则过程500可以在框530处继续,这可以包括使用栅栏指针来识别间接节点的缓冲块(即,节点缓冲区的一部分)。
[0073]
菱形540可以包括确定键值对是否包括在所识别的缓冲块中。例如,参考图1a至3a,存储控制器110可以使用根节点211的栅栏指针320来识别根节点211的对应于键值对的缓冲块345(例如,具有包含所需键的键范围的缓冲块)。存储控制器110可以接着将所识别的缓冲块345加载到内存中,并且可以搜索所识别的缓冲块345以查找键值对。
[0074]
如果在菱形550处确定键值对包括在所识别的缓冲块中,则过程500可以在框550处继续,这可以包括从所识别的缓冲块读取键值对。例如,参考图1a至3a,存储控制器110可以从根节点211的节点缓冲区340读取对应于特定键的值。
[0075]
然而,如果在菱形550处确定键值对不包括在所识别的缓冲块中(即,布隆过滤器在菱形520处返回了“误报”指示),则过程500可以在框560处继续,这可以包括使用间接节点的子指针来识别子节点(即,作为间接节点的直接子节点的节点)。框570可以包括搜索所识别的子节点以查找键值对。例如,参考图1a至3,响应于确定键没有存储在根节点211的节点缓冲区340中(即,在来自根节点211的布隆过滤器330的误报结果的情况下),存储控制器110可以使用根节点211的子指针310来识别作为根节点211的直接子节点(即,向下一个级别)的间接节点221至224。此外,在这个示例中,子指针310可以指示读取请求中所指定的键值对对应于间接节点222的键范围,并且因此,存储控制器110可以搜索间接节点222以查找键值对。如果在间接节点222中找到键值对,则存储控制器110可以读取键值对。在框550或框570之后,过程500可以完成。
[0076]
在一些示例中,过程500可以在每个间接节点中使用布隆过滤器以避免将节点缓冲区的任何缓冲块加载到内存中。以此方式,过程500可以减少与从索引读取键值对相关联的读取放大。请注意,可以针对节点树的不同级别重复和/或循环过程500。例如,如果在框560处识别的子节点是间接节点,则执行框570(即,搜索子节点以查找键值对)可以涉及执行过程500的另一次迭代,包括使用子节点的布隆过滤器来确定键值对是否包括在子节点中,使用子节点的栅栏指针来识别子节点的缓冲块,等等。
[0077]
6、在所调度压缩期间的更新过程
[0078]
图6示出了根据一些实施方式的示例过程600。在一些示例中,过程600可以使用存储控制器110(图1a示出)或存储控制器117(图1b示出)中的一些或全部来执行。过程600可以用硬件或硬件与编程(例如,能够由处理器执行的机器可读指令)的组合实现。机器可读指令可以存储在非暂时性计算机可读介质(诸如光学、半导体或磁性存储装置)中。机器可读指令可以由单个处理器、多个处理器、单个处理引擎、多个处理引擎等来执行。为了说明起见,过程600的细节可以在下面参考图1a至3b进行描述,图1a至3b示出了根据一些实施方式的示例。然而,其他实施方式也是可能的。
[0079]
框610可以包括向索引的间接节点的节点缓冲区添加键值对。例如,参考图1a至3a,存储控制器110可以向根节点211的节点缓冲区340添加键值对。
[0080]
框620可以包括响应于确定间接节点的节点缓冲区超过第一阈值,调度具有第一
优先级的间接节点的压缩用于后台执行。例如,参考图1a至3a,存储控制器110可以确定根节点211的节点缓冲区340已经被填充到第一阈值水平(例如,90%满、特定数目的键值对、特定量的已用内存等等)。响应于这个确定,存储控制器110可以调度根节点211的压缩。所调度的压缩可以在第一优先级(例如,相对低的优先级)下被调度为作为后台进程执行(例如,在没有用户交互的情况下运行,且/或仅在较高优先级任务不需要处理带宽时运行)。
[0081]
框630可以包括在等待压缩执行的同时继续向间接节点的节点缓冲区添加键值对。例如,参考图1a至3a,存储控制器110可以在等待所调度的压缩执行的同时继续向根节点211的节点缓冲区340添加键值对。因而,节点缓冲区340将被填充超过第一阈值水平。
[0082]
框640可以包括响应于确定间接节点的节点缓冲区超过额外阈值,增加所调度压缩的优先级。请注意,框640可以包括对应于达到多个阈值的多个优先级增加。例如,参考图1a至3a,在等待所调度的压缩执行的同时,存储控制器110可以确定根节点211的节点缓冲区340已经被填充到高于第一阈值水平的第二阈值水平,并且作为响应,可以将所调度压缩的优先级增加到高于第一优先级的第二优先级。随后,存储控制器110可以确定节点缓冲区340已经被填充到高于第二阈值水平的第三阈值水平,并且作为响应,可以将所调度压缩的优先级增加到高于第二优先级的第三优先级。存储控制器110可以基于节点缓冲区340达到相应的阈值水平来执行任意次数的优先级调整。
[0083]
框650可以包括作为后台进程执行间接节点的压缩。例如,参考图1a至3a,存储控制器110可以基于其当前优先级水平(例如,第一优先级水平、第二优先级水平等)来作为后台进程执行压缩。在一些示例中,框650可以包括上面参考图4讨论的过程400的一些或全部。在框650之后,过程600可以完成。
[0084]
在一些示例中,过程600可以允许每个间接节点的压缩作为后台进程运行,同时允许向间接节点的节点缓冲区加入额外条目。以此方式,对键值索引的更新可以继续而不会中断间接节点的使用。
[0085]
7、用于顺序写入加载的过程
[0086]
图7示出了根据一些实施方式的示例过程700。在一些示例中,过程700可以使用存储控制器110(图1a示出)或存储控制器117(图1b示出)中的一些或全部来执行。过程700可以用硬件或硬件与编程(例如,能够由处理器执行的机器可读指令)的组合实现。机器可读指令可以存储在非暂时性计算机可读介质(诸如光学、半导体或磁性存储装置)中。机器可读指令可以由单个处理器、多个处理器、单个处理引擎、多个处理引擎等来执行。为了说明起见,过程700的细节可以在下面参考图1a至3b进行描述,图1a至3b示出了根据一些实施方式的示例。然而,其他实施方式也是可能的。
[0087]
框710可以包括在处于第一操作模式时检测键值对到索引中的顺序加载,索引包括具有节点缓冲区的间接节点。例如,参考图1a至3a,存储控制器110可以检测对正在第一操作模式下使用的键值索引200的顺序键值对群组的写入。顺序群组可以包括多个键值对,其中键形成连续序列(例如,001、002、0003等等)。在一些示例中,键值索引200的第一操作模式可以大体上对应于上面参考图4讨论的过程400的一些或全部。例如,键值索引200的第一操作模式可以包括在每个间接节点的节点缓冲区中存储键值对,并且响应于确定节点缓冲区已经达到预定义阈值,将所存储的键值对传送到子节点。
[0088]
框720可以包括响应于检测到顺序加载,将索引改变为第二操作模式,其中第二操
作模式不使用间接节点中的节点缓冲区。例如,参考图1a至3a,存储控制器110可以响应于检测到顺序键值对群组的添加,将键值索引200改变为不使用间接节点300中的节点缓冲区340的第二操作模式。在一些示例中,键值索引200的第二操作模式可以大体上对应于b树索引的操作,其中键值映射数据仅存储在叶节点中,并且间接节点仅用于识别存储特定键值对的映射数据的叶节点。
[0089]
框730可以包括在处于第二操作模式时将顺序加载添加到索引。例如,参考图1a至3a,存储控制器110可以在不使用节点缓冲区340的第二操作模式下(例如,根据b树操作)将顺序群组添加到键值索引200,使得顺序群组中的每个键值对仅存储在索引200的叶节点中。在一些示例中,框730可以包括清除(flushing)间接节点的节点缓冲区中的匹配或重叠下至相应叶节点的顺序加载的任何键值对。在框730之后,过程700可以完成。
[0090]
在一些示例中,过程700可以允许在处理顺序加载期间临时改变索引以表现为b树索引。因而,过程700可以在将键值对顺序加载到索引中期间提供改进的效率。
[0091]
8、用于确定级别比率的过程
[0092]
图8示出了根据一些实施方式的示例过程800。在一些示例中,过程800可以使用存储控制器110(图1a示出)或存储控制器117(图1b示出)中的一些或全部来执行。过程800可以用硬件或硬件与编程(例如,能够由处理器执行的机器可读指令)的组合实现。机器可读指令可以存储在非暂时性计算机可读介质(诸如光学、半导体或磁性存储装置)中。机器可读指令可以由单个处理器、多个处理器、单个处理引擎、多个处理引擎等来执行。为了说明起见,过程800的细节可以在下面参考图1a至3b进行描述,图1a至3b示出了根据一些实施方式的示例。然而,其他实施方式也是可能的。
[0093]
框810可以包括确定存储系统中的可用内存。例如,参考图1a,存储控制器110可以确定可用于更新键值索引145的内存130的量。
[0094]
框820可以包括接收期望写入放大水平的指示。例如,参考图1a,存储控制器110可以接收用户输入或命令,该用户输入或命令指示用户对于更新键值索引145期望(或可接受)的写入放大水平。
[0095]
框830可以包括基于可用内存和期望写入放大水平来确定级别比率。在一些示例中,级别比率可以是键值索引的两个相邻级别中的总缓冲区大小之间的固定比率。例如,参考图2,假设第一级别210中的根节点211具有10mb的缓冲区大小并且级别比率是5,则第二级别220的节点中的节点缓冲区的总大小是50mb(即,比率5=50mb/10mb)。此外,第三级别230的节点中的节点缓冲区的总大小是250mb(即,比率5=250mb/50mb)。在一些示例中,存储控制器110可以使用以下等式来确定级别比率:
[0096][0097]
在以上等式中,项waf是写入放大水平,l是索引的级别数目(即,深度),r0是级别0处(即,根节点处)的缓冲区大小与单批用户更新的大小的比率,r
x
(其中x大于0且小于l)是级别x处的节点缓冲区的总大小(即,总和)与级别x

1处的节点缓冲区的总大小的比率,并且r
l
是叶节点(在最低级别l处)的总大小与级别l

1处的节点缓冲区的总大小的比率。在一些示例中,写入放大因子可以与索引的所有级别的级别比率的总和成比例。在框830之后,过程800可以完成。在一些示例中,可以基于可用内存的量来确定写入放大水平,并且接着
可以使用写入放大水平来确定级别比率。此外,在其他示例中,写入放大水平可以作为输入参数来接收(例如,由用户或配置设置指定),并且可以用于确定级别比率。在一些示例中,级别比率可以对于索引的不同级别而不同。在一些实施方式中,上述等式可以用于通过调整级别比率和/或为索引分配的内存来调整或调节与索引相关联的写入放大水平。此外,可以基于系统配置来修改或调整上述等式(例如,以包括额外或更少的参数)。其他变化和/或组合也是可能的。
[0098]
9、用于确定布隆过滤器大小的过程
[0099]
图9示出了根据一些实施方式的示例过程900。在一些示例中,过程900可以使用存储控制器110(图1a示出)或存储控制器117(图1b示出)中的一些或全部来执行。过程900可以用硬件或硬件与编程(例如,能够由处理器执行的机器可读指令)的组合实现。机器可读指令可以存储在非暂时性计算机可读介质(诸如光学、半导体或磁性存储装置)中。机器可读指令可以由单个处理器、多个处理器、单个处理引擎、多个处理引擎等来执行。为了说明起见,过程900的细节可以在下面参考图1a至3b进行描述,图1a至3b示出了根据一些实施方式的示例。然而,其他实施方式也是可能的。
[0100]
框910可以包括确定存储系统中的可用内存。例如,参考图1a,存储控制器110可以确定可用于使用键值索引145的内存130的量。
[0101]
框920可以包括接收键值索引的特定级别的误报率的指示。例如,参考图1a,存储控制器110可以接收指示用户对于读取键值索引145可接受的误报率(例如,2%、5%等)的用户输入或命令。在一些示例中,所接收的指示可以指定特定于键值索引的间接节点的特定级别(例如,对于图2所示的级别230)的误报率。
[0102]
框930可以包括确定键值索引的其他级别的误报率。在一些实施方式中,可以确定索引的误报率,使得索引的较高级别具有比索引的较低级别相对较小的误报率。此外,一个级别的误报率可以通过将另一个级别的误报率乘以恒定值来计算。例如,参考图1a至2,存储控制器110可以通过将最低级别的间接节点(例如,图2所示的级别230)的误报率f乘以恒定值v(例如,0.5)来确定第二低级别(the second

to

lowest level)的间接节点(例如,图2所示的级别220)的误报率f+1。此外,存储控制器110可以通过将第二低级别的间接节点(例如,图2所示的级别220)的误报率f+1乘以恒定值v来确定第三低级别(the third

to

lowest level)的间接节点(例如,图2所示的级别210)的误报率f+2。可以重复这个乘法过程以计算键值索引中的任何数目的级别的误报率。
[0103]
框940可以包括基于这些级别的可用内存和误报率来确定键值索引的多个级别的布隆过滤器大小。在一些实施方式中,每个布隆过滤器的大小(例如,布隆过滤器中使用的比特数)可以与索引中的相关联级别的误报率成反比关系增加。例如,布隆过滤器大小可以基于相关联级别的误报率根据预定义函数而变化(例如,布隆过滤器大小可以与该布隆过滤器的误报率的自然对数成反比)。例如,参考图1a至2,存储控制器110可以根据每个节点级别的误报率(在框930处确定)在键值索引中的各个布隆过滤器之间分配可用内存。在这个示例中,索引的较高级别可以被确定为具有相对较小的误报率,并且因此,较高级别处的每个单独内部节点中的布隆过滤器分配有比较低级别处的每个单独内部节点中的布隆过滤器大的每键值对的内存量(例如,比特数)。在框940之后,过程900可以完成。
[0104]
在一些实施方式中,可以使用以下等式来确定布隆过滤器大小:
[0105][0106]
在以上等式中,项m
bf
是布隆过滤器的内存需求,e是误报概率,c是可以存储在键值索引中的键值对的数目,并且r
i
是相应级别i的级别比率(上文参考用于写入放大水平的等式进行描述)。在一些示例中,布隆过滤器所需的内存可以与误报率的对数成反比,并且可以与索引的容量成比例。此外,布隆过滤器所需的内存可以与级别比率成反比,使得对于相对较高的级别,级别比率对内存需求的影响相对较低。在一些示例中,可以基于可接受的读取放大水平(例如,由用户输入的参数提供)来确定误报率。此外,如果有足够的内存可用,则针对给定节点创建节点缓冲区和布隆过滤器,而不考虑同一级别中的其他节点。
[0107]
10、键值索引中的压缩
[0108]
图10示出了根据一些实施方式的示例过程1000。在一些示例中,过程1000可以使用存储控制器110(图1a示出)或存储控制器117(图1b示出)中的一些或全部来执行。过程1000可以用硬件或硬件与编程(例如,能够由处理器执行的机器可读指令)的组合实现。机器可读指令可以存储在非暂时性计算机可读介质(诸如光学、半导体或磁性存储装置)中。机器可读指令可以由单个处理器、多个处理器、单个处理引擎、多个处理引擎等来执行。为了说明起见,过程1000的细节可以在下面参考图1a至3b进行描述,图1a至3b示出了根据一些实施方式的示例。然而,其他实施方式也是可能的。
[0109]
框1010可以包括接收用于向索引添加键值对的写入请求。例如,参考图1a,更新引擎120可以将更新105存储在更新缓冲区135中,并且合并引擎150可以用存储在更新缓冲区135中的键值对来更新键值索引145。
[0110]
框1020可以包括将键值对存储在索引的间接节点的节点缓冲区中。例如,参考图1a至3a,存储控制器110可以将所接收的键值对存储在根节点211的节点缓冲区340中。
[0111]
框1030可以包括确定间接节点的节点缓冲区是否超过阈值水平。框1040可以包括响应于确定间接节点的节点缓冲区超过阈值水平,将存储在间接节点的节点缓冲区中的键值对传送到多个子节点的节点缓冲区,其中多个子节点的每个节点缓冲区具有与间接节点的节点缓冲区不同的大小。例如,参考图1a至3a,存储控制器110可以将所有键值对从根节点211的节点缓冲区340传送到子节点221至224的节点缓冲区340。在一些示例中,基于与子节点221至224相关联的不同键范围来将每个所传送的键值对分配给子节点221至224中的一者。此外,在一些示例中,子节点221至224中的每一者的节点缓冲区340可以小于根节点211的节点缓冲区340。在框1030之后,过程1000可以完成。
[0112]
图11示出了根据一些实施方式的存储指令1110至1130的机器可读介质1100。指令1110至1130可以由单个处理器、多个处理器、单个处理引擎、多个处理引擎等来执行。机器可读介质1100可以是非暂时性存储介质,诸如光学、半导体或磁性存储介质。
[0113]
指令1110可以被执行以接收用于向索引添加键值对的写入请求。指令1120可以被执行以将键值对存储在索引的间接节点的节点缓冲区中。指令1130可以被执行以响应于确定间接节点的节点缓冲区超过阈值水平,将存储在间接节点的节点缓冲区中的键值对传送到多个子节点的节点缓冲区,其中多个子节点的每个节点缓冲区具有与间接节点的节点缓冲区不同的大小。
[0114]
图12示出了示例计算装置1200的示意图。在一些示例中,计算装置1200可以大体
上对应于存储系统100(图1a示出)。如图所示,计算装置1200可以包括硬件处理器1202和包括指令1210至1230的机器可读存储器1205。机器可读存储器1205可以是非暂时性介质。指令1210至1230可以由硬件处理器1202执行,或者由硬件处理器1202中所包括的处理引擎执行。
[0115]
指令1210可以被执行以接收用于向索引添加键值对的写入请求。指令1220可以被执行以将键值对存储在索引的间接节点的节点缓冲区中。指令1230可以被执行以响应于确定间接节点的节点缓冲区超过阈值水平,将存储在间接节点的节点缓冲区中的键值对传送到多个子节点的节点缓冲区,其中多个子节点的每个节点缓冲区具有与间接节点的节点缓冲区不同的大小。
[0116]
11、键值索引中的布隆过滤器
[0117]
图13示出了根据一些实施方式的示例过程1300。在一些示例中,过程1300可以使用存储控制器110(图1a示出)或存储控制器117(图1b示出)中的一些或全部来执行。过程1300可以用硬件或硬件与编程(例如,能够由处理器执行的机器可读指令)的组合实现。机器可读指令可以存储在非暂时性计算机可读介质(诸如光学、半导体或磁性存储装置)中。机器可读指令可以由单个处理器、多个处理器、单个处理引擎、多个处理引擎等来执行。为了说明起见,过程1300的细节可以在下面参考图1a至3b进行描述,图1a至3b示出了根据一些实施方式的示例。然而,其他实施方式也是可能的。
[0118]
框1310可以包括接收对索引中的键值对的读取请求,其中索引包括多个级别的多个间接节点,其中索引的每个间接节点包括节点缓冲区和布隆过滤器,并且其中布隆过滤器的大小根据预定义函数跨级别变化。例如,参考图1a至3,查询引擎160可以接收指定特定键的查询165。响应于查询165,查询引擎160可以通过以自上而下的模式分析或读取键值索引145的节点来搜索查找特定键。在一些示例中,键值索引145的每个间接节点可以包括节点缓冲区340和布隆过滤器330。不同级别的间接节点中的布隆过滤器330的大小可以基于与索引145的不同级别相关联的不同误报率。在一些示例中,索引145的较高级别具有比索引145的较低级别相对较小的误报率。此外,在一些示例中,布隆过滤器大小可以基于相关联级别的误报率根据预定义函数而变化(例如,布隆过滤器大小可以与该布隆过滤器的误报率的自然对数成反比)。
[0119]
框1320可以包括响应于对键值对的读取请求,确定间接节点的布隆过滤器是否指示间接节点的节点缓冲区包括键值对。例如,参考图1a至3a,存储控制器110可以确定根节点211的布隆过滤器330是否指示根节点211的节点缓冲区340包括键值对。
[0120]
框1330可以包括响应于确定间接节点的布隆过滤器指示间接节点的节点缓冲区包括键值对,搜索间接节点的节点缓冲区以查找键值对。例如,参考图1a至3a,存储控制器110可以确定根节点211的布隆过滤器330指示根节点211的节点缓冲区340包括键值对,并且作为响应,可以搜索节点缓冲区340以查找键值对。在框1330之后,过程1300可以完成。
[0121]
图14示出了根据一些实施方式的存储指令1410至1430的机器可读介质1400。指令1410至1430可以由单个处理器、多个处理器、单个处理引擎、多个处理引擎等来执行。机器可读介质1400可以是非暂时性存储介质,诸如光学、半导体或磁性存储介质。
[0122]
指令1410可以被执行以接收对索引中的键值对的读取请求,其中索引包括多个级别的多个间接节点,其中索引的每个间接节点包括节点缓冲区和布隆过滤器,并且其中布
隆过滤器的大小根据预定义函数跨级别变化。指令1420可以被执行以响应于对键值对的读取请求,确定间接节点的布隆过滤器是否指示间接节点的节点缓冲区包括键值对。指令1430可以被执行以响应于确定间接节点的布隆过滤器指示间接节点的节点缓冲区包括键值对,搜索间接节点的节点缓冲区以查找键值对。
[0123]
图15示出了示例计算装置1500的示意图。在一些示例中,计算装置1500可以大体上对应于存储系统100(图1a示出)。如图所示,计算装置1500可以包括硬件处理器1502和包括指令1510至1530的机器可读存储器1505。机器可读存储器1505可以是非暂时性介质。指令1510至1530可以由硬件处理器1502执行,或者由硬件处理器1502中所包括的处理引擎执行。
[0124]
指令1510可以被执行以接收对索引中的键值对的读取请求,其中索引包括多个级别的多个间接节点,其中索引的每个间接节点包括节点缓冲区和布隆过滤器,并且其中布隆过滤器的大小根据预定义函数跨级别变化。指令1520可以被执行以响应于对键值对的读取请求,确定间接节点的布隆过滤器是否指示间接节点的节点缓冲区包括键值对。指令1530可以被执行以响应于确定间接节点的布隆过滤器指示间接节点的节点缓冲区包括键值对,搜索间接节点的节点缓冲区以查找键值对。
[0125]
请注意,尽管图1a至15示出了各种示例,但是实施方式不限于此。例如,参考图1a,预期存储系统100可以包括额外的设备和/或部件、更少的部件、不同的部件、不同的布置等。在另一个示例中,预期更新引擎120和查询引擎160可以被组合成单个引擎或单元,或者可以包括在存储系统100的任何其他引擎或软件中。其他组合和/或变化也是可能的。
[0126]
数据和指令存储在相应存储装置中,存储装置被实现为一个或多个计算机可读或机器可读存储介质。存储介质包括不同形式的非暂时性存储器,包括半导体存储器装置,诸如动态或静态随机存取存储器(dram或sram)、可擦除和可编程只读存储器(eprom)、电可擦除和可编程只读存储器(eeprom)和快闪存储器;磁盘,诸如固定磁盘、软盘和可移动磁盘;其他磁性介质,包括磁带;光学介质,诸如压缩光盘(cd)或数字视频盘(dvd);或者其他类型的存储装置。
[0127]
请注意,上文讨论的指令可以在一个计算机可读或机器可读存储介质上提供,或者可以在分布于可能具有多个节点的大型系统中的多个计算机可读或机器可读存储介质上提供。此类计算机可读或机器可读存储介质被认为是物品(或制品)的一部分。物品或制品可以指任何制造的单个部件或多个部件。存储介质可以位于运行机器可读指令的机器中,或者位于可以经由网络下载机器可读指令以供执行的远程站点处。
[0128]
在前面的描述中,阐述了许多细节以提供对本文公开的主题的理解。然而,可以在没有这些细节中的一些细节的情况下实践实施方式。其他实施方式可以包括对上述细节的修改和变化。所附权利要求书旨在涵盖此类修改和变化。
当前第1页1 2 
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1