发明内容
本发明实施例提供一种数据分块方法及装置,用以提高数据分块的去冗率。
第一方面,本发明实施例提供一种数据分块方法,包括:
11.获取原数据流上滑动窗口的指纹值,所述滑动窗口的初始起始位置与所述原数据流的起始位置相同,所述滑动窗口的长度为预设长度;
12.采用所述滑动窗口的指纹值,分别对第1个模值至第N个模值进行取模,对于每个模值,如果取值后的值为零均执行步骤13和14,其中,将第i个模值向左扩展预设位数后得到第i+1个模值,所述i为大于等于1并且小于所述N的任一个自然数,所述N为模值的总个数;
13.将所述原数据流中从第n层的上一个数据块的结束位置开始到所述滑动窗口的结束位置之间的数据作为当前数据块,所述当前数据块为第n层数据块;其中,所述n为大于等于1并且小于等于所述N的任一个自然数:
在指纹字典中没有存储所述当前数据块的指纹值时,将所述当前数据块存储到分块字典中,将所述当前数据块的指纹值和所述当前数据块在所述分块字典中的索引信息存储到所述指纹字典中,当所述n大于1时,在新数据流占用的空间中写入所述当前数据块,以覆盖在所述新数据流中所述当前数据块包括的所有第n-1层的数据块,当所述n等于1时,将所述当前数据块顺序写入所述新数据流占用的空间;
在所述指纹字典中存储有所述当前数据块的指纹值时并且当n大于1时,在所述新数据流占用的空间中写入所述当前数据块的指纹值,以覆盖所述新数据流中所述当前数据块包括的所有第n-1层的数据块的指纹值,在所述指纹字典中存储有所述当前数据块的指纹值时并且当n等于1时,将所述当前数据块的指纹值顺序写入所述新数据流占用的空间;
14.将所述滑动窗口在所述原数据流上朝结束位置滑动所述预设长度,获取原数据流上滑动窗口的指纹值,重复执行步骤12-14,直至所述滑动窗口的起始位置滑动至所述原数据流的结束位置。
结合第一方面,第一种可能的实现方式中,将所述当前数据块存储到分块字典中,将所述当前数据块的指纹值和所述当前数据块在所述分块字典中的索引信息存储到所述指纹字典中,包括:
当所述当前数据块包括第n-1层的数据块时,将所述当前数据块的指纹值和所述当前数据块在所述分块字典中的索引信息存储到所述指纹字典中,其中,所述当前数据块在所述分块字典中的索引信息,根据所述当前数据块包括的第n-1层的数据块的索引信息确定;
当所述当前数据块不包括第n-1层的数据块时,将所述当前数据块存储到所述分块字典中,将所述当前数据块的指纹值和所述当前数据块在所述分块字典中的索引信息存储到所述指纹字典中。
结合第一方面,或结合第一方面的第一种可能的实现方式,在第二种可能的实现方式中,在新数据流的占用空间中写入所述当前数据块之前,和/或在所述新数据流的占用空间中写入所述当前数据块的指纹值之前,还包括:
查找所述当前数据块包括的第n-1层的数据块在所述新数据流中的位置。
结合第一方面,或结合第一方面的第一种和第二种可能的实现方式,在第三种可能的实现方式中,在所述将所述原数据流中从第n层的上一个数据块的结束位置开始到所述滑动窗口的结束位置之间的数据作为当前数据块之后,还包括:
记录所述当前数据块的序号,与所述当前数据块所在的层次、所述当前数据块在所述原数据流的位置和所述当前数据块在所述新数据流的位置之间的对应关系,并保存在位置记录表中;
查找所述当前数据块包括的第n-1层的数据块在所述新数据流中的位置,包括:
根据所述当前数据块在所述原数据流中的位置和第n-1层数据块在所述原数据流中的位置,在所述位置记录表中,定位所述原数据流中所述当前数据块包括的第n-1层数据块的记录;
从定位到的第n-1层数据块的记录中,获取所述当前数据块包括的第n-1层数据块在所述新数据流中的位置。
结合第一方面,或结合第一方面的第一种至第三种可能的实现方式,在第四种可能的实现方式中,上述方法还包括:
将所述新数据流解析为所述原数据流的过程中,当在所述新数据流查找到指纹值时,在所述指纹字典中查找所述指纹值对应的数据块在所述分块字典中的索引信息;
根据所述索引信息,在所述分块字典中查找所述指纹值对应的数据块,在所述指纹值在所述新数据流占用的空间中,将所述指纹值替换为查找到的数据块。
第二方面,本发明实施例还提供一种数据分块装置,包括:
获取模块:用于获取原数据流上滑动窗口的指纹值,所述滑动窗口的初始起始位置与所述原数据流的起始位置相同,所述滑动窗口的长度为预设长度;
取模模块,用于采用所述滑动窗口的指纹值,分别对第1个模值至第N个模值进行取模,其中,将第i个模值向左扩展预设位数后得到第i+1个模值,所述i为大于等于1并且小于所述N的任一个自然数,所述N为模值的总个数;
分块模块,用于对于每个模值,如果所述取模模块取模后的值为零,将所述原数据流中从第n层的上一个数据块的结束位置开始到所述滑动窗口的结束位置之间的数据作为当前数据块,所述当前数据块为第n层数据块;其中,所述n为大于等于1并且小于等于所述N的任一个自然数:
写模块,用于在所述指纹字典中没有存储所述分块模块产生的当前数据块的指纹值时,将所述当前数据块存储到分块字典中,将所述当前数据块的指纹值和所述当前数据块在所述分块字典中的索引信息存储到所述指纹字典中,当所述n大于1时,在新数据流占用的空间中写入所述当前数据块,以覆盖在所述新数据流中所述当前数据块包括的所有第n-1层的数据块,当所述n等于1时,将所述当前数据块顺序写入所述新数据流占用的空间;
所述写模块,还用于在所述指纹字典中存储有所述当前数据块的指纹值时并且所述n大于1时,在所述新数据流占用的空间中写入所述当前数据块的指纹值,以覆盖所述新数据流中所述当前数据块包括的所有第n-1层的数据块的指纹值,在所述指纹字典中存储有所述当前数据块的指纹值时并且当所述n等于1时,将所述当前数据块的指纹值顺序写入所述新数据流占用的空间;
滑动模块,用于在所述写模块将所述分块模块产生的所述当前数据块或所述当前数据块的指纹值写入所述新数据流占用的空间后,将所述滑动窗口在所述原数据流上朝结束位置滑动所述预设长度,获取原数据流上滑动窗口的指纹值,使所述取模模块、所述写模块和所述滑动模块重复执行操作,直至所述滑动窗口的起始位置滑动至所述原数据流的结束位置。
结合第二方面,在第一种可能的实现方式中,当所述当前数据块包括第n-1层的数据块时,所述当前数据块在所述分块字典中的索引信息,根据所述当前数据块包括的第n-1层的数据块的索引信息确定。
结合第二方面,或结合第一方面的第一种可能的实现方式中,在第二种可能的实现方式中,所述装置还包括:
定位模块,用于在所述写模块在新数据流的占用空间中写入所述当前数据块之前,和/或在所述写模块在所述新数据流的占用空间中写入所述当前数据块的指纹值之前,查找所述当前数据块包括的第n-1层的数据块在所述新数据流中的位置。
结合第二方面,或结合第一方面的第一种和第二种可能的实现方式中,在第三种可能的实现方式中,所述装置还包括:
记录模块,用于在所述分块模块将所述原数据流中从第n层的上一个数据块的结束位置开始到所述滑动窗口的结束位置之间的数据作为当前数据块之后,记录所述当前数据块的序号,与所述当前数据块所在的层次、所述当前数据块在所述原数据流的位置和所述当前数据块在所述新数据流的位置之间的对应关系,并保存在位置记录表中;
所述定位模块,用于根据所述当前数据块在所述原数据流中的位置和第n-1层数据块在所述原数据流中的位置,在所述位置记录表中,定位所述原数据流中所述当前数据块包括的第n-1层数据块的记录;从定位到的第n-1层数据块的记录中,获取所述当前数据块包括的第n-1层数据块在所述新数据流中的位置。
结合第二方面,或结合第一方面的第一种至第三种可能的实现方式中,在第四种可能的实现方式中,所述装置还包括:
还原模块,用于将所述新数据流解析为所述原数据流的过程中,当在所述新数据流查找到指纹值时,在所述指纹字典中查找所述指纹值对应的数据块在所述分块字典中的索引信息;
所述还原模块,还用于根据所述索引信息,在所述分块字典中查找所述指纹值对应的数据块,在所述指纹值在所述新数据流占用的空间中,将所述指纹值替换为查找到的数据块。
本发明实施例提供的数据分块方法及装置,在原数据流上同一个滑动窗口的指纹值分别对一组模值,即第1个模值至第N个模值进行取模,根据不同模值的取模结果对原数据流进行不同层次的分块,因此,对于同一个滑动窗口的指纹值,可以对原数据流同时进行粗粒度和细粒度的分块。对于产生的数据块,如果指纹字典中存在该数据块的指纹值,根据该数据块所在的层次,确定是将该数据块的指纹值顺序写入新数据流占用的空间还是替换该数据块包括的下一层数据块的指纹值;如果指纹字典中不存在该数据块的指纹值,根据该数据块所在的层次,确定是将该数据块顺序写入新数据流占用的空间还是替换该数据块包括的下一层数据块,从而,避免了与原数据流相比在新数据流中出现多余的数据块和多余的数据块的指纹值的现象,实现了采用不同粒度的数据块生成新数据流,并且在新数据流中采用大数据块替换已有的小数据块的目的,提高了新数据流的去冗率。本实施例中每层数据块均是在原数据流上直接产生的分块,每个指纹值均是数据块的指纹值,不需要在指纹值中增加指示位,指示该指纹值是数据块的指纹值还是指纹值的指纹值,减少了数据块的指纹值的开销,提高了新数据流的去冗率。另外,由于不同的模值产生不同层次的数据块,每层数据块的产生不依赖于其它层的数据块,因此,对于同一个滑动窗口的指纹值,可以并发产生不同层次的数据块。
具体实施方式
本发明实施例可以适用于发送端向接收端发送数据流之前,发送端对原数据流进行分块,将产生的数据块组成新数据流,向接收端发送新数据流,从而节省传输带宽,提高传输效率。
图1A为本发明实施例提供的一种数据分块方法流程图。本实施例通过一组模值:第1个模值至第N个模值,对原数据流进行多层次的分块。其中,N为模值的总数,N为预设值,N为大于1的自然数。
如图1A所示,本实施例提供的方法包括:
步骤11:将滑动窗口从原数据流的起始位置朝原数据流的结束位置滑动预设长度,滑动窗口的初始起始位置与原数据流的起始位置相同。所述滑动窗口的长度为预设长度。
步骤12:获取原数据流上滑动窗口的指纹值,采用滑动窗口的指纹值,分别对第1个模值至第N个模值进行取模,对于每个模值,如果取值后的值为零均执行步骤13,然后执行步骤14。
第1个模值至第N个模值之间的关系如下:第1个模值p1为预设值,第1个模值向左扩展预设位数后得到第2个模值p2,第2个模值向左扩展预设位数后得到第3个模值p3…将第i个模值向左扩展预设位数后得到第i+1个模值,以此类推,得到一组不同位数的模值p1,p2,…,pN,其中i为大于等于1小于N的任一个自然数,N为模值的总个数。举例来说,将模值p1=1100,向左扩展2位,得到模值p2=011100,将模值p2再向左扩展1位,得到模值p3=1011100。采用同样的方法可得到p4,……,pN。
步骤14:将滑动窗口在原数据流上朝结束位置滑动预设长度,获取原数据流上滑动窗口的指纹值,重复执行步骤12至步骤14,直至滑动窗口的起始位置滑动至原数据流的结束位置。
如图1B所示,将滑动窗口从原数据流的起始位置朝原数据流的结束位置滑动预设长度。采用当前滑动窗口的指纹值分别对第1个模值至第N个模值进行取模,并执行步骤13后,将滑动窗口朝原数据流的结束位置方向滑动预设长度,继续采用下一个滑动窗口的指纹值分别对第1个模值至第N个模值进行取模,并执行步骤13,直至滑动窗口的起始位置滑动至原数据流的结束位置。其中,原数据流在滑动窗口中的数据的指纹值称为滑动窗口的指纹值。数据的指纹值可以是数据的标识符,用于标识数据,不同数据的指纹值不相同。
采用滑动窗口的指纹值,分别对第1个模值至第N个模值进行取模,并执行步骤13时,可以按照从第1个模值至第N个模值的顺序,依次对每个模值进行取模,在取模后的值为零时执行步骤13;也可以先同时对N个模值进行取模,然后再按照从第1个模值至第N个模值的顺序,在取模后的值为零时执行步骤13。
如果滑动窗口的指纹值对第n个模值取模后的值为零,执行步骤13。在步骤13中产生数据块,并确定是将数据块还是数据块的指纹值写入新数据流占用空间中。步骤13包括以下操作。
步骤13包括:将原数据流中从第n层的上一个数据块的结束位置开始到滑动窗口的结束位置之间的数据作为当前数据块,当前数据块为第n层数据块;其中,n为大于等于1并且小于等于N的任一个自然数。
换言之,在上述步骤12中,如果滑动窗口的指纹值对第n个模值取模后的值为零,则从原数据流中产生一个数据块,当前数据块的起始位置为原数据流中第n层的上一个数据块的结束位置,当前数据块的结束位置为滑动窗口的结束位置。对于第n个模值产生的数据块,称为第n层的数据块。模值扩展的位数可以自定义,对当前模值扩展的位数影响下一层数据块的长度。
步骤13还包括:在指纹字典中没有存储当前数据块的指纹值时,将当前数据块存储到分块字典中,将当前数据块的指纹值和当前数据块在分块字典中的索引信息存储到指纹字典中;若n大于1,在新数据流占用的空间中写入当前数据块,以覆盖在新数据流中当前数据块包括的所有第n-1层的数据块,否则将当前数据块顺序写入新数据流占用的空间。
分块字典用于存储原数据流上产生的数据块,指纹字典用于存储分块字典中保存的数据块的指纹值和数据块在分块字典中的索引信息。举例来说,数据块在分块字典中的索引信息可以包括数据块的长度和数据块在分块字典中的位置信息。
从原数据流中产生一个数据块后,判断指纹字典中是否存储有当前数据块的指纹值。如果指纹字典中没有存储当前数据块的指纹值,可确定新数据流和分块字典中没有存储当前数据块,需要在新数据流和分块字典中写入当前数据块;如果指纹字典中存储有当前数据块的指纹值,可确定新数据流和分块字典中已存储有当前数据块,不需要在新数据流和分块字典中写入当前数据块。
第n个模值由第n-1个模值向左扩展固定位数后得到。对同一个滑动窗口的指纹值来说,如果滑动窗口的指纹值对第n个模值取模后的值为零,则滑动窗口的指纹值对第n-1个模值取模后的值也为零。而滑动窗口的指纹值对第n-1个模值取模后的值为零,滑动窗口的指纹值对第n个模值取模后的值不一定为零。对于同一个滑动窗口的指纹值,产生第n-1层的数据块后,并不一定会产生第n层的数据块,但产生了第n层数据块时,第n-1层的数据块一定已经产生。因此,从原数据流起始位置向结束位置移动滑动窗口时,与第n-1层的数据块的起始位置相比,第n层的数据块的起始位置会更接近于原数据流的起始位置,而不会比第n-1层的数据块的起始位置远,因而。第n层的数据块的长度大于等于第n-1层的数据块的长度,第n层的数据块会包括有一个或多个第n-1层的数据块。
在指纹字典中没有存储当前数据块的指纹值的情况下,如果当前数据块所在的层次n大于1,当前数据块包括有一个或多个第n-1层的数据块,为了避免新数据流中出现多余的数据块和多余的数据块的指纹值,将当前数据块写入新数据流占用的空间中,以在新数据流中覆盖当前数据块包括的所有第n-1层的数据块。其中,在写入当前数据块之前,新数据流中当前数据块所在的位置存储的是当前数据块包括的所有第n-1层的数据块;在写入当前数据块之后,当前数据块覆盖了新数据流中当前数据块包括的所有第n-1层的数据块,因此,新数据流中当前数据块所在的位置存储的是当前数据块。
如果当前数据块所在的层次n等于1,由于当前数据块是第1层的数据块,其范围内不包括其它层的数据块,因此,直接将当前数据块写入新数据流的末尾。
当前数据块所在的层次n大于1时,可以在新数据流的占用空间中写入所述当前数据块之前,查找所述当前数据块包括的第n-1层的数据块在所述新数据流中的位置,以便在新数据流的占用空间中确定写入当前数据块的位置。可以通过以下方法在新数据流中定位第n层的当前数据块包括的第n-1层的数据块。
首先,产生一个数据块后,记录该数据块的序号、该数据块所在的层次和在原数据流的位置三者之间的对应关系。上述对应关系可以记录在位置记录表中。例如,第3个数据块产生后,因为第3个数据块是第2层的数据块,为第3个数据块记录的对应关系是(序号3,层次2,在原数据流中的位置)。其中,数据块的序号表示数据块产生的先后顺序,序号越小表示产生的时间越早。在新数据流中写入该数据块/该数据块的指纹值后,在上述对应关系中增加该数据块/该数据块的指纹值在新数据流中的位置。例如,在新数据流中写入第3个数据块/第3个数据块的指纹值后,在为第3个数据块记录的对应关系中增加第3个数据块/第3个数据块的指纹值在新数据流中的位置。此时,为第3个数据块记录的对应关系是(序号3,层次2,在原数据流中的位置、在新数据流中的位置)。其中,数据块/数据块的指纹值在数据流中的位置,可以用数据块/数据块的指纹值在数据流中的起始位置和数据块的长度来表示,也可以是数据块/数据块的指纹值在数据流中的起始位置和结束位置来表示。通过记录的数据块/数据块的指纹值在数据流中的位置,可以在数据流中查找到该数据块/该数据块的指纹值。
当指纹字典中没有存储当前数据块的指纹值且当前数据块所在的层次n大于1时,根据当前数据块在原数据流中的位置和第n-1层的数据块在原数据流中的位置,在位置记录表中定位原数据流中当前数据块包括的第n-1层的数据块的记录。从定位到的第n-1层数据块的记录中,获取所述当前数据块包括的第n-1层数据块在所述新数据流中的位置。
当前数据块包括的第n-1层的数据块称为第n-1层的待替换数据块。在原数据流中产生一个数据块后,在新数据流中有可能写入的是该数据块,也可能写入的是该数据块的指纹值。因此,在位置记录表中,记录的第n-1层的待替换数据块在新数据流的位置,有可能是第n-1层的待替换数据块在新数据流中的位置,也可能是第n-1层的待替换数据块的指纹值在新数据流中的位置。从定位到的第n-1层的待替换数据块的记录中,可获取到第n-1层的待替换数据块/第n-1层的待替换数据块的指纹值在新数据流中的位置。获取第n-1层的待替换数据块/第n-1层的待替换数据块的指纹值在新数据流中的位置之后,根据获取到的位置,在新数据流中用第n层的当前数据块替换第n-1层的待替换数据块/第n-1层的待替换数据块的指纹值,同时在位置记录表中删除第n-1层的待替换数据块的记录。
步骤13还包括:在指纹字典中存储有所述当前数据块的指纹值时,若n大于1,在新数据流占用的空间中写入所述当前数据块的指纹值,以覆盖新数据流中当前数据块包括的所有第n-1层的数据块的指纹值,否则将当前数据块的指纹值顺序写入所述新数据流占用的空间。
如果指纹字典中存在当前数据块的指纹值,可以确定分块字典和新数据流中已存储有当前数据块。如果指纹字典中存在当前数据块的指纹值,且当前数据块是第1层数据块,则直接在新数据流的最后一个数据块的结尾处写入当前数据块的指纹值。
在当前数据块所在的层次n大于1的情况下,当前数据块范围内包括有一个或多个第n-1层数据块。因而,产生当前数据块时,如果当前数据块的指纹值已存储在指纹字典中,则当前数据块范围内的所有第n-1层数据块的指纹值也已经写入新数据流中。为了避免新数据流中出现多余的数据块和多余的数据块的指纹值,在新数据流占用的空间中写入当前数据块的指纹值,以覆盖在新数据流中当前数据块包括的所有第n-1层的数据块的指纹值,从而节省了新数据流的传输带宽。其中,在写入当前数据块的指纹值之前,新数据流中当前数据块所在的位置存储的是当前数据块包括的所有第n-1层的数据块的指纹值;在写入当前数据块的指纹值之后,当前数据块的指纹值覆盖了新数据流中当前数据块包括的所有第n-1层的数据块的指纹值,新数据流中当前数据块所在的位置存储的是当前数据块的指纹值。
当前数据块所在的层次n大于1时,可以在新数据流的占用空间中写入所述当前数据块的指纹值之前,查找当前数据块包括的第n-1层的数据块在所述新数据流中的位置,以便在新数据流的占用空间中确定写入当前数据块的指纹值的位置。可以通过以下方法在新数据流中定位到第n层的当前数据块范围内的第n-1层的数据块的指纹值。根据当前数据块在原数据流中的位置和第n-1层数据块在原数据流中的位置,在上述位置记录表中,定位原数据流中当前数据块包括的第n-1层的数据块的记录。从定位到的第n-1层数据块的记录中,获取所述当前数据块包括的第n-1层数据块在所述新数据流中的位置。当前数据块包括的第n-1层的数据块称为第n-1层的待替换数据块。在定位到的第n-1层的待替换数据块的记录中,获取第n-1层的待替换数据块的指纹值在新数据流中的位置。获取到第n-1层的待替换数据块的指纹值在新数据流中的位置后,根据获取到的位置,在新数据流中用当前数据块的指纹值替换第n-1层的待替换数据块的指纹值,同时在位置记录表中删除第n-1层的待替换数据块的记录。
滑动窗口的起始位置滑动至原数据流的结束位置时,结束对原数据流的分块,此时的新数据流为原数据流的替代数据流。接收端可以结合分块字典和指纹字典对发送端发送的新数据流进行解析,获得原数据流。将新数据流解析为原数据流的过程中,若在新数据流查找到指纹值,在指纹字典中查找指纹值对应的数据块在分块字典中的索引信息。根据索引信息,在分块字典中查找所述指纹值对应的数据块,在指纹值在所述新数据流占用的空间中,将指纹值替换为查找到的数据块。
本实施例提供的数据分块方法,在原数据流上同一个滑动窗口的指纹值分别对一组模值,即第1个模值至第N个模值进行取模,根据不同模值的取模结果对原数据流进行不同层次的分块,因此,对于同一个滑动窗口的指纹值,可以对原数据流同时进行粗粒度和细粒度的分块。对于产生的数据块,如果指纹字典中存在该数据块的指纹值,根据该数据块所在的层次,确定是将该数据块的指纹值顺序写入新数据流占用的空间还是在替换该数据块包括的下一层数据块的指纹值;如果指纹字典中不存在该数据块的指纹值,根据该数据块所在的层次,确定是将该数据块顺序写入新数据流占用的空间还是替换该数据块包括的下一层数据块,从而,避免了与原数据流相比,在新数据流中出现多余的数据块和多余的数据块的指纹值的现象,实现了采用不同粒度的数据块生成新数据流,并且在新数据流中采用大数据块替换已有的小数据块的目的,提高了新数据流的去冗率。本实施例中每层数据块均是在原数据流上直接产生的分块,每个指纹值均是数据块的指纹值,不需要在指纹值中增加指示位,指示该指纹值是数据块的指纹值还是指纹值的指纹值,减少了数据块的指纹值的开销,提高了新数据流的去冗率。另外,由于不同的模值产生不同层次的数据块,每层数据块的产生不依赖于其它层的数据块,因此,对于同一个滑动窗口的指纹值,可以并发产生不同层次的数据块。
进一步,为节省分块字典的存储空间,在分块字典中没有存储当前数据块的指纹值时,通过判断当前数据块是否包括第n-1层的数据块,确定是否在分块字典中写入当前数据块。若所述当前数据块包括第n-1层的数据块,将所述当前数据块的指纹值和所述当前数据块在所述分块字典中的索引信息存储到所述指纹字典中,其中,所述当前数据块在所述分块字典中的索引信息,根据所述当前数据块包括的第n-1层的数据块的索引信息确定。若所述当前数据块不包括第n-1层的数据块,将所述当前数据块存储到分块字典中,将所述当前数据块的指纹值和所述当前数据块在所述分块字典中的索引信息存储到所述指纹字典中。
如图2所示的三层次式分块示意图。图2中的分块采用的模值为p1,p2和p3。p1=10,将p1向左扩展1位,得到p2=110。将p1向左扩展两位,得到p3=01110。
滑动窗口在原数据流上从左向右滑动,滑动窗口内的指纹值为111010时。该滑动窗口的指纹值对p1取模后的值为0,产生一个第1层的分块,记为分块1。此时,该滑动窗口的指纹值对p2和p3取模后的值均不为0。在指纹字典中没有存储分块1的指纹,如图3所示,在分块字典中存储分块1,并在指纹字典中保存分块1的指纹值和分块1在分块字典中的索引信息。分块在分块字典中的索引信息包括在分块字典中的地址、偏移量和长度。然后,将分块1写入新数据流中。举例来说,分块1在分块字典中的地址为分块字典中存储分块1数据的条目的位置。
滑动窗口在原数据流上继续向右滑动,滑动窗口的指纹值为010110。该滑动窗口的指纹值对p1取模后的值为0,产生一个第1层的分块,记为分块2。该滑动窗口的指纹值对p2取模后的值也为0,产生一个第2层的分块,记为分块3。该滑动窗口的指纹值对p3取模后的值不为0。在指纹字典中没有存储分块2的指纹,如图3所示,在分块字典中存储分块2,并在指纹字典中保存分块2的指纹值和分块2在分块字典中的2起始地址、偏移量和长度,然后,将分块2与入新数据流中最后一个分块即分块1的末尾。产生分块3后,在指纹字典中没有存储分块3的指纹,在分块字典中存储分块3,并在指纹字典中保存分块3的指纹值和分块3在分块字典中的地址、偏移量和长度,然后,在新数据流中用第2层的分块3替换第1层的分块1和分块2。
滑动窗口在原数据流上继续向右滑动,滑动窗口的指纹值为001110。该滑动窗口的指纹值对p1、p2和p3均为0,先后产生了第1层的分块4、第2层的分块4和第3层的分块5。第1层的分块4和第2层的分块4是同一个分块,因此,只保存第1层的分块,记为分块4。产生分块4后,分块4的指纹值还没有存储在指纹字典中,如图3所示,在分块字典中存储分块4,并在指纹字典中保存分块4的指纹值和分块4在分块字典中的起始地址、偏移量和长度,然后,将分块4写入新数据流中最后一个分块即分块1的末尾。产生分块5后,分块5的指纹值还没有存储在指纹字典中,则在分块字典中存储分块5,
在指纹字典中保存分块5的指纹值和分块5在分块字典中的起始地址、偏移量和长度,然后,在新数据流中用第3层的分块5替换第2层的分块3和分块4。
滑动窗口在原数据流上继续向右滑动,如果产生的是分块3,确定分块3的指纹值已存储在指纹字典且分块3是第2层的分块,可以确定在新数据流中,当前分块3占据的范围内包括的第1层的数据块已替换为指纹值,用分块3的指纹值替换原数据流中分块3范围内的第1层的分块1和分块2。如果产生的是分块5,确定分块5的指纹值已存储在指纹字典且分块3是第2层的分块,可以确定在新数据流中,当前分块5占据的范围内包括的第2层的数据块已替换为指纹值,用分块5的指纹值替换原数据流中分块5范围内的第2层的分块3和分块4。如果产生的是第1层的分块1或2,由于分块1或分块2的指纹值已存储在指纹字典中,且分块1或分块2是第1层的分块,直接将分块1或分块2的指纹值写入新数据流的最后一个分块的末尾处。
进一步,为节省分块字典的存储空间,如果产生的是分块3,由图2可知,第2层的分块3由第1层的分块1和分块2组成,分块字典中已存储了分块3,可以不在分块字典中重复存储分块3。如图4所示,分块1的偏移量为0,分块2存放在分块1之后,分块2的偏移量为分块1的长度。对于第2层的分块3,分块3的地址与分块1的地址相同,也与分块2的地址相同,分块3的偏移量为分块1的偏移量。分块3的长度为分块1的长度与分块2的长度之和。同样,第3层的分块5由第2层的分块3和分块4组成,分块字典中已存储了分块5,可以不在分块字典中重复存储分块5。分块5的偏移量为分块3的偏移量。分块5的地址与分块3的地址相同,分块5的长度为分块3的长度与分块4的长度之和。
图5本发明实施例提供的一种数据分块装置结构示意图。如图5所示,本实施例提供的装置包括:获取模块56、取模模块51、分块模块52和写模块53以及滑动模块50。
获取模块56,用于获取原数据流上滑动窗口的指纹值,所述滑动窗口的初始起始位置与所述原数据流的起始位置相同,所述滑动窗口的长度为预设长度。
取模模块51,用于采用所述滑动窗口的指纹值,分别对第1个模值至第N个模值进行取模,其中,将第i个模值向左扩展预设位数后得到第i+1个模值,所述i为大于等于1并且小于所述N的任一个自然数,所述N为模值的总个数。
分块模块52,用于对于每个模值,如果所述取模模块取模后的值为零,将所述原数据流中从第n层的上一个数据块的结束位置开始到所述滑动窗口的结束位置之间的数据作为当前数据块,所述当前数据块为第n层数据块;其中,所述n为大于等于1并且小于等于所述N的任一个自然数:
写模块53,用于在指纹字典中没有存储所述分块模块产生的当前数据块的指纹值时,将所述当前数据块存储到分块字典中,将所述当前数据块的指纹值和所述当前数据块在所述分块字典中的索引信息存储到所述指纹字典中;若所述n大于1,在新数据流占用的空间中写入所述当前数据块,以覆盖在所述新数据流中所述当前数据块包括的所有第n-1层的数据块,否则将所述当前数据块顺序写入所述新数据流占用的空间;
所述写模块53,还用于在所述指纹字典中存储有所述当前数据块的指纹值时,若n大于1,在所述新数据流占用的空间中写入所述当前数据块的指纹值,以覆盖所述新数据流中所述当前数据块包括的所有第n-1层的数据块的指纹值,否则将所述当前数据块的指纹值顺序写入所述新数据流占用的空间;
滑动模块50,用于在所述写模块将所述分块模块产生的所述当前数据块或所述当前数据块的指纹值写入所述新数据流占用的空间后,将所述滑动窗口在所述原数据流上朝结束位置滑动所述预设长度,获取原数据流上滑动窗口的指纹值,使所述取模模块51、所述写模块53和所述滑动模块50重复执行操作,直至所述滑动窗口的起始位置滑动至所述原数据流的结束位置。
可选地,所述写模块53,还用于若所述当前数据块包括第n-1层的数据块,将所述当前数据块的指纹值和所述当前数据块在所述分块字典中的索引信息存储到所述指纹字典中,其中,所述当前数据块在所述分块字典中的索引信息,根据所述当前数据块包括的第n-1层的数据块的索引信息确定。
可选地,所述写模块53,还用于若所述当前数据块不包括第n-1层的数据块,将所述当前数据块存储到所述分块字典中,将所述当前数据块的指纹值和所述当前数据块在所述分块字典中的索引信息存储到所述指纹字典中。
本实施例提供的数据分块装置,取模模块在原数据流上同一个滑动窗口的指纹值分别对一组模值第1个模值至第N个模值进行取模,分块模块根据不同模值的取模结果对原数据流进行不同层次的分块,因此,对于同一个滑动窗口的指纹值,可以对原数据流同时进行粗粒度和细粒度的分块。对于产生的数据块,如果指纹字典中存在该数据块的指纹值,写模块根据该数据块所在的层次,确定是将该数据块的指纹值顺序写入新数据流占用的空间还是替换该数据块包括的下一层数据块的指纹值;如果指纹字典中不存在该数据块的指纹值,写模块根据该数据块所在的层次,确定是将该数据块顺序写入新数据流占用的空间还是替换该数据块包括的下一层数据块,从而,避免了与原数据流相比在新数据流中出现多余的数据块和多余的数据块的指纹值的现象,实现了采用不同粒度的数据块生成新数据流,并且在新数据流中采用大数据块替换已有的小数据块的目的,提高了新数据流的去冗率。本实施例中每层数据块均是在原数据流上直接产生的分块,每个指纹值均是数据块的指纹值,不需要在指纹值中增加指示位,指示该指纹值是数据块的指纹值还是指纹值的指纹值,减少了数据块的指纹值的开销,提高了新数据流的去冗率。另外,由于,不同的模值产生不同层次的数据块,每层数据块的产生不依赖于其它层的数据块,因国此,对于同一个滑动窗口的指纹值,可以并发产生不同层次的数据块。
如图6所示,图5中装置还可包括:定位模块54和记录模块55。
记录模块55,用于在所述分块模块52将所述原数据流中从第n层的上一个数据块的结束位置开始到所述滑动窗口的结束位置之间的数据作为当前数据块之后,记录所述当前数据块的序号,与所述当前数据块所在的层次、所述当前数据块在所述原数据流的位置和所述当前数据块在所述新数据流的位置之间的对应关系,并保存在位置记录表中;
定位模块54,用于在所述写模块53在新数据流的占用空间中写入所述当前数据块之前,和/或所述写模块53在所述新数据流的占用空间中写入所述当前数据块的指纹值之前,查找所述当前数据块包括的第n-1层的数据块在所述新数据流中的位置。
进一步,所述定位模块54,具体用于根据所述当前数据块在所述原数据流中的位置和第n-1层数据块在所述原数据流中的位置,在所述位置记录表中,定位所述原数据流中所述当前数据块包括的第n-1层数据块的记录;从定位到的第n-1层数据块的记录中,获取所述当前数据块包括的第n-1层数据块在所述新数据流中的位置。
为了根据新数据流还原出原数据流,图5和图6中所示的装置还可包括:还原模块。
还原模块,用于将所述新数据流解析为所述原数据流的过程中,若在所述新数据流查找到指纹值,在所述指纹字典中查找所述指纹值对应的数据块在所述分块字典中的索引信息;
所述还原模块,还用于根据所述索引信息,在所述分块字典中查找所述指纹值对应的数据块,在所述指纹值在所述新数据流占用的空间中,将所述指纹值替换为查找到的数据块。
图5和图6所示的各个模块可以用处理器(processor)来实现。可选地,图5和图6所示的装置还可以包括存储模块,用于存储所述分块字典和所述指纹字典。可选地,所述存储模块可以用存储器来实现。
本领域普通技术人员可以理解:实现上述方法实施例的全部或部分步骤可以通过程序指令相关的硬件来完成,前述的程序可以存储于一计算机可读取存储介质中,该程序在执行时,执行包括上述方法实施例的步骤;而前述的存储介质包括:ROM、RAM、磁碟或者光盘等各种可以存储程序代码的介质。
最后应说明的是:以上实施例仅用以说明本发明的技术方案,而非对其限制;尽管参照前述实施例对本发明进行了详细的说明,本领域的普通技术人员应当理解:其依然可以对前述各实施例所记载的技术方案进行修改,或者对其中部分技术特征进行等同替换;而这些修改或者替换,并不使相应技术方案的本质脱离本发明各实施例技术方案的范围。