文件合并方法和装置与流程

文档序号:15020032发布日期:2018-07-25 00:29阅读:131来源:国知局

本发明涉及数据存储技术领域,特别是涉及存储在外部存储器中的文件的合并方法和装置。



背景技术:

纵观当今数据库的存储引擎,其底层的数据结构要么是B树或其变种B+树,要么则是LSM树。前者具有较好的读友好性,而后者具有较好的写友好性。尽管这两样东西看似鱼和熊掌不可兼得,但在贪婪的互联网世界里,却渴求能有兼容读、写皆友好的数据存储方案的出现。虽然LevelDB中采用的数据结构似乎也结合了LSM和B树,但始终不够彻底,首先在严格意义上它并非一颗B树,而只是简单的多叉树;其二,其Key(键)和Value(值)存放在一起,不利于索引的优化,这种优化在做数据合并时尤显重要。

具体来说,LevelDB中存储在磁盘中的文件分为多个层级,不同层级有很多文件(SSTable文件),为了降低冗余度,提高可读性,需要对SSTable文件进行合并,由于SSTable文件中的键和对应的值是存储在一起的,因此在合并LevelDB文件时,需要取出所有的键值对一一处理,以构建新的文件,合并过程较为复杂,在提高可读性的同时会降低写性能。

由此,需要一种读、写皆友好的文件合并方案。



技术实现要素:

本发明的主要目的在于提供一种数据读、写皆友好的文件合并方法和装置。

根据本发明的一个方面,提供了一种文件合并方法,文件存储在外部存储器中,包括文件头、数据块以及索引块,文件头用于记录文件的元数据信息,数据块用于存放值,索引块用于以B+树的形式存放值对应的键,其中,所有键及其对应的值在数据块中的逻辑地址均分别记录于B+树中的叶子节点中,该方法包括:在第一文件之后追加写入追加数据块,其中写入第二文件的数据块中的值;在追加数据块之后追加写入新索引块,新索引块是基于第一文件的索引块和第二文件的索引块生成的,第一文件的索引块和第二文件的索引块中的全部有效键及其对应的值在第一文件的数据块和追加数据块中的逻辑地址均分别记录于新B+树中的叶子节点中;在新索引块之后追加写入新文件头,以记录合并后的新文件的元数据信息。

本发明述及的文件的键和值分开存储,键以B+树的形式进行存储。由此在将两个文件进行合并时,可以保持一个文件不动,将另一个文件的值直接追加写入即可,提高了写性能。并且合并后的索引块为新的B+树,根据新的索引块可以方便地读取合并后的文件中的值,合并后的文件的读性能也不会受到影响。

优选地,元数据信息可以包括以下一项或多项:

索引块中键的数量;

索引块中键的范围;

B+树的高度;

B+树中第一个叶子节点的逻辑地址;

B+树中内部节点的个数。

由此,在根据请求键读取对应的目标值时,可以根据文件的文件头中的元数据信息判断请求键是否在该文件的键的范围内,判定为是的情况下,再在该文件的索引块中查找,可以减少不必要的查找。

优选地,构成B+树的所有节点在物理上连续存储。

由此,可以利用磁盘的局部性预加载特点,在物理上连续存储B+树,使得在重建索引块的过程中通过简单的遍历连续的磁盘块就可以获取需要合并的文件的索引块。

优选地,该文件合并方法还可以包括:根据新文件头更新第一文件的文件头,以用新文件头中的元数据信息替换第一文件的文件头中的元数据信息。

由于追加写入是一种破坏性写入,由此本发明通过设置双文件头可以避免合并过程中异常情况发生对文件造成的破坏。

优选地,文件包括位于文件头部的前文件头和位于文件尾部的后文件头,前文件头和后文件头的内容相同,根据新文件头更新第一文件的前文件头,作为新文件的前文件头,而以新文件头作为新文件的后文件头。

由此,合并正常完成时,新文件的前文件头和后文件头都能得到正常更新,都可以用来查看新文件中的元数据信息。

优选地,该文件合并方法还可以包括:在新文件头中写入新文件的元数据信息的步骤出错的情况下,根据第一文件的文件头将新文件还原为合并前的第一文件;以及/或者在更新第一文件的文件头的步骤出错的情况下,根据新文件头重新更新第一文件的文件头。

由此,在写入新文件头的过程中出错时,由于第一文件的文件头尚未得到更新,因此可以根据第一文件的文件头将合并过程中的文件还原为合并前的第一文件,在更新第一文件的文件头的过程中出错时,则可以根据新文件头重新更新。

优选地,该文件合并方法还可以包括括执行以下步骤以从目标文件中读取请求键所对应的目标值:获取目标文件的文件头和索引块;根据文件头判断请求键是否在文件头所指示的键的范围内;在判定请求键在范围内的情况下,基于索引块的B+树结构,在索引块中查找对应于请求键的叶子节点;根据所查找到的叶子节点所存储的键所对应的值在目标文件中的数据块中的逻辑地址读取目标值。

根据本发明的另一个方面,还提供了一种文件合并装置,文件存储在外部存储器中,包括文件头、数据块以及索引块,文件头用于记录文件的元数据信息,数据块用于存放值,索引块用于以B+树的形式存放值对应的键,其中,所有键及其对应的值在数据块中的逻辑地址均分别记录于B+树中的叶子节点中,该装置包括:第一写入单元,用于在第一文件之后写入追加数据块,其中写入第二文件的数据块中的值;B树生成单元,用于基于第一文件的索引块和第二文件的索引块生成新B+树,第一文件的索引块和第二文件的索引块中的全部有效键及其对应的值在第一文件的数据块和追加数据块中的逻辑地址均分别记录于新B+树中的叶子节点中;第二写入单元,用于在追加数据块之后追加写入新索引块,其中写入新B+树;第三写入单元,用于在新索引块之后追加写入新文件头,以记录合并后的新文件的元数据信息。

优选地,元数据信息可以包括以下一项或多项:

索引块中键的数量;

索引块中键的范围;

B+树的高度;

B+树中第一个叶子节点的逻辑地址;

B+树中内部节点的个数。

优选地,该文件合并装置还可以包括:更新单元,用于根据新文件头更新第一文件的文件头,以用新文件头中的元数据信息替换第一文件的文件头中的元数据信息。

优选地,文件包括位于文件头部的前文件头和位于文件尾部的后文件头,前文件头和后文件头的内容相同,更新单元根据新文件头更新第一文件的前文件头,作为新文件的前文件头,而以新文件头作为新文件的后文件头。

优选地,该文件合并装置还可以包括:第一还原单元,用于在新文件头中写入新文件的元数据信息的步骤出错的情况下,根据第一文件的文件头将新文件还原为合并前的第一文件;以及/或者第二还原单元,用于在更新第一文件的文件头的步骤出错的情况下,根据新文件头重新更新第一文件的文件头。

优选地,该文件合并装置还可以包括读取单元,用于从目标文件中读取请求键所对应的目标值,其中,读取单元可以包括:获取模块,获取目标文件的文件头和索引块;判断模块,根据文件头判断请求键是否在文件头所指示的键的范围内;查找模块,在判定请求键在范围内的情况下,基于索引块的B+树结构,在索引块中查找对应于请求键的叶子节点;读值模块,根据所查找到的叶子节点所存储的键所对应的值在目标文件中的数据块中的逻辑地址读取目标值。

本发明的文件合并方法和装置中述及的文件的键和值是分开存储的,其中键是以B+树的形式进行存储的,由此在将两个文件合并时,可以保持一个文件不动,将另一个文件的值直接追加写入前一个文件,提高了写性能,并且重新构造以B+树形式存储键的索引块,根据新的索引块可以方便地读取合并后的文件中的值,合并后的文件的读性能也不会受到影响。

附图说明

通过结合附图对本公开示例性实施方式进行更详细的描述,本公开的上述以及其它目的、特征和优势将变得更加明显,其中,在本公开示例性实施方式中,相同的参考标号通常代表相同部件。

图1、图3是示出了本发明的文件合并方案中涉及的文件的数据结构示意图。

图2是示出了本发明的索引块的B+树结构示意图。

图4是示出了根据本发明一实施例的文件合并方法的示意性流程图。

图5、图6示出了基于本发明的文件合并状态示意图。

图7示出了在目标文件中读取数据的方法的示意性流程图。

图8是示出了根据本发明一实施例的文件合并装置的功能框图。

图9是示出了读取单元还可以具有功能模块的结构示意图。

具体实施方式

下面将参照附图更详细地描述本公开的优选实施方式。虽然附图中显示了本公开的优选实施方式,然而应该理解,可以以各种形式实现本公开而不应被这里阐述的实施方式所限制。相反,提供这些实施方式是为了使本公开更加透彻和完整,并且能够将本公开的范围完整地传达给本领域的技术人员。

本发明主要提出了一种对存储在硬盘、软盘、光盘、U盘等外部存储器中的文件进行合并的方案。本发明的文件合并方法和装置中述及的文件的键和值是分开存储的,其中键是以B+树的形式进行存储的,由此在将两个文件合并时,可以保持一个文件不动,将另一个文件的值直接追加写入前一个文件,提高了写性能,并且重新构造以B+树形式存储键的索引块,根据新的索引块可以方便地读取合并后的文件中的值,合并后的文件的读性能也不会受到影响。在详细描述本发明的文件合并方案前,首先就本发明的文件合并方案中的文件的数据结构进行说明。

图1是示出了本发明的文件合并方案中的文件的数据结构的示意图。如图1所示,本发明述及的文件在物理上可以按块分为文件头、数据块以及索引块,每个区块可以由多个页组成。其中,本文述及的页是一次I/O的最小单位,一般是系统页的整数倍,不同类型块的页的大小可以不一样。

数据块用于存放值(Value)。索引块用于以B+树的形式存放值所对应的键(Key),如图2所示,B+树由叶子节点、内部节点以及根节点构成,此处关于B+树的形式为本领域技术人员所公知,这里不再赘述。需要说明的是,B+树中每个叶子节点对应一个键,所有键及其对应的值在数据块中的逻辑地址均分别记录于B+树中的叶子节点中。即B+树的叶子节点中只存放键,而没有存放值,取而代之可以存放值所在数据块中页的偏移量及值在页内的偏移量。

优选地,构成B+树的所有节点(根节点、内部节点、叶子节点)在物理上连续存储,由此可以利用磁盘的局部性预加载特点,快速获取B+树中的全部节点,可以提高合并过程中构建新B+树的效率(合并过程将在下文详细说明)。

文件头用于记录文件的元数据信息。其中,元数据信息可以包括索引块中键的数量、索引块中键的范围、B+树的高度、B+树中第一个叶子节点的逻辑地址以及B+树中内部节点的个数等等。

至此,结合图1简要说明了本发明的文件合并方案中文件的数据结构。其中,图1所示的文件的数据结构仅是一种示例,应该知道,其还可以具有多种变形形式。例如图3所示,文件的文件头可以包括前文件头和后文件头,前文件头和后文件头记录的文件的元数据信息可以相同。再例如,本发明述及的文件还可以包括过滤器(Filter),过滤器可以用于确定访问的键是否在文件中,例如过滤器可以是布隆过滤器,对于访问到不存在的key,可以通过布隆过滤器快速判断key是不存在的,而不用再去B+树里面查询。因为布隆过滤器实际上是一个哈希表,可以在O(1)的复杂度内判断key存在与否,而B+树的查找时间复杂度是O(logn),所以设置布隆过滤器可以提高查找效率,即可以提升读性能。

下面结合图4至图9详细说明本发明的文件合并方案。图4是示出了根据本发明一实施例的文件合并方法的示意性流程图。该方法可以将两个或更多个文件进行合并,为了便于描述,这里以将第一文件和第二文件进行合并为例进行说明。

参见图4,在步骤S210,在第一文件之后追加写入追加数据块,其中写入第二文件的数据块中的值。

此处第二文件的新鲜度可以大于第一文件,即第二文件可以是在后存储在外部存储器中的,第一文件可以是在先存储在外部存储器中的。

由于本发明述及的文件中的值和键是分开存储的,因此在将第一文件和第二文件合并时,可以在第一文件之后追加写入第二文件的数据块中的值,这里可以在第一文件之后追加写入值的块称为追加数据块。也就是说可以在第一文件之后的追加数据块中重新写入第二文件的数据块中的值,从而物理上文件F的结尾和追加数据块的地址连续。

在第一文件之后追加写入第二文件的数据块中的值后,就可以建立新的索引信息,即步骤S220,在追加数据块之后追加写入新索引块。

此处新索引块是基于第一文件的索引块和第二文件的索引块生成的。如上文所述,第二文件的新鲜度可以大于第一文件,因此第二文件中的键值有可能是对第一文件中的键值的修改、删除、替换等,因此对于第一文件和第二文件的索引块中存在的相同的键,可以选取新鲜度较高的第二文件中的键作为有效键,摒弃第一文件中的键,以此构建新索引块。

也就是说,生成的新索引块中的键均为有效键,其对应的值均为有效值。其中新索引块中的键也是以B+树的形式存储的,该B+树是根据第一文件的索引块和第二文件的索引块重新生成的,因此可以称为新B+树。第一文件的索引块和第二文件的索引块中的全部有效键及其对应的值在第一文件的数据块和所述追加数据块中的逻辑地址均分别记录于新B+树中的叶子节点中。

正如上文所述,第一文件的索引块和第二文件的索引块中的B+树的所有节点在物理上是连续存储的,因此在重新构建新B+树的过程中,可以利用磁盘的局部性预加载特点,通过简单的遍历连续的磁盘块就可以获取第一文件的索引块和第二文件的索引块,从而可以提高新B+树的构造效率。

在构造新B+树以生成新索引块后,第一文件中的索引块被无效,由新索引块代替。其中,这里述及的无效是指在后续查找过程中,使用新索引块进行查找,而不再使用旧的索引块。即在生成新索引块后,可以不删除旧索引块。

在步骤S230,在新索引块之后追加写入新文件头,以记录合并后的新文件的元数据信息。

新文件的元数据信息可以包括新索引块中键的数量、新索引块中键的范围、新B+树的高度、新B+树中第一个叶子节点的逻辑地址以及新B+树中内部节点的个数等等。在生成新文件头后,可以删除第二文件,释放存储空间。

图5是示出了根据本发明一实施例的将G文件合并到F文件的合并过程的示意图。

根据图5以及上文结合图3的描述可知,在合并过程中,F文件不变,仅需把G文件中的值追加写入F文件,并生成新的索引块和新文件头即可。与现有LevelDB中合并时需要一一取出键值对重新构造相比,合并过程较为简单,并且根据合并后的B+树可以方便地查找文件中的键所对应的值,读性能也得到了提升。

图6是示出了根据本发明另一实施例的将G文件合并到F文件的合并过程的示意图。

与图5不同的是,图6中的F文件和G文件都包括位于文件头部的前文件头和位于文件尾部的后文件头。其中,前文件头和后文件头的内容相同。

与上文述及的合并过程不同的是,在追加写入新文件头后,还可以根据新文件头更新F文件的前文件头,作为新文件的前文件头,而以新文件头作为新文件的后文件头。

由此在文件合并过程中,可以维护两个文件头。这是因为,合并过程中的追加写入是一种“破坏性写入”,即在将G文件合并到F文件时,会破坏F文件。其中,这里述及的破坏性写入是指将G文件合并到F文件,合并后的新文件的新文件头记录的是合并后的新文件的元数据信息,合并前的F文件的文件头被无效,因此如果没有采用防护措施,一旦合并过程失败,F文件将无法被修复。因此本发明采用维护双文件头的方式,可以解决因异常情况导致文件被破坏而无法恢复的问题。

具体来说,合并正常完成时,新文件的首尾两个文件头都能得到正常更新,且是一样的。在出现异常情况需要恢复时,随便以那个文件头为准都没问题。

如果在还没写完末尾的新文件头时,发生异常。由于此时首部的文件头并尚未得到更新,还是完好的,只不过是旧的而已。通过该文件头,可将上次合并未完成的残余信息截断,得到一个旧版的完整的文件。

如果在更新前文件头时,发生异常。由于此时新文件头已经是完整的了,恢复时,只要以新文件头为准即可。即可以用新文件头重新更新前文件头,以保障两个文件头在初始状态时的完整性和一致性。

图7是示出了从文件中读取请求键所对应的目标值的方法的示意性流程图。

参见图7,在步骤S310,获取目标文件的文件头和索引块。

在步骤S320,根据文件头判断请求键是否在文件头所指示的键的范围内,不在的话,表明目标文件中不存在请求键所对应的值,读取结束。

在判定请求键在范围内的情况下,执行步骤S330,基于索引块的B+树结构,在索引块中查找对应于请求键的叶子节点。在索引块中查找不到与请求键对应的叶子节点的情况下,表明目标文件中不存在请求键所对应的值,读取结束。在查找到的情况下,可以执行步骤S340,根据所查找到的叶子节点所存储的键所对应的值在目标文件中的数据块中的逻辑地址读取目标值。

图8是示出了根据本发明一实施例的文件合并装置的功能框图。其中,文件合并装置500的功能模块可以由实现本发明原理的硬件、软件或硬件和软件的结合来实现。本领域技术人员可以理解的是,图7所描述的功能模块可以组合起来或者划分成子模块,从而实现上述发明的原理。因此,本文的描述可以支持对本文描述的功能模块的任何可能的组合、或者划分、或者更进一步的限定。

图8所示的文件合并装置500可以用来实现图3至图6所示的检测方法,下面仅就文件合并装置500可以具有的功能模块以及各功能模块可以执行的操作做简要说明,对于其中涉及的细节部分可以参见上文结合图3至图6的描述,这里不再赘述。

如图8所示,文件合并装置500包括第一写入单元510、B树生成单元520、第二写入单元530以及第三写入单元540。

第一写入单元510用于在第一文件之后写入追加数据块,其中写入第二文件的数据块中的值。

B树生成单元520用于基于第一文件的索引块和第二文件的索引块生成新B+树,第一文件的索引块和第二文件的索引块中的全部键以及每个键所对应的值在第一文件的数据块和追加数据块中的逻辑地址均分别记录于新B+树中的叶子节点中;

第二写入单元530用于在追加数据块之后追加写入新索引块,其中写入新B+树。

第三写入单元540用于在新索引块之后追加写入新文件头,以记录合并后的新文件的元数据信息。

如图8所示,文件合并装置500还可以可选地包括更新单元550。更新单元550能够根据新文件头更新第一文件的文件头,以用新文件头中的元数据信息替换第一文件的文件头中的元数据信息。

具体地,文件可以包括位于文件头部的前文件头和位于文件尾部的后文件头,前文件头和后文件头的内容相同。更新单元550可以根据新文件头更新第一文件的前文件头,作为新文件的前文件头,而以新文件头作为新文件的后文件头。

如图8所示,文件合并装置500还可以可选地包括第一还原单元560和第二还原单元570。

第一还原单元560可以在新文件头中写入新文件的元数据信息的步骤出错的情况下,根据第一文件的文件头将新文件还原为合并前的第一文件。

第二还原单元570可以在更新第一文件的文件头的步骤出错的情况下,根据新文件头重新更新第一文件的文件头。

如图8所示,文件合并装置500还可以可选地包括读取单元580.读取单元580能够从目标文件中读取请求键所对应的目标值。图8是示出了读取单元可以具有的功能模块的功能框图。

如图9所示,读取单元580可以包括获取模块581、判断模块583、查找模块585以及读值模块587。

获取模块581可以获取目标文件的文件头和索引块,判断模块583可以根据文件头判断请求键是否在文件头所指示的键的范围内。在判定请求键在范围内的情况下,查找模块585可以基于索引块的B+树结构,在索引块中查找对应于请求键的叶子节点。读值模块587可以根据所查找到的叶子节点所存储的键所对应的值在目标文件中的数据块中的逻辑地址读取目标值。

上文中已经参考附图详细描述了根据本发明的文件合并方法和装置。

此外,根据本发明的方法还可以实现为一种计算机程序,该计算机程序包括用于执行本发明的上述方法中限定的上述各步骤的计算机程序代码指令。或者,根据本发明的方法还可以实现为一种计算机程序产品,该计算机程序产品包括计算机可读介质,在该计算机可读介质上存储有用于执行本发明的上述方法中限定的上述功能的计算机程序。本领域技术人员还将明白的是,结合这里的公开所描述的各种示例性逻辑块、模块、电路和算法步骤可以被实现为电子硬件、计算机软件或两者的组合。

附图中的流程图和框图显示了根据本发明的多个实施例的系统和方法的可能实现的体系架构、功能和操作。在这点上,流程图或框图中的每个方框可以代表一个模块、程序段或代码的一部分,所述模块、程序段或代码的一部分包含一个或多个用于实现规定的逻辑功能的可执行指令。也应当注意,在有些作为替换的实现中,方框中所标记的功能也可以以不同于附图中所标记的顺序发生。例如,两个连续的方框实际上可以基本并行地执行,它们有时也可以按相反的顺序执行,这依所涉及的功能而定。也要注意的是,框图和/或流程图中的每个方框、以及框图和/或流程图中的方框的组合,可以用执行规定的功能或操作的专用的基于硬件的系统来实现,或者可以用专用硬件与计算机指令的组合来实现。

以上已经描述了本发明的各实施例,上述说明是示例性的,并非穷尽性的,并且也不限于所披露的各实施例。在不偏离所说明的各实施例的范围和精神的情况下,对于本技术领域的普通技术人员来说许多修改和变更都是显而易见的。本文中所用术语的选择,旨在最好地解释各实施例的原理、实际应用或对市场中的技术的改进,或者使本技术领域的其它普通技术人员能理解本文披露的各实施例。

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