CN102122284A - 一种复合文档存储、读写方法和装置 - Google Patents
一种复合文档存储、读写方法和装置 Download PDFInfo
- Publication number
- CN102122284A CN102122284A CN2010100426928A CN201010042692A CN102122284A CN 102122284 A CN102122284 A CN 102122284A CN 2010100426928 A CN2010100426928 A CN 2010100426928A CN 201010042692 A CN201010042692 A CN 201010042692A CN 102122284 A CN102122284 A CN 102122284A
- Authority
- CN
- China
- Prior art keywords
- sector
- stream
- compound document
- storage
- internal control
- Prior art date
- Legal status (The legal status is an assumption and is not a legal conclusion. Google has not performed a legal analysis and makes no representation as to the accuracy of the status listed.)
- Granted
Links
Images
Classifications
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F16/00—Information retrieval; Database structures therefor; File system structures therefor
- G06F16/90—Details of database functions independent of the retrieved data types
- G06F16/93—Document management systems
Landscapes
- Engineering & Computer Science (AREA)
- Databases & Information Systems (AREA)
- Theoretical Computer Science (AREA)
- Business, Economics & Management (AREA)
- General Business, Economics & Management (AREA)
- Data Mining & Analysis (AREA)
- Physics & Mathematics (AREA)
- General Engineering & Computer Science (AREA)
- General Physics & Mathematics (AREA)
- Information Retrieval, Db Structures And Fs Structures Therefor (AREA)
- Memory System (AREA)
Abstract
本发明公开了一种复合文档存储、读写方法和装置,该方法包括:为复合文档的内部控制流预分配初始存储区域,所述初始存储区域为连续的扇区或扇区簇;在所述初始存储区域内存储所述内部控制流,并当所述内部控制流大小超出所述初始存储区域时,预分配第二存储区域以便存储超出的内部控制流,所述第二存储区域也为连续的扇区或扇区簇。采用本方法或装置,可减少了复合文档中的用户数据流和内部控制流的碎片。相应的,由于预分配存储空间,使得复合文档中的用户数据流和内部控制流连续存储的概论增加,可引入读缓存和批量写入的策略来优化I/O,提高读写效率。
Description
技术领域
本发明涉及数据处理领域,尤其涉及一种复合文档存储、读写方法和装置。
背景技术
复合文档不仅包含文本而且包括图形、电子表格数据、声音、视频图像以及其它信息。如即时通讯客户端的文件就可以使用复合文档来保存,比如消息记录、表情文件等,随着及时通讯工具使用时间的增长,其相应的复合文档会越来越大。
如图1所示为一种复合文档的存储(Storage)和流(Stream)的逻辑结构示意图。复合文档的逻辑结构与文件***的非常相似,每个文档有一个根存储(Root Storage),每个存储下面可以有0到多个存储或流。每个存储和流都有一个名字,该名字通常由16位的Unicode字符构成,最大名字长度为31个字符。同一个存储下的存储或流的名字不能相同,不同存储下的存储或流的名字可以相同。
复合文档除了头结构以外,所有的数据都以流的形式组织。复合文档的所有流都被分成更小的数据块,叫做扇区。扇区可能包含控制数据或用户数据。整个复合文档包含一个头结构,跟在头结构后面的是一系列的扇区。所有扇区的大小都相同,这个大小值在头结构中设定。
扇区以其在文件中的顺序列举,扇区的索引(从0开始)叫做扇区标识(SID),它是一个有符号的32位整型值。如果一个SID不小于0,那么它一定指向一个存在的扇区;如果SID值为负,那么它可能有特殊的含义。
构成一个流的所有扇区所形成的链表叫做扇区链,扇区链中相邻的扇区在物理上不一定相邻,为了方便地表示扇区链中各个扇区的相对位置关系,引入了扇区标识链的概念。扇区标识链是一个扇区标识的数组。扇区标识链以流中第一个扇区的扇区标识开始,顺次记录流中扇区的扇区标识,以链表结束(-2)结尾。
而复合文档中的流按用途分,可以分为内部控制流和用户数据流。内部控制流有目录流,主扇区分配表(MSAT),扇区分配表(SAT),短扇区分配表(SSAT),短流存放流。
其中,主扇区配置表(MSAT,Master Sector Allocation Table)是一个SID数组,顺序指明了用于存放扇区配置表的扇区的SID。MSAT的大小等于用于存放SAT的扇区的个数,这个值存放在头结构中。
扇区配置表(SAT,Sector Allocation Table)是一个扇区标识的数组,它包含了所有的用户数据流和内部控制流,SAT的大小等于整个复合文档中存在的扇区个数。SAT数组元素的索引就是该元素代表的扇区标识,而元素的值则为该元素代表的扇区在扇区链中的下一个节点。SAT可能在任意位置包含Free SID(-1),这些扇区将不被任何流使用;如果该位置包含End of SIDChain(-2),表示一个流的结束;如果该位置包含SAT SID(-3),表示所代表的扇区用于存放SAT;如果该位置包含MSAT SID(-4),表示所代表的扇区用于存放MSAT。
短流存放流与其他的长度不小于标准流长度的普通用户流一样。它的扇区链中第一个扇区的SID存放在根存储(Root Storage)的目录项里。短流存放流的扇区标识链可以从SAT中获得。
短扇区分配表(SSAT,Short Sector Allocation Table)就是一个扇区标识的数组,包含了所有短流的扇区标识链。SSAT作为一个内部控制流,它的创建过程与普通的流的创建过程一致。SSAT的第一个扇区标识存放在头结构中。SSAT作为一个扇区分配表,他的作用与SAT极为相似,唯一的区别就是SSAT中的扇区标识指向的是短扇区而不是普通扇区。
目录流是一个内部控制流,它包含了一个目录项数组,每一个目录项指向复合文档中的一个存储或流,目录流中以0为开始的目录项索引称为目录项标识(directory entry identifier,DID)。
在上述的复合文档中没有对扇区分配进行控制,导致大量碎片,I/O不停的在整个复合文档中跳转,严重影响性能。其中主扇区分配表(MSAT)、扇区分配表(SAT)、短扇区分配表(SSAT)、目录项遍布于整个复合文档中,严重影响复合文档的打开、遍历、读写等性能,而对于流和短流,过小的分配单元和完全没有控制的扇区分配,也造成了大量碎片。
发明内容
本发明实施例所要解决的技术问题在于,提供一种复合文档存储、读写方法和装置,以减少复合文档中的碎片。
为此,本发明实施例提供了一种复合文档存储方法,包括:为复合文档的内部控制流预分配初始存储区域,所述初始存储区域为连续的扇区或扇区簇;
在所述初始存储区域内存储所述内部控制流,并当所述内部控制流大小超出所述初始存储区域时,预分配第二存储区域以便存储超出的内部控制流,所述第二存储区域也为连续的扇区或扇区簇。
相应地,本发明实施例还提供了一种复合文档读写方法,所述复合文档采用如前所述的方法存储内部控制流,所述复合文档读写方法包括:
在读取内部控制流的扇区时,判断该扇区的相邻的一个或多个扇区中是否也存储了与该内部控制流同类的内部控制流;
若判断结果为是,则将所述扇区以及与其相邻的一个或多个扇区存储的数据一次性读入。
同时,本发明实施例还提供了一种复合文档存储装置,该装置包括:
控制流初始预分配模块,用于为复合文档的内部控制流预分配初始存储区域,所述初始存储区域为连续的扇区或扇区簇;
控制流第二预分配模块,用于在所述初始存储区域内存储所述内部控制流,并当所述内部控制流大小超出所述初始存储区域时,预分配第二存储区域以便存储超出的内部控制流,所述第二存储区域也为连续的扇区或扇区簇。
本发明实施例还提供了一种复合文档读写装置,所述复合文档采用如前所述的装置存储内部控制流,所述复合文档读写装置包括:
扇区判断模块,用于在读取内部控制流的扇区时,判断该扇区的相邻的一个或多个扇区中是否也存储了与该内部控制流同类的内部控制流;
控制流读取模块,用于若判断结果为是,则将所述扇区以及与其相邻的一个或多个扇区存储的数据一次性读入。
在本发明实施例所提供的方案中,对内部控制流采用预分配存储空间的策略进行存储,减少了复合文档中的内部控制流的碎片。相应的,由于预分配存储空间,使得复合文档中的内部控制流连续存储的概论增加,可引入读缓存和批量写入的策略来优化I/O,提高读写效率。
附图说明
图1是现有技术中的一种复合文档的存储和流的逻辑结构示意图;
图2是本发明实施例中的关于内部控制流的预分配策略下的存储方法的一个流程示意图;
图3是本发明实施例中的用户数据流的预分配存储空间的存储方法一个流程示意图;
图4是在图3中的存储方法中记录为各用户数据流预留的数据存储空间的状态的一个流程示意图;
图5是本发明实施例中的复合文档存储装置的一个流程示意图;
图6是本发明实施例中的复合文档存储装置的另一个流程示意图;
图7是本发明实施例中的复合文档存储装置的另一个流程示意图;
图8是本发明实施例中的复合文档存储装置的另一个流程示意图;
图9是本发明实施例中的复合文档读写装置的一个流程示意图;
图10是本发明实施例中的复合文档读写装置的另一个流程示意图;
图11是本发明实施例中的复合文档读写装置的另一个流程示意图;
图12是用微软复合文档接口打开db1的耗时和本发明实施例中的复合文档接口打开db2耗时的结果对比示意图;
图13是用微软复合文档接口模拟读取db1中7个好友的消息记录和本发明实施例中的复合文档接口模拟读取db2中7个好友消息记录的耗时对比示意图;
图14是用微软复合文档接口模拟写入7个好友的消息记录和用本发明实施例中的复合文档接口模拟写入7个好友消息记录的耗时对比示意图。
具体实施方式
下面将结合本发明实施例中的附图,对本发明实施例中的技术方案进行清楚、完整地描述,显然,所描述的实施例仅仅是本发明一部分实施例,而不是全部的实施例。基于本发明中的实施例,本领域普通技术人员在没有作出创造性劳动前提下所获得的所有其他实施例,都属于本发明保护的范围。
为了解决现有的复合文档的碎片多导致的文件打开、读写性能差问题,本发明实施例提出了一种完全兼容现有复合文档格式的新复合文档。在本发明实施例中的复合文档中,采用预分配策略(即对内部控制流或/和用户数据流预分配一定大小的存储空间,以进行相应的存储)进行复合文档的存储,以保证数据块的连续性,减少碎片的产生;另外,相应于本发明实施例中的复合文档的存储方式,本发明实施例还提出了一种采取缓存读取和批量写入策略来优化输入/输出(I/O),从而提升复合文档的打开、读写性能。
同时,在本发明实施例中的复合文档可以以扇区为单位进行存储,也可以以扇区簇为单位进行存储。在前期的研究发现,现有的复合文档(如微软复合文档)的MSAT,目录项,SSAT每个扇区都不连续。其分配粒度是512字节的扇区,分配粒度过小,增加了碎片形成的几率,为从根源上减少碎片,本发明实施例中重新定义一个比较大一点的分配粒度——扇区簇(类似磁盘管理中的簇)。按复合文档的规范,小于4K字节(4×1024字节,或表示为4KB)的即为短流。因此可以选择大于4K字节的粒度值,如8K字节做为簇的大小。为实现簇分配单元模式,定义了一个非常简单的原则,即每次分配都按照8K字节边界对齐分配扇区,这样保证分配粒度始终不小于一个扇区簇。因为簇大小8K字节正好是512字节的整数倍,所以能完全兼容现有复合文档格式。当然,根据具体的情况扇区簇的大小也可以是其他数值,如为扇区大小的整数倍数值等。
如前所述,在本发明实施例中的复合文档中,采用预分配策略来进行复合文档的存储。由于内部控制流和用户数据流的性质的不同,其具体的预分配策略是不同的。如图2所示,为本发明实施例中的关于内部控制流的预分配策略下的存储方法,包括:
201、为复合文档的内部控制流预分配初始存储区域,所述初始存储区域为连续的扇区或扇区簇。在本实施例,以及本发明的其他实施例中所涉及的存储区域的单位,既可以是扇区,也可以是前述的扇区簇;但,不论是扇区还是扇区簇,在某一具体实施例中,并不会存在采用扇区和扇区簇混合作为存储单位的情况,即在某一复合文档的实现中,要么都是采用扇区作为基本存储单位,要么都是采用扇区簇作为基本存储单位(在同一实施例中,包括内部控制流和后述的用户数据流都采用相同的基本存储单位进行存储)。
其中,本实施例中的内部控制流可以是主扇区分配表、扇区分配表、短流存放流、短扇区分配表及目录流中的一种或多种。即可以是对复合文档中的上述的某一种具体的内部控制流(如MSAT)采用本实施例中的预分配存储区域的方案进行存储,也可以是对复合文档中的多种或全部的内部控制流都采用本实施例中的预分配存储区域的方案进行存储。
需要说明的是,若是对复合文档中的多种或全部的内部控制流,所述为复合文档的内部控制流预分配初始存储区域是指,分别为各种不同的内部控制流预分配不同的初始存储区域。
202、在所述初始存储区域内存储所述内部控制流,并当所述内部控制流大小超出所述初始存储区域时,预分配第二存储区域以便存储超出的内部控制流,所述第二存储区域也为连续的扇区或扇区簇。
在本发明实施例中,由于内部控制流(如SAT)较大,或是由于复合文件的增长导致SAT的增长,可能原来已分配的初始存储区域以及第二存储区域都不够用,则还可以根据预分配空间策略预分配新的存储区域存储内部控制流。其中,所述预分配空间策略是指,在存储内部控制流时,当已分配的存储区域不够使用时,总是预分配新的存储区域来存储内部控制流,所有预分配的存储区域都分别为连续的扇区或扇区簇。
并且,在上述实施例中,扇区簇及预分配的存储空间的大小具体可以是,扇区簇是指大小为8k字节的连续完整的扇区;预分配的初始存储区域大小为8k字节,预分配新的存储区域的大小依次为80k字节(即第二存储区域)、800k字节、1M(兆)字节,当前一次预分配的存储区域大小为1M字节时,其后预分配的存储区域大小均为1M字节。当然,上述的扇区簇也可以是4k字节的整数倍大小的连续完整的扇区。
以下根据内部控制流的具体类型,给出一些进行预分配存储的实施例:
1)主扇区分配表的预分配方法
若每个MSAT扇区可以容纳128个SAT扇区的SID,则每个SAT扇区容纳128个扇区SID,这样1G字节的文件共需要64K字节大小的主扇区分配表。在复合文档的文件头,包含109个MSAT SID。这样即使不使用附加的MSAT,支持最大6.8M字节的复合文档。其中,1G=1024M=1024×1024K。
主扇区分配表的预分配方法即为,根据MSAT的大小及增长情况,不断分配新的存储区域进行存储,如设定初始存储区域大小为8K,第二存储区域为80K,其他不断预分配的存储区域大小依次为80K、800K、1M、1M、1M...。即,对于预分配的存储区域的大小的设定策略可为,对于小于1M的按10的倍数增长,大于1M的则固定为1M。对于已经使用的预分配的存储区域,把已使用的全部扇区串成MSAT扇区链,在MSAT扇区中对不存在的SAT的SID填-1。对小于1.28G的文件,除了文件头外,只有一处MSAT碎片,所以可以不考虑合并MSAT的问题。
2)扇区分配表的预分配方法
按复合文档的格式定义,SAT的大小与文件大小是直接对应的关系,理论上当SAT表增加时,复合文档大小也要增加,但是复合文档中存放的数据流大小可以不变。因为,现有技术中的复合文档(如,微软的复合文档),是没有预分配的概念,它的SAT表是随着复合文档大小增加而同时增加了;但是本发明实施例中的复合文档与现有技术中的复合文档不同的是,本发明实施例中的复合文档中的SAT表可以预先分配,复合文档大小增加的同时,复合文档中存放的数据大小是可以不增加的。
每个SAT扇区容纳128个扇区SID,这样1G的文件共需要8M大小的主扇区分配表。
类似MSAT的预分配情况,SAT的存储区域的预分配初始值也可为8k,以后分配的依次为80K、800K、1M、1M、1M...,即小于1M的按10的倍数增长,大于1M的固定为1M。对于小于800M的文件,共有8个SAT碎片。这种模式SAT碎片比较少,可以不用实现SAT合并。
由于SAT表中4个字节可以指向1个数据流的扇区(512字节),如果没有预分配,SAT占用空间是复合文档的4/512即1/128;本发明实施例中实现的预分配SAT的空间最大是当前已经使用的SAT空间的10倍。因此有,SAT预分配最大消耗10/128=8%的复合文档空间。
3)短流存放流的预分配方法
短流存放流是一个流的容器,用于存放用户所有小于4K的流。一般在即时通讯工具中大多数流都属于短流,例如gif或bmp资源类文件等等,以及小的配置类文件。因此短流存放流的碎片将极大影响复合文档的性能。
类似MSAT的预分配情况,短流存放流的存储区域的预分配初始值也可为8k,其余依次为80K、800K、1M、1M、1M...,即小于1M的按10的倍数增长,大于1M的固定为1M。若,预分配存储区域按1M固定预分配,则每次可以增加256个短流,按实际使用经验这个速度足以满足要求。
4)短扇区分配表的预分配方法
虽然看上去SSAT与短流存放流大小必须成正比,实际上Windows生成的复合文档中的SSAT可以超出这个数值。这样SSAT不必从512字节起始大小开始增长,其预分配方法和短流存放流的预分配方法一样,也使用模型:按8K、80K、800K、1M、1M、1M...增长。
因为短流存放流同SSAT不需要完全匹配,所以短流存放流扩容的触发点是在每次写入,当容量不够时再扩容(注意扩容后的最大值不能超过与SSAT匹配的尺寸)。
5)目录流的预分配方法
以微软复合文档为例,其格式定义中每个目录项固定128个字节。
目录流的预分配方法使用预分配模型为:初始为8K(可以容纳64个目录项),按8K、80K、800K、1M、1M、1M...增长,其中对于未用的目录项置为空目录项。这样若少于6400个目录项,只有80K、800K两处碎片,可以不实现合并目录流。
在上述各内部控制流的预分配存储方法中,可根据上述的预分配模型在当前预分配容量不够时,进行扩容,如,SAT的扩容触发点是写入数据流容量不够时;MSAT的扩容触发点是随着SAT表增加导致存放MSAT表空间不够时。
以上描述了内部控制流的预分配的存储方法,如图3所示,则为用户数据流(或称数据流)的预分配存储空间的存储方法,包括:
301、为当前正处于打开状态的复合文档,预留数据流存储空间。即,用户数据流的预分配都采用了预留空间模式,每次分配新的扇区簇或扇区,便预留指定大小的空间,随后的其它对象都不得使用该空间。如,写入一个数据流时,分配一块大小比当前写入的数据大小更大的连续的扇区簇供该流写入,因为当写入该流时,很有可能会稍后再次写入该流;为了2次写入的数据连续,可在写入的时候预留连续的一块空间供下次写入使用。
其中,数据流存储空间可以包括普通流存储空间或/和短流存储空间。则部分实施例中的普通流存储空间大小可为相应的当前流长度的50%或以上,所述短流存储空间大小为4k字节。
302、在预留的所述数据流存储空间中存储所述复合文档的数据流。
303、当该复合文档关闭时,释放预留的数据流存储空间中未使用的空间。
由于当前,可能存在多个用户数据流需要进行处理,则需要记录为各用户数据流预留的数据流存储空间的状态,以便当需要预留新的数据流存储空间时参考已预留的数据流存储空间的状态,则上述实施例中还包括:
401、记录当前处于打开状态的复合文档的预留数据流存储空间的状态。如,可在打开到关闭复合文档的生命周期中,在内存中建立一张预留空间状态表,保持对该复合文档预留空间状态的跟踪,用于请求空闲扇区簇时的参考。由于可能同时打开多个复合文档,因此在实现上述预留空间状态表时,如,采用代码实现上这个表时,该表可以是一个全局的地图(map),因此,各个复合文档的数据流预留的空间情况各个复合文档是相互知道的。
402、当需要为复合文档申请预留数据流存储空间时,在扇区分配表中查找没有被使用的扇区或扇区簇,确认该没有被使用的扇区或扇区簇不是已预留的数据流存储空间,将该没有被使用的也不是已预留的数据流存储空间的扇区或扇区簇分配为该复合文档的预留数据流存储空间。如,当申请新的扇区簇时,首先从SAT中找到没有被使用的扇区簇,同时确认该扇区簇不属于其它对象的预留空间才分配。预留的空间在SAT中不记录扇区链信息。
403、当该复合文档关闭时,删除关于该复合文档的预留数据流存储空间的状态的信息。如,当复合文档关闭时,预留空间状态表也同时销毁,不写入任何信息到文件。
根据上述实施例中描述的存储方法以下,根据用户数据流的类型描述不同数据流的实现预分配方法的一些实施例:
1)普通流的预分配方法
普通流的预分配使用预留空间模式:由于在大多数时候,当前打开并有过写入操作的流只占少部分,这样可以为这部分流预留比较大的空间,每次预留大小定义为当前流长度的50%,从而保持更小的碎片。如果这个预留空间在当前打开期间不能被利用到,下次打开复合文档会被别的流使用。
2)短流的预分配方法
按照微软复合文档格式的规定,小于4K的流即为短流。短流的预分配使用预留空间模式:为避免单个短流出现碎片,每个短流不论大小,统一为其预留4K空间。在实现时,按起始地址4K对齐的原则分配扇区,保证每个短流都有4K空间。
通过上述描述可知,采用预分配策略对复合文件中的内部控制流和用户数据流进行存储,可以减少复合文档中碎片的产生,并保证数据的连续性。
使用本发明实施例中的预分配策略后,复合文件***里面的数据理论上已经是一大块一大块的,这其中的一些内部控制流,例如SSAT/SAT需要经常访问,反复访问频率会比较高。
Windows虽然有缓冲预测算法,反复访问的内容会优先加入到缓存,但是由于它不理解文件中数据的具体应用,不知道数据的缓存优先级别,预测算法做不到100%可靠。因此,对于采用前述的实施例中描述的方法存储的复合文档,其读写可以相应的采用下述的方法进行,以进一步提高复合文档的读写效率。本发明实施例中的一种复合文档读写方法中,在读取内部控制流时,包括:
A1、在读取内部控制流的扇区或扇区簇时,判断该扇区或扇区簇的相邻的一个或多个扇区或扇区簇中是否也存储了与该内部控制流同类的内部控制流。其中,内部控制流为主扇区分配表、扇区分配表、短流存放流、短扇区分配表及目录流中的一种
A2、若判断结果为是,则将所述扇区或扇区簇以及与其相邻的一个或多个扇区或扇区簇存储的数据一次性读入。
如,在本发明实施例中当要读取SAT某个扇区(或扇区簇)时,会先判断一下与其左右相邻的数个扇区(或扇区簇)是否也是存放的SAT(SAT数组中存放的扇区标识有一些特殊标识,比如-3代表该扇区存放的是SAT),如果是,那就把这一块数据一次性读入。由于I/O消耗主要在磁头跳转,既然花了大量的时间跳到了目的地,就应该多读一点数据。因此,采用上述方案,不替代Windows缓存机制,只是简单的对需要经常访问的数据主动预读取一个大块,而不是按需要每次都读固定的块数,可以极大的提高I/O的效率。
另一方面在读取用户数据流时,现有技术中的复合文档,如微软实现的复合文档,按Sector为单位读写,如果读取一大块数据,需要一个一个依次调用SetFilePointerEx和ReadFile,这种方式有几个负面影响:(1)当读取一个扇区时,***会预读取后面一大片数据并缓存起来,如果请求的数据块大于***预计缓存的大小,会发生磁盘寻道(一般硬盘平均寻道时间在10ms以上)。(2)SetFilePointerEx和ReadFile属于内核调用,调用本身会有消耗,仅在在Hummer登录过程中,ReadFile和SetFilePointerEx调用总和超过4万次。(3)频繁I/O也会影响到即将开发的事务性文件***性能。
因此,本发明实施例中,在读取数据流时,则采用以下方法:
B1、在读取数据流时,判断该数据流中是否存在连续的数据块;
B2、当判断结果为是时,按最大连续快分批读取该数据流。
因为数据流预留空间策略保证了流数据的连续性,因此本发明实施例中的复合文档的读取缓存策略是尽量缓存当前读取流的数据;而现有技术中的复合文档的读缓存只是缓存了当前扇区的后面一部分扇区的数据,同时,由于有技术中的复合文档碎片多,这部分数据极有可能并不是当前流的数据。因此,采用上述本发明实施例中的读取数据的方法,可以解决上述现有技术中的问题。
另一方面,由于分配和释放扇区链表时需要频繁写入/擦除SAT/SSAT项,在本发明实施例中的流的数据块是成块连续的,相应的SAT表项也是连续的,因此在操作SAT表项时可采用如下步骤:
C1、在分配和释放扇区链表时,判断相应的内部控制流项是否连续;
C2、当判断结果为连续时,对该连续的内部控制流项进行批量操作。
相应于上述各方法的实施例,本发明实施例也提供了相应的实现装置,如图5所示,为相应的复合文档存储装置1,该装置包括:
控制流初始预分配模块10,用于为复合文档的内部控制流预分配初始存储区域,所述初始存储区域为连续的扇区或扇区簇。
控制流第二预分配模块12,用于在所述初始存储区域内存储所述内部控制流,并当所述内部控制流大小超出所述初始存储区域时,预分配第二存储区域以便存储超出的内部控制流,所述第二存储区域也为连续的扇区或扇区簇。
其中,内部控制流为主扇区分配表、扇区分配表、短流存放流、短扇区分配表及目录流中的一种或多种;并当所述内部控制流为主扇区分配表、扇区分配表、短流存放流、短扇区分配表及目录流中的多种时,所述控制流初始预分配模块10用于分别为各种不同的内部控制流预分配不同的初始存储区域。
如图6所示,该装置1还可包括:
控制流策略预分配模块14,用于当所述超出的内部控制流超过第二存储区域大小时,根据预分配空间策略预分配新的存储区域存储内部控制流;其中,所述预分配空间策略是指,在存储内部控制流时,当已分配的存储区域不够使用时,总是预分配新的存储区域来存储内部控制流,所有预分配的存储区域都分别为连续的扇区或扇区簇。
其中,在部分实施例中,扇区簇是指大小为8k字节的连续完整的扇区;预分配的初始存储区域大小为8k字节,预分配新的存储区域的大小依次为80k字节、800k字节、1M字节,当前一次预分配的存储区域大小为1M字节时,其后预分配的存储区域大小均为1M字节。
如图7和8所示,该装置1还可包括:
数据流预留模块11,用于为当前正处于打开状态的复合文档,预留数据流存储空间;
数据流存储模块13,用于在预留的所述数据流存储空间中存储所述复合文档的数据流;
数据流预留释放模块15,用于当该复合文档关闭时,释放预留的数据流存储空间中未使用的空间。
状态记录模块17,用于记录当前处于打开状态的复合文档的预留数据流存储空间的状态。若包括状态记录模块17则数据流预留模块15还用于当需要为复合文档申请预留数据流存储空间时,在扇区分配表中查找没有被使用的扇区或扇区簇,确认该没有被使用的扇区或扇区簇不是已预留的数据流存储空间,将该没有被使用的也不是已预留的数据流存储空间的扇区或扇区簇分配为该复合文档的预留数据流存储空间;数据流预留释放模块15还用于当该复合文档关闭时,删除关于该复合文档的预留数据流存储空间的状态的信息。
在图7和图8中虚线表示的模块和连线,表示该复合文档存储装置可以包括该模块也可以不包括。
其中,在部分实施例中,数据流存储空间包括普通流存储空间或/和短流存储空间,所述普通流存储空间大小为相应的当前流长度的50%或以上,所述短流存储空间大小为4k字节。
相应的如图9~11所示,为本发明实施例中的复合文档读写装置2,其包括:
扇区判断模块20,用于在读取内部控制流的扇区或扇区簇时,判断该扇区或扇区簇的相邻的一个或多个扇区或扇区簇中是否也存储了与该内部控制流同类的内部控制流;
控制流读取模块22,用于若判断结果为是,则将所述扇区或扇区簇以及与其相邻的一个或多个扇区或扇区簇存储的数据一次性读入。
数据流读取模块24,用于在读取数据流时,判断该数据流中是否存在连续的数据块,当判断结果为是时,按最大连续快分批读取该数据流。
控制流项判断模块26,用于在分配和释放扇区链表时,判断相应的内部控制流项是否连续;
批量操作模块28,用于当判断结果为连续时,对该连续的内部控制流项进行批量操作。
其中,内部控制流为主扇区分配表、扇区分配表、短流存放流、短扇区分配表及目录流中的一种。
上述装置实施例中的具体概念和执行方式与前述的方法实施例中的一致,此处不做赘述。
运用本发明实施例提出的预分配策略存储复合文档,并同时采取读缓存和批量写入的策略进行I/O,可以大幅提升复合文档的打开、读写性能。同时,采用本发明实施例中的复合文档的存储方法获得的复合文档完全兼容现有的复合文档。
与现有的微软复合文档相比,本发明实施例中的复合文档的读取的速度是微软复合文档的4倍左右,写入的速度新复合文档是微软复合文档的100倍左右。如图12~14可以看出新复合文档的性能要远远超过微软的复合文档。
在图12~14中,示意了采用本发明实施例中的方法与采用现有技术的方法的耗时对比。其中,图12是用微软复合文档(现有技术中的一种复合文档)接口打开db1的耗时和本发明实施例中的复合文档接口打开db2耗时的结果对比;图13是用微软复合文档接口模拟读取db1中7个好友的消息记录和本发明实施例中的复合文档接口模拟读取db2中7个好友消息记录的耗时对比;图14则是用微软复合文档接口模拟写入7个好友的消息记录和用本发明实施例中的复合文档接口模拟写入7个好友消息记录的耗时对比。
其中,上述3次实验用到的复合文档db是模拟即时通讯工具的消息记录的生成过程生成的:用微软的复合文档接口产生一个600M字节的复合文档数据(称为db1)和用本发明实施例中的复合文档接口产生一个600M字节的复合文档数据(称为db2)。
通过以上的实施方式的描述,本领域的技术人员可以清楚地了解到各实施方式可借助软件加必需的通用硬件平台的方式来实现,当然也可以通过硬件。基于这样的理解,上述技术方案本质上或者说对现有技术做出贡献的部分可以以软件产品的形式体现出来,该计算机软件产品可以存储在计算机可读存储介质中,如ROM/RAM、磁碟、光盘等,包括若干指令用以使得一台计算机设备(可以是个人计算机,服务器,或者网络设备等)执行各个实施例或者实施例的某些部分所述的方法。
以上所述的实施方式,并不构成对该技术方案保护范围的限定。任何在上述实施方式的精神和原则之内所作的修改、等同替换和改进等,均应包含在该技术方案的保护范围之内。
Claims (17)
1.一种复合文档存储方法,其特征在于,该方法包括:
为复合文档的内部控制流预分配初始存储区域,所述初始存储区域为连续的扇区或扇区簇;
在所述初始存储区域内存储所述内部控制流,并当所述内部控制流大小超出所述初始存储区域时,预分配第二存储区域以便存储超出的内部控制流,所述第二存储区域也为连续的扇区或扇区簇。
2.如权利要求1所述的方法,其特征在于,
所述内部控制流为主扇区分配表、扇区分配表、短流存放流、短扇区分配表及目录流中的一种或多种;
并当所述内部控制流为主扇区分配表、扇区分配表、短流存放流、短扇区分配表及目录流中的多种时,所述为复合文档的内部控制流预分配初始存储区域是指,分别为各种不同的内部控制流预分配不同的初始存储区域。
3.如权利要求2所述的方法,其特征在于,所述方法还包括,
当所述超出的内部控制流超过第二存储区域大小时,根据预分配空间策略预分配新的存储区域存储内部控制流;
其中,所述预分配空间策略是指,在存储内部控制流时,当已分配的存储区域不够使用时,总是预分配新的存储区域来存储内部控制流,所有预分配的存储区域都分别为连续的扇区或扇区簇。
4.如权利要求3所述的方法,其特征在于,所述扇区簇是指大小为8k字节的连续完整的扇区;所述预分配空间策略中,预分配的初始存储区域大小为8k字节,预分配新的存储区域的大小依次为80k字节、800k字节、1M字节,当前一次预分配的存储区域大小为1M字节时,其后预分配的存储区域大小均为1M字节。
5.如权利要求1至4中任一项所述的方法,其特征在于,所述方法还包括:
为当前正处于打开状态的复合文档,预留数据流存储空间;
在预留的所述数据流存储空间中存储所述复合文档的数据流;
当该复合文档关闭时,释放预留的数据流存储空间中未使用的空间。
6.如权利要求5所述的方法,其特征在于,所述方法还包括:
记录当前处于打开状态的复合文档的预留数据流存储空间的状态;
所述为当前正处于打开状态的复合文档,预留数据流存储空间包括:当需要为复合文档申请预留数据流存储空间时,在扇区分配表中查找没有被使用的扇区或扇区簇,确认该没有被使用的扇区或扇区簇不是已预留的数据流存储空间,将该没有被使用的也不是已预留的数据流存储空间的扇区或扇区簇分配为该复合文档的预留数据流存储空间;
所述当该复合文档关闭时,释放预留的数据流存储空间中未使用的空间还包括:当该复合文档关闭时,删除关于该复合文档的预留数据流存储空间的状态的信息。
7.一种复合文档读写方法,其特征在于,所述复合文档采用如权利要求1所述的方法存储内部控制流,所述复合文档读写方法包括:
在读取内部控制流的扇区或扇区簇时,判断该扇区或扇区簇的相邻的一个或多个扇区或扇区簇中是否也存储了与该内部控制流同类的内部控制流;
若判断结果为是,则将所述扇区或扇区簇以及与其相邻的一个或多个扇区或扇区簇存储的数据一次性读入。
8.如权利要求7所述的方法,其特征在于,所述内部控制流为主扇区分配表、扇区分配表、短流存放流、短扇区分配表及目录流中的一种。
9.如权利要求7所述的方法,其特征在于,所述复合文档采用预留数据流存储空间存储数据流,所述复合文档读写方法还包括:
在读取数据流时,判断该数据流中是否存在连续的数据块,当判断结果为是时,按最大连续快分批读取该数据流;
在分配和释放扇区链表时,判断相应的内部控制流项是否连续,当判断结果为连续时,对该连续的内部控制流项进行批量操作。
10.一种复合文档存储装置,其特征在于,该装置包括:
控制流初始预分配模块,用于为复合文档的内部控制流预分配初始存储区域,所述初始存储区域为连续的扇区或扇区簇;
控制流第二预分配模块,用于在所述初始存储区域内存储所述内部控制流,并当所述内部控制流大小超出所述初始存储区域时,预分配第二存储区域以便存储超出的内部控制流,所述第二存储区域也为连续的扇区或扇区簇。
11.如权利要求10所述的装置,其特征在于,所述内部控制流为主扇区分配表、扇区分配表、短流存放流、短扇区分配表及目录流中的一种或多种;
并当所述内部控制流为主扇区分配表、扇区分配表、短流存放流、短扇区分配表及目录流中的多种时,所述控制流初始预分配模块用于分别为各种不同的内部控制流预分配不同的初始存储区域。
12.如权利要求11所述的装置,其特征在于,所述装置还包括,
控制流策略预分配模块,用于当所述超出的内部控制流超过第二存储区域大小时,根据预分配空间策略预分配新的存储区域存储内部控制流;
其中,所述预分配空间策略是指,在存储内部控制流时,当已分配的存储区域不够使用时,总是预分配新的存储区域来存储内部控制流,所有预分配的存储区域都分别为连续的扇区或扇区簇。
13.如权利要求12所述的装置,其特征在于,所述扇区簇是指大小为8k字节的连续完整的扇区;所述预分配空间策略中,预分配的初始存储区域大小为8k字节,预分配新的存储区域的大小依次为80k字节、800k字节、1M字节,当前一次预分配的存储区域大小为1M字节时,其后预分配的存储区域大小均为1M字节。
14.如权利要求10至13中任一项所述的装置,其特征在于,所述装置还包括:
数据流预留模块,用于为当前正处于打开状态的复合文档,预留数据流存储空间;
数据流存储模块,用于在预留的所述数据流存储空间中存储所述复合文档的数据流;
数据流预留释放模块,用于当该复合文档关闭时,释放预留的数据流存储空间中未使用的空间。
15.如权利要求14所述的装置,其特征在于,所述装置还包括:
状态记录模块,用于记录当前处于打开状态的复合文档的预留数据流存储空间的状态;
数据流预留模块还用于当需要为复合文档申请预留数据流存储空间时,在扇区分配表中查找没有被使用的扇区或扇区簇,确认该没有被使用的扇区或扇区簇不是已预留的数据流存储空间,将该没有被使用的也不是已预留的数据流存储空间的扇区或扇区簇分配为该复合文档的预留数据流存储空间;
数据流预留释放模块还用于当该复合文档关闭时,删除关于该复合文档的预留数据流存储空间的状态的信息。
16.一种复合文档读写装置,其特征在于,所述复合文档采用如权利要求10所述的装置存储内部控制流,所述复合文档读写装置包括:
扇区判断模块,用于在读取内部控制流的扇区或扇区簇时,判断该扇区或扇区簇的相邻的一个或多个扇区或扇区簇中是否也存储了与该内部控制流同类的内部控制流;
控制流读取模块,用于若判断结果为是,则将所述扇区或扇区簇以及与其相邻的一个或多个扇区或扇区簇存储的数据一次性读入。
17.如权利要求16所述的装置,其特征在于,所述内部控制流为主扇区分配表、扇区分配表、短流存放流、短扇区分配表及目录流中的一种;
所述复合文档采用预留数据流存储空间存储数据流,所述复合文档读写装置还包括:
数据流读取模块,用于在读取数据流时,判断该数据流中是否存在连续的数据块,当判断结果为是时,按最大连续快分批读取该数据流;
控制流项判断模块,用于在分配和释放扇区链表时,判断相应的内部控制流项是否连续;
批量操作模块,用于当判断结果为连续时,对该连续的内部控制流项进行批量操作。
Priority Applications (4)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN201010042692.8A CN102122284B (zh) | 2010-01-08 | 2010-01-08 | 一种复合文档存储、读写方法和装置 |
RU2012133000/08A RU2525752C2 (ru) | 2010-01-08 | 2010-12-16 | Способ и устройство хранения, чтения и записи составного документа |
PCT/CN2010/079876 WO2011082622A1 (zh) | 2010-01-08 | 2010-12-16 | 复合文档存储、读写方法和装置 |
US13/537,950 US8788784B2 (en) | 2010-01-08 | 2012-06-29 | Method and device for storing and reading/writing composite document |
Applications Claiming Priority (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN201010042692.8A CN102122284B (zh) | 2010-01-08 | 2010-01-08 | 一种复合文档存储、读写方法和装置 |
Publications (2)
Publication Number | Publication Date |
---|---|
CN102122284A true CN102122284A (zh) | 2011-07-13 |
CN102122284B CN102122284B (zh) | 2014-07-02 |
Family
ID=44250845
Family Applications (1)
Application Number | Title | Priority Date | Filing Date |
---|---|---|---|
CN201010042692.8A Active CN102122284B (zh) | 2010-01-08 | 2010-01-08 | 一种复合文档存储、读写方法和装置 |
Country Status (4)
Country | Link |
---|---|
US (1) | US8788784B2 (zh) |
CN (1) | CN102122284B (zh) |
RU (1) | RU2525752C2 (zh) |
WO (1) | WO2011082622A1 (zh) |
Cited By (6)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN107122433A (zh) * | 2017-04-18 | 2017-09-01 | 广州视源电子科技股份有限公司 | 一种复合文档的合并方法及实现该方法的*** |
CN107533435A (zh) * | 2015-12-21 | 2018-01-02 | 华为技术有限公司 | 存储空间的分配方法及存储设备 |
CN107729558A (zh) * | 2017-11-08 | 2018-02-23 | 郑州云海信息技术有限公司 | 文件***碎片整理的方法、***、装置及计算机存储介质 |
CN110278141A (zh) * | 2018-03-14 | 2019-09-24 | 腾讯科技(深圳)有限公司 | 一种即时通讯信息的处理方法、装置及存储介质 |
CN110352410A (zh) * | 2016-09-29 | 2019-10-18 | 华睿泰科技有限责任公司 | 跟踪索引节点的访问模式以及预提取索引节点 |
CN111444154A (zh) * | 2020-03-26 | 2020-07-24 | 涵涡智航科技(玉溪)有限公司 | 一种在单片机***中高效存储日志文件的方法 |
Families Citing this family (1)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
US9612754B1 (en) * | 2015-06-29 | 2017-04-04 | EMC IP Holding Company LLC | Data storage system with window allocation using window cache |
Citations (3)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
EP1231549A2 (en) * | 2001-02-13 | 2002-08-14 | Fuji Photo Film Co., Ltd. | Database system for image attribute information |
CN101095115A (zh) * | 2004-11-05 | 2007-12-26 | 数据机器人技术公司 | 存储***条件指示器和方法 |
CN101414299A (zh) * | 2008-10-20 | 2009-04-22 | 腾讯科技(深圳)有限公司 | 复合文档的修复方法和装置 |
Family Cites Families (9)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
US5506983A (en) * | 1992-07-06 | 1996-04-09 | Microsoft Corporation | Method and system for transactioning of modifications to a tree structured file |
JP3460597B2 (ja) * | 1998-09-22 | 2003-10-27 | 日本電気株式会社 | 複合文書管理システム及び複合文書の構造管理方法ならびに複合文書構造管理プログラムを格納した記録媒体 |
WO2001057711A1 (en) * | 2000-02-02 | 2001-08-09 | Searchlogic.Com Corporation | Combinatorial query generating system and method |
US20050251617A1 (en) * | 2004-05-07 | 2005-11-10 | Sinclair Alan W | Hybrid non-volatile memory system |
US7783854B2 (en) * | 2006-06-08 | 2010-08-24 | Noam Camiel | System and method for expandable non-volatile storage devices |
US20080016088A1 (en) * | 2006-07-13 | 2008-01-17 | Zhen Hua Liu | Techniques of XML query optimization over dynamic heterogeneous XML containers |
US7577642B2 (en) * | 2006-07-13 | 2009-08-18 | Oracle International Corporation | Techniques of XML query optimization over static and dynamic heterogeneous XML containers |
US7831766B2 (en) | 2006-12-22 | 2010-11-09 | Comm Vault Systems, Inc. | Systems and methods of data storage management, such as pre-allocation of storage space |
US8549108B2 (en) * | 2011-09-29 | 2013-10-01 | Riverbed Technology, Inc. | Optimized prefetching of compound data |
-
2010
- 2010-01-08 CN CN201010042692.8A patent/CN102122284B/zh active Active
- 2010-12-16 WO PCT/CN2010/079876 patent/WO2011082622A1/zh active Application Filing
- 2010-12-16 RU RU2012133000/08A patent/RU2525752C2/ru active IP Right Revival
-
2012
- 2012-06-29 US US13/537,950 patent/US8788784B2/en active Active
Patent Citations (3)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
EP1231549A2 (en) * | 2001-02-13 | 2002-08-14 | Fuji Photo Film Co., Ltd. | Database system for image attribute information |
CN101095115A (zh) * | 2004-11-05 | 2007-12-26 | 数据机器人技术公司 | 存储***条件指示器和方法 |
CN101414299A (zh) * | 2008-10-20 | 2009-04-22 | 腾讯科技(深圳)有限公司 | 复合文档的修复方法和装置 |
Cited By (10)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN107533435A (zh) * | 2015-12-21 | 2018-01-02 | 华为技术有限公司 | 存储空间的分配方法及存储设备 |
CN107533435B (zh) * | 2015-12-21 | 2020-04-28 | 华为技术有限公司 | 存储空间的分配方法及存储设备 |
CN110352410A (zh) * | 2016-09-29 | 2019-10-18 | 华睿泰科技有限责任公司 | 跟踪索引节点的访问模式以及预提取索引节点 |
CN110352410B (zh) * | 2016-09-29 | 2023-01-20 | 华睿泰科技有限责任公司 | 跟踪索引节点的访问模式以及预提取索引节点 |
CN107122433A (zh) * | 2017-04-18 | 2017-09-01 | 广州视源电子科技股份有限公司 | 一种复合文档的合并方法及实现该方法的*** |
CN107122433B (zh) * | 2017-04-18 | 2020-07-24 | 广州视源电子科技股份有限公司 | 一种复合文档的合并方法及实现该方法的*** |
CN107729558A (zh) * | 2017-11-08 | 2018-02-23 | 郑州云海信息技术有限公司 | 文件***碎片整理的方法、***、装置及计算机存储介质 |
CN110278141A (zh) * | 2018-03-14 | 2019-09-24 | 腾讯科技(深圳)有限公司 | 一种即时通讯信息的处理方法、装置及存储介质 |
CN110278141B (zh) * | 2018-03-14 | 2021-08-31 | 腾讯科技(深圳)有限公司 | 一种即时通讯信息的处理方法、装置及存储介质 |
CN111444154A (zh) * | 2020-03-26 | 2020-07-24 | 涵涡智航科技(玉溪)有限公司 | 一种在单片机***中高效存储日志文件的方法 |
Also Published As
Publication number | Publication date |
---|---|
CN102122284B (zh) | 2014-07-02 |
RU2525752C2 (ru) | 2014-08-20 |
WO2011082622A1 (zh) | 2011-07-14 |
RU2012133000A (ru) | 2014-02-20 |
US20120272034A1 (en) | 2012-10-25 |
US8788784B2 (en) | 2014-07-22 |
Similar Documents
Publication | Publication Date | Title |
---|---|---|
CN102122284B (zh) | 一种复合文档存储、读写方法和装置 | |
CN105242881B (zh) | 分布式存储***及其数据读写方法 | |
CN104850358B (zh) | 一种磁光电混合存储***及其数据获取和存储方法 | |
CN105589812B (zh) | 磁盘碎片整理方法、装置及主机 | |
CN110347336A (zh) | 一种基于nvm与ssd混合存储结构的键值存储*** | |
CN100583832C (zh) | 数据管理方法及*** | |
CN106708427A (zh) | 一种适用于键值对数据的存储方法 | |
CN107066393A (zh) | 提高地址映射表中映射信息密度的方法 | |
CN103514249B (zh) | 一种数据自精简方法和***及存储装置 | |
CN106649349A (zh) | 用于游戏应用的数据缓存方法、装置和*** | |
CN104503703B (zh) | 缓存的处理方法和装置 | |
CN101373445B (zh) | 一种内存调度方法及装置 | |
CN100541453C (zh) | 大容量缓存实现方法及存储*** | |
CN103885887B (zh) | 用户数据存储方法、读取方法及*** | |
CN109947363A (zh) | 一种分布式存储***的数据缓存方法 | |
CN109766312A (zh) | 一种区块链存储方法、***、装置及计算机可读存储介质 | |
CN110058822A (zh) | 一种磁盘阵列横向拓展方法 | |
CN103488685B (zh) | 一种基于分布式存储***的碎片文件存储方法 | |
CN107239569A (zh) | 一种分布式文件***子树存储方法及装置 | |
CN108334541B (zh) | 一种数据存储方法、装置、设备及存储介质 | |
CN103942161B (zh) | 只读缓存的去冗余***及方法以及缓存的去冗余方法 | |
CN110007870A (zh) | 一种存储设备写请求处理方法及相关装置 | |
CN106445409A (zh) | 一种分布式块存储的数据写入方法及装置 | |
CN109471843A (zh) | 一种元数据缓存方法、***及相关装置 | |
CN108733324A (zh) | 一种固态硬盘的数据读写方法、装置、设备及存储介质 |
Legal Events
Date | Code | Title | Description |
---|---|---|---|
C06 | Publication | ||
PB01 | Publication | ||
C10 | Entry into substantive examination | ||
SE01 | Entry into force of request for substantive examination | ||
C14 | Grant of patent or utility model | ||
GR01 | Patent grant |