專利名稱:一種復合文檔存儲、讀寫方法和裝置的制作方法
技術領域:
本發(fā)明涉及數(shù)據(jù)處理領域,尤其涉及一種復合文檔存儲、讀寫方法和裝置。
背景技術:
復合文檔不僅包含文本而且包括圖形、電子表格數(shù)據(jù)、聲音、視頻圖像以及其它信 息。如即時通訊客戶端的文件就可以使用復合文檔來保存,比如消息記錄、表情文件等,隨 著及時通訊工具使用時間的增長,其相應的復合文檔會越來越大。如圖1所示為一種復合文檔的存儲(Morage)和流(Stream)的邏輯結構示意圖。 復合文檔的邏輯結構與文件系統(tǒng)的非常相似,每個文檔有一個根存儲(Root Storage),每 個存儲下面可以有0到多個存儲或流。每個存儲和流都有一個名字,該名字通常由16位的 Unicode字符構成,最大名字長度為31個字符。同一個存儲下的存儲或流的名字不能相同, 不同存儲下的存儲或流的名字可以相同。復合文檔除了頭結構以外,所有的數(shù)據(jù)都以流的形式組織。復合文檔的所有流都 被分成更小的數(shù)據(jù)塊,叫做扇區(qū)。扇區(qū)可能包含控制數(shù)據(jù)或用戶數(shù)據(jù)。整個復合文檔包含 一個頭結構,跟在頭結構后面的是一系列的扇區(qū)。所有扇區(qū)的大小都相同,這個大小值在頭 結構中設定。扇區(qū)以其在文件中的順序列舉,扇區(qū)的索引(從0開始)叫做扇區(qū)標識(SID),它 是一個有符號的32位整型值。如果一個SID不小于0,那么它一定指向一個存在的扇區(qū); 如果SID值為負,那么它可能有特殊的含義。構成一個流的所有扇區(qū)所形成的鏈表叫做扇區(qū)鏈,扇區(qū)鏈中相鄰的扇區(qū)在物理上 不一定相鄰,為了方便地表示扇區(qū)鏈中各個扇區(qū)的相對位置關系,引入了扇區(qū)標識鏈的概 念。扇區(qū)標識鏈是一個扇區(qū)標識的數(shù)組。扇區(qū)標識鏈以流中第一個扇區(qū)的扇區(qū)標識開始, 順次記錄流中扇區(qū)的扇區(qū)標識,以鏈表結束(-2)結尾。而復合文檔中的流按用途分,可以分為內(nèi)部控制流和用戶數(shù)據(jù)流。內(nèi)部控制流有 目錄流,主扇區(qū)分配表(MSAT),扇區(qū)分配表(SAT),短扇區(qū)分配表(SSAT),短流存放流。其中,主扇區(qū)配置表(MSAT,MasterSector Allocation Table)是一個 SID 數(shù)組, 順序指明了用于存放扇區(qū)配置表的扇區(qū)的SID。MSAT的大小等于用于存放SAT的扇區(qū)的個 數(shù),這個值存放在頭結構中。扇區(qū)配置表(SAT,Sector Allocation Table)是一個扇區(qū)標識的數(shù)組,它包含了 所有的用戶數(shù)據(jù)流和內(nèi)部控制流,SAT的大小等于整個復合文檔中存在的扇區(qū)個數(shù)。SAT數(shù) 組元素的索引就是該元素代表的扇區(qū)標識,而元素的值則為該元素代表的扇區(qū)在扇區(qū)鏈中 的下一個節(jié)點。SAT可能在任意位置包含F(xiàn)ree SID (-1),這些扇區(qū)將不被任何流使用;如果 該位置包含End of SIDChain(-2),表示一個流的結束;如果該位置包含SAT HD(_3),表示 所代表的扇區(qū)用于存放SAT ;如果該位置包含MSAT SID(-4),表示所代表的扇區(qū)用于存放 MSAT0短流存放流與其他的長度不小于標準流長度的普通用戶流一樣。它的扇區(qū)鏈中第一個扇區(qū)的SID存放在根存儲(Root Morage)的目錄項里。短流存放流的扇區(qū)標識鏈可 以從SAT中獲得。短扇區(qū)分配表(SSAT,Short Sector Allocation Table)就是一個扇區(qū)標識的數(shù) 組,包含了所有短流的扇區(qū)標識鏈。SSAT作為一個內(nèi)部控制流,它的創(chuàng)建過程與普通的流 的創(chuàng)建過程一致。SSAT的第一個扇區(qū)標識存放在頭結構中。SSAT作為一個扇區(qū)分配表,他 的作用與SAT極為相似,唯一的區(qū)別就是SSAT中的扇區(qū)標識指向的是短扇區(qū)而不是普通扇區(qū)。目錄流是一個內(nèi)部控制流,它包含了一個目錄項數(shù)組,每一個目錄項指向復合 文檔中的一個存儲或流,目錄流中以O為開始的目錄項索引稱為目錄項標識(directory entry identifier,DID)。在上述的復合文檔中沒有對扇區(qū)分配進行控制,導致大量碎片,1/0不停的在整個 復合文檔中跳轉,嚴重影響性能。其中主扇區(qū)分配表(MSAT)、扇區(qū)分配表(SAT)、短扇區(qū)分 配表(SSAT)、目錄項遍布于整個復合文檔中,嚴重影響復合文檔的打開、遍歷、讀寫等性能, 而對于流和短流,過小的分配單元和完全沒有控制的扇區(qū)分配,也造成了大量碎片。
發(fā)明內(nèi)容
本發(fā)明實施例所要解決的技術問題在于,提供一種復合文檔存儲、讀寫方法和裝 置,以減少復合文檔中的碎片。為此,本發(fā)明實施例提供了一種復合文檔存儲方法,包括為復合文檔的內(nèi)部控制 流預分配初始存儲區(qū)域,所述初始存儲區(qū)域為連續(xù)的扇區(qū)或扇區(qū)簇;在所述初始存儲區(qū)域內(nèi)存儲所述內(nèi)部控制流,并當所述內(nèi)部控制流大小超出所述 初始存儲區(qū)域時,預分配第二存儲區(qū)域以便存儲超出的內(nèi)部控制流,所述第二存儲區(qū)域也 為連續(xù)的扇區(qū)或扇區(qū)簇。相應地,本發(fā)明實施例還提供了一種復合文檔讀寫方法,所述復合文檔采用如前 所述的方法存儲內(nèi)部控制流,所述復合文檔讀寫方法包括在讀取內(nèi)部控制流的扇區(qū)時,判斷該扇區(qū)的相鄰的一個或多個扇區(qū)中是否也存儲 了與該內(nèi)部控制流同類的內(nèi)部控制流;若判斷結果為是,則將所述扇區(qū)以及與其相鄰的一個或多個扇區(qū)存儲的數(shù)據(jù)一次 性讀入。同時,本發(fā)明實施例還提供了一種復合文檔存儲裝置,該裝置包括控制流初始預分配模塊,用于為復合文檔的內(nèi)部控制流預分配初始存儲區(qū)域,所 述初始存儲區(qū)域為連續(xù)的扇區(qū)或扇區(qū)簇;控制流第二預分配模塊,用于在所述初始存儲區(qū)域內(nèi)存儲所述內(nèi)部控制流,并當 所述內(nèi)部控制流大小超出所述初始存儲區(qū)域時,預分配第二存儲區(qū)域以便存儲超出的內(nèi)部 控制流,所述第二存儲區(qū)域也為連續(xù)的扇區(qū)或扇區(qū)簇。本發(fā)明實施例還提供了一種復合文檔讀寫裝置,所述復合文檔采用如前所述的裝 置存儲內(nèi)部控制流,所述復合文檔讀寫裝置包括扇區(qū)判斷模塊,用于在讀取內(nèi)部控制流的扇區(qū)時,判斷該扇區(qū)的相鄰的一個或多 個扇區(qū)中是否也存儲了與該內(nèi)部控制流同類的內(nèi)部控制流;
6
控制流讀取模塊,用于若判斷結果為是,則將所述扇區(qū)以及與其相鄰的一個或多 個扇區(qū)存儲的數(shù)據(jù)一次性讀入。在本發(fā)明實施例所提供的方案中,對內(nèi)部控制流采用預分配存儲空間的策略進行 存儲,減少了復合文檔中的內(nèi)部控制流的碎片。相應的,由于預分配存儲空間,使得復合文 檔中的內(nèi)部控制流連續(xù)存儲的概論增加,可引入讀緩存和批量寫入的策略來優(yōu)化1/0,提高
讀寫效率。
圖1是現(xiàn)有技術中的一種復合文檔的存儲和流的邏輯結構示意圖;圖2是本發(fā)明實施例中的關于內(nèi)部控制流的預分配策略下的存儲方法的一個流 程示意圖;圖3是本發(fā)明實施例中的用戶數(shù)據(jù)流的預分配存儲空間的存儲方法一個流程示 意圖;圖4是在圖3中的存儲方法中記錄為各用戶數(shù)據(jù)流預留的數(shù)據(jù)存儲空間的狀態(tài)的 一個流程示意圖;圖5是本發(fā)明實施例中的復合文檔存儲裝置的一個流程示意圖;圖6是本發(fā)明實施例中的復合文檔存儲裝置的另一個流程示意圖;圖7是本發(fā)明實施例中的復合文檔存儲裝置的另一個流程示意圖;圖8是本發(fā)明實施例中的復合文檔存儲裝置的另一個流程示意圖;圖9是本發(fā)明實施例中的復合文檔讀寫裝置的一個流程示意圖;圖10是本發(fā)明實施例中的復合文檔讀寫裝置的另一個流程示意圖;圖11是本發(fā)明實施例中的復合文檔讀寫裝置的另一個流程示意圖;圖12是用微軟復合文檔接口打開dbl的耗時和本發(fā)明實施例中的復合文檔接口 打開db2耗時的結果對比示意圖;圖13是用微軟復合文檔接口模擬讀取dbl中7個好友的消息記錄和本發(fā)明實施 例中的復合文檔接口模擬讀取db2中7個好友消息記錄的耗時對比示意圖;圖14是用微軟復合文檔接口模擬寫入7個好友的消息記錄和用本發(fā)明實施例中 的復合文檔接口模擬寫入7個好友消息記錄的耗時對比示意圖。
具體實施例方式下面將結合本發(fā)明實施例中的附圖,對本發(fā)明實施例中的技術方案進行清楚、完 整地描述,顯然,所描述的實施例僅僅是本發(fā)明一部分實施例,而不是全部的實施例?;?本發(fā)明中的實施例,本領域普通技術人員在沒有作出創(chuàng)造性勞動前提下所獲得的所有其他 實施例,都屬于本發(fā)明保護的范圍。為了解決現(xiàn)有的復合文檔的碎片多導致的文件打開、讀寫性能差問題,本發(fā)明實 施例提出了一種完全兼容現(xiàn)有復合文檔格式的新復合文檔。在本發(fā)明實施例中的復合文檔 中,采用預分配策略(即對內(nèi)部控制流或/和用戶數(shù)據(jù)流預分配一定大小的存儲空間,以進 行相應的存儲)進行復合文檔的存儲,以保證數(shù)據(jù)塊的連續(xù)性,減少碎片的產(chǎn)生;另外,相 應于本發(fā)明實施例中的復合文檔的存儲方式,本發(fā)明實施例還提出了一種采取緩存讀取和批量寫入策略來優(yōu)化輸入/輸出(I/O),從而提升復合文檔的打開、讀寫性能。同時,在本發(fā)明實施例中的復合文檔可以以扇區(qū)為單位進行存儲,也可以以扇區(qū) 簇為單位進行存儲。在前期的研究發(fā)現(xiàn),現(xiàn)有的復合文檔(如微軟復合文檔)的MSAT,目 錄項,SSAT每個扇區(qū)都不連續(xù)。其分配粒度是512字節(jié)的扇區(qū),分配粒度過小,增加了碎 片形成的幾率,為從根源上減少碎片,本發(fā)明實施例中重新定義一個比較大一點的分配粒 度——扇區(qū)簇(類似磁盤管理中的簇)。按復合文檔的規(guī)范,小于4K字節(jié)GX IOM字節(jié), 或表示為4KB)的即為短流。因此可以選擇大于4K字節(jié)的粒度值,如8K字節(jié)做為簇的大小。 為實現(xiàn)簇分配單元模式,定義了一個非常簡單的原則,即每次分配都按照8K字節(jié)邊界對齊 分配扇區(qū),這樣保證分配粒度始終不小于一個扇區(qū)簇。因為簇大小8K字節(jié)正好是512字節(jié) 的整數(shù)倍,所以能完全兼容現(xiàn)有復合文檔格式。當然,根據(jù)具體的情況扇區(qū)簇的大小也可以 是其他數(shù)值,如為扇區(qū)大小的整數(shù)倍數(shù)值等。如前所述,在本發(fā)明實施例中的復合文檔中,采用預分配策略來進行復合文檔的 存儲。由于內(nèi)部控制流和用戶數(shù)據(jù)流的性質的不同,其具體的預分配策略是不同的。如圖 2所示,為本發(fā)明實施例中的關于內(nèi)部控制流的預分配策略下的存儲方法,包括201、為復合文檔的內(nèi)部控制流預分配初始存儲區(qū)域,所述初始存儲區(qū)域為連續(xù)的 扇區(qū)或扇區(qū)簇。在本實施例,以及本發(fā)明的其他實施例中所涉及的存儲區(qū)域的單位,既可以 是扇區(qū),也可以是前述的扇區(qū)簇;但,不論是扇區(qū)還是扇區(qū)簇,在某一具體實施例中,并不會 存在采用扇區(qū)和扇區(qū)簇混合作為存儲單位的情況,即在某一復合文檔的實現(xiàn)中,要么都是 采用扇區(qū)作為基本存儲單位,要么都是采用扇區(qū)簇作為基本存儲單位(在同一實施例中, 包括內(nèi)部控制流和后述的用戶數(shù)據(jù)流都采用相同的基本存儲單位進行存儲)。其中,本實施例中的內(nèi)部控制流可以是主扇區(qū)分配表、扇區(qū)分配表、短流存放流、 短扇區(qū)分配表及目錄流中的一種或多種。即可以是對復合文檔中的上述的某一種具體的內(nèi) 部控制流(如MSAT)采用本實施例中的預分配存儲區(qū)域的方案進行存儲,也可以是對復合 文檔中的多種或全部的內(nèi)部控制流都采用本實施例中的預分配存儲區(qū)域的方案進行存儲。需要說明的是,若是對復合文檔中的多種或全部的內(nèi)部控制流,所述為復合文檔 的內(nèi)部控制流預分配初始存儲區(qū)域是指,分別為各種不同的內(nèi)部控制流預分配不同的初始 存儲區(qū)域。202、在所述初始存儲區(qū)域內(nèi)存儲所述內(nèi)部控制流,并當所述內(nèi)部控制流大小超出 所述初始存儲區(qū)域時,預分配第二存儲區(qū)域以便存儲超出的內(nèi)部控制流,所述第二存儲區(qū) 域也為連續(xù)的扇區(qū)或扇區(qū)簇。在本發(fā)明實施例中,由于內(nèi)部控制流(如SAT)較大,或是由于復合文件的增長導 致SAT的增長,可能原來已分配的初始存儲區(qū)域以及第二存儲區(qū)域都不夠用,則還可以根 據(jù)預分配空間策略預分配新的存儲區(qū)域存儲內(nèi)部控制流。其中,所述預分配空間策略是指, 在存儲內(nèi)部控制流時,當已分配的存儲區(qū)域不夠使用時,總是預分配新的存儲區(qū)域來存儲 內(nèi)部控制流,所有預分配的存儲區(qū)域都分別為連續(xù)的扇區(qū)或扇區(qū)簇。并且,在上述實施例中,扇區(qū)簇及預分配的存儲空間的大小具體可以是,扇區(qū)簇是 指大小為池字節(jié)的連續(xù)完整的扇區(qū);預分配的初始存儲區(qū)域大小為池字節(jié),預分配新的存 儲區(qū)域的大小依次為80k字節(jié)(即第二存儲區(qū)域)、800k字節(jié)、IM(兆)字節(jié),當前一次預分 配的存儲區(qū)域大小為IM字節(jié)時,其后預分配的存儲區(qū)域大小均為IM字節(jié)。當然,上述的扇區(qū)簇也可以是4k字節(jié)的整數(shù)倍大小的連續(xù)完整的扇區(qū)。以下根據(jù)內(nèi)部控制流的具體類型,給出一些進行預分配存儲的實施例1)主扇區(qū)分配表的預分配方法若每個MSAT扇區(qū)可以容納1 個SAT扇區(qū)的SID,則每個SAT扇區(qū)容納1 個扇 區(qū)SID,這樣IG字節(jié)的文件共需要64K字節(jié)大小的主扇區(qū)分配表。在復合文檔的文件頭,包 含109個MSAT SID0這樣即使不使用附加的MSAT,支持最大6. 8M字節(jié)的復合文檔。其中, IG = 1024M = 1024X1024K。主扇區(qū)分配表的預分配方法即為,根據(jù)MSAT的大小及增長情況,不斷分配新的存 儲區(qū)域進行存儲,如設定初始存儲區(qū)域大小為8K,第二存儲區(qū)域為80K,其他不斷預分配的 存儲區(qū)域大小依次為80K、800K、1M、1M、1M...。即,對于預分配的存儲區(qū)域的大小的設定策 略可為,對于小于IM的按10的倍數(shù)增長,大于IM的則固定為1M。對于已經(jīng)使用的預分配 的存儲區(qū)域,把已使用的全部扇區(qū)串成MSAT扇區(qū)鏈,在MSAT扇區(qū)中對不存在的SAT的SID 填-1。對小于1.28G的文件,除了文件頭外,只有一處MSAT碎片,所以可以不考慮合并MSAT 的問題。2)扇區(qū)分配表的預分配方法按復合文檔的格式定義,SAT的大小與文件大小是直接對應的關系,理論上當SAT 表增加時,復合文檔大小也要增加,但是復合文檔中存放的數(shù)據(jù)流大小可以不變。因為,現(xiàn) 有技術中的復合文檔(如,微軟的復合文檔),是沒有預分配的概念,它的SAT表是隨著復合 文檔大小增加而同時增加了 ;但是本發(fā)明實施例中的復合文檔與現(xiàn)有技術中的復合文檔不 同的是,本發(fā)明實施例中的復合文檔中的SAT表可以預先分配,復合文檔大小增加的同時, 復合文檔中存放的數(shù)據(jù)大小是可以不增加的。每個SAT扇區(qū)容納1 個扇區(qū)SID,這樣IG的文件共需要8M大小的主扇區(qū)分配表。類似MSAT的預分配情況,SAT的存儲區(qū)域的預分配初始值也可為8k,以后分配的 依次為80K、800K、1M、1M、1M...,即小于IM的按10的倍數(shù)增長,大于IM的固定為1M。對于 小于800M的文件,共有8個SAT碎片。這種模式SAT碎片比較少,可以不用實現(xiàn)SAT合并。由于SAT表中4個字節(jié)可以指向1個數(shù)據(jù)流的扇區(qū)(512字節(jié)),如果沒有預分配, SAT占用空間是復合文檔的4/512即1/128 ;本發(fā)明實施例中實現(xiàn)的預分配SAT的空間最大 是當前已經(jīng)使用的SAT空間的10倍。因此有,SAT預分配最大消耗10/1 = 8%的復合文 檔空間。3)短流存放流的預分配方法短流存放流是一個流的容器,用于存放用戶所有小于4K的流。一般在即時通訊工 具中大多數(shù)流都屬于短流,例如gif或bmp資源類文件等等,以及小的配置類文件。因此短 流存放流的碎片將極大影響復合文檔的性能。類似MSAT的預分配情況,短流存放流的存儲區(qū)域的預分配初始值也可為池,其余 依次為80K、800K、1M、1M、1M...,即小于IM的按10的倍數(shù)增長,大于IM的固定為1M。若, 預分配存儲區(qū)域按IM固定預分配,則每次可以增加256個短流,按實際使用經(jīng)驗這個速度 足以滿足要求。4)短扇區(qū)分配表的預分配方法
雖然看上去SSAT與短流存放流大小必須成正比,實際上Windows生成的復合文檔 中的SSAT可以超出這個數(shù)值。這樣SSAT不必從512字節(jié)起始大小開始增長,其預分配方 法和短流存放流的預分配方法一樣,也使用模型按8K、80K、800K、1M、1M、1M...增長。因為短流存放流同SSAT不需要完全匹配,所以短流存放流擴容的觸發(fā)點是在每 次寫入,當容量不夠時再擴容(注意擴容后的最大值不能超過與SSAT匹配的尺寸)。5)目錄流的預分配方法以微軟復合文檔為例,其格式定義中每個目錄項固定1 個字節(jié)。目錄流的預分配方法使用預分配模型為初始為8K (可以容納64個目錄項),按 8K、80K、800K、1M、1M、1M...增長,其中對于未用的目錄項置為空目錄項。這樣若少于6400 個目錄項,只有80K、800K兩處碎片,可以不實現(xiàn)合并目錄流。在上述各內(nèi)部控制流的預分配存儲方法中,可根據(jù)上述的預分配模型在當前預分 配容量不夠時,進行擴容,如,SAT的擴容觸發(fā)點是寫入數(shù)據(jù)流容量不夠時;MSAT的擴容觸 發(fā)點是隨著SAT表增加導致存放MSAT表空間不夠時。以上描述了內(nèi)部控制流的預分配的存儲方法,如圖3所示,則為用戶數(shù)據(jù)流(或稱 數(shù)據(jù)流)的預分配存儲空間的存儲方法,包括301、為當前正處于打開狀態(tài)的復合文檔,預留數(shù)據(jù)流存儲空間。即,用戶數(shù)據(jù)流的 預分配都采用了預留空間模式,每次分配新的扇區(qū)簇或扇區(qū),便預留指定大小的空間,隨后 的其它對象都不得使用該空間。如,寫入一個數(shù)據(jù)流時,分配一塊大小比當前寫入的數(shù)據(jù)大 小更大的連續(xù)的扇區(qū)簇供該流寫入,因為當寫入該流時,很有可能會稍后再次寫入該流;為 了 2次寫入的數(shù)據(jù)連續(xù),可在寫入的時候預留連續(xù)的一塊空間供下次寫入使用。其中,數(shù)據(jù)流存儲空間可以包括普通流存儲空間或/和短流存儲空間。則部分實 施例中的普通流存儲空間大小可為相應的當前流長度的50%或以上,所述短流存儲空間大 小為4k字節(jié)。302、在預留的所述數(shù)據(jù)流存儲空間中存儲所述復合文檔的數(shù)據(jù)流。303、當該復合文檔關閉時,釋放預留的數(shù)據(jù)流存儲空間中未使用的空間。由于當前,可能存在多個用戶數(shù)據(jù)流需要進行處理,則需要記錄為各用戶數(shù)據(jù)流 預留的數(shù)據(jù)流存儲空間的狀態(tài),以便當需要預留新的數(shù)據(jù)流存儲空間時參考已預留的數(shù)據(jù) 流存儲空間的狀態(tài),則上述實施例中還包括401、記錄當前處于打開狀態(tài)的復合文檔的預留數(shù)據(jù)流存儲空間的狀態(tài)。如,可在 打開到關閉復合文檔的生命周期中,在內(nèi)存中建立一張預留空間狀態(tài)表,保持對該復合文 檔預留空間狀態(tài)的跟蹤,用于請求空閑扇區(qū)簇時的參考。由于可能同時打開多個復合文檔, 因此在實現(xiàn)上述預留空間狀態(tài)表時,如,采用代碼實現(xiàn)上這個表時,該表可以是一個全局的 地圖(map),因此,各個復合文檔的數(shù)據(jù)流預留的空間情況各個復合文檔是相互知道的。402、當需要為復合文檔申請預留數(shù)據(jù)流存儲空間時,在扇區(qū)分配表中查找沒有被 使用的扇區(qū)或扇區(qū)簇,確認該沒有被使用的扇區(qū)或扇區(qū)簇不是已預留的數(shù)據(jù)流存儲空間, 將該沒有被使用的也不是已預留的數(shù)據(jù)流存儲空間的扇區(qū)或扇區(qū)簇分配為該復合文檔的 預留數(shù)據(jù)流存儲空間。如,當申請新的扇區(qū)簇時,首先從SAT中找到?jīng)]有被使用的扇區(qū)簇, 同時確認該扇區(qū)簇不屬于其它對象的預留空間才分配。預留的空間在SAT中不記錄扇區(qū)鏈 fn息ο
403、當該復合文檔關閉時,刪除關于該復合文檔的預留數(shù)據(jù)流存儲空間的狀態(tài)的 信息。如,當復合文檔關閉時,預留空間狀態(tài)表也同時銷毀,不寫入任何信息到文件。根據(jù)上述實施例中描述的存儲方法以下,根據(jù)用戶數(shù)據(jù)流的類型描述不同數(shù)據(jù)流 的實現(xiàn)預分配方法的一些實施例1)普通流的預分配方法普通流的預分配使用預留空間模式由于在大多數(shù)時候,當前打開并有過寫入操 作的流只占少部分,這樣可以為這部分流預留比較大的空間,每次預留大小定義為當前流 長度的50%,從而保持更小的碎片。如果這個預留空間在當前打開期間不能被利用到,下次 打開復合文檔會被別的流使用。2)短流的預分配方法按照微軟復合文檔格式的規(guī)定,小于4K的流即為短流。短流的預分配使用預留空 間模式為避免單個短流出現(xiàn)碎片,每個短流不論大小,統(tǒng)一為其預留4K空間。在實現(xiàn)時, 按起始地址4K對齊的原則分配扇區(qū),保證每個短流都有4K空間。通過上述描述可知,采用預分配策略對復合文件中的內(nèi)部控制流和用戶數(shù)據(jù)流進 行存儲,可以減少復合文檔中碎片的產(chǎn)生,并保證數(shù)據(jù)的連續(xù)性。使用本發(fā)明實施例中的預分配策略后,復合文件系統(tǒng)里面的數(shù)據(jù)理論上已經(jīng)是一 大塊一大塊的,這其中的一些內(nèi)部控制流,例如SSAT/SAT需要經(jīng)常訪問,反復訪問頻率會 比較高。Windows雖然有緩沖預測算法,反復訪問的內(nèi)容會優(yōu)先加入到緩存,但是由于它不 理解文件中數(shù)據(jù)的具體應用,不知道數(shù)據(jù)的緩存優(yōu)先級別,預測算法做不到100%可靠。因 此,對于采用前述的實施例中描述的方法存儲的復合文檔,其讀寫可以相應的采用下述的 方法進行,以進一步提高復合文檔的讀寫效率。本發(fā)明實施例中的一種復合文檔讀寫方法 中,在讀取內(nèi)部控制流時,包括Al、在讀取內(nèi)部控制流的扇區(qū)或扇區(qū)簇時,判斷該扇區(qū)或扇區(qū)簇的相鄰的一個或 多個扇區(qū)或扇區(qū)簇中是否也存儲了與該內(nèi)部控制流同類的內(nèi)部控制流。其中,內(nèi)部控制流 為主扇區(qū)分配表、扇區(qū)分配表、短流存放流、短扇區(qū)分配表及目錄流中的一種A2、若判斷結果為是,則將所述扇區(qū)或扇區(qū)簇以及與其相鄰的一個或多個扇區(qū)或 扇區(qū)簇存儲的數(shù)據(jù)一次性讀入。如,在本發(fā)明實施例中當要讀取SAT某個扇區(qū)(或扇區(qū)簇)時,會先判斷一下與其 左右相鄰的數(shù)個扇區(qū)(或扇區(qū)簇)是否也是存放的SAT (SAT數(shù)組中存放的扇區(qū)標識有一些 特殊標識,比如-3代表該扇區(qū)存放的是SAT),如果是,那就把這一塊數(shù)據(jù)一次性讀入。由 于I/O消耗主要在磁頭跳轉,既然花了大量的時間跳到了目的地,就應該多讀一點數(shù)據(jù)。因 此,采用上述方案,不替代Windows緩存機制,只是簡單的對需要經(jīng)常訪問的數(shù)據(jù)主動預讀 取一個大塊,而不是按需要每次都讀固定的塊數(shù),可以極大的提高I/O的效率。另一方面在讀取用戶數(shù)據(jù)流時,現(xiàn)有技術中的復合文檔,如微軟實現(xiàn)的復合文檔, 按kctor為單位讀寫,如果讀取一大塊數(shù)據(jù),需要一個一個依次調(diào)用ktFiIePointerEx和 ReadFile,這種方式有幾個負面影響(1)當讀取一個扇區(qū)時,系統(tǒng)會預讀取后面一大片數(shù) 據(jù)并緩存起來,如果請求的數(shù)據(jù)塊大于系統(tǒng)預計緩存的大小,會發(fā)生磁盤尋道(一般硬盤 平均尋道時間在IOms以上)。(2)ktFilePointerEx和ReadFile屬于內(nèi)核調(diào)用,調(diào)用本身
11會有消耗,僅在在Hummer登錄過程中,ReadFile和^itFilePointerEx調(diào)用總和超過4萬 次。(3)頻繁I/O也會影響到即將開發(fā)的事務性文件系統(tǒng)性能。因此,本發(fā)明實施例中,在讀取數(shù)據(jù)流時,則采用以下方法Bi、在讀取數(shù)據(jù)流時,判斷該數(shù)據(jù)流中是否存在連續(xù)的數(shù)據(jù)塊;B2、當判斷結果為是時,按最大連續(xù)快分批讀取該數(shù)據(jù)流。因為數(shù)據(jù)流預留空間策略保證了流數(shù)據(jù)的連續(xù)性,因此本發(fā)明實施例中的復合文 檔的讀取緩存策略是盡量緩存當前讀取流的數(shù)據(jù);而現(xiàn)有技術中的復合文檔的讀緩存只是 緩存了當前扇區(qū)的后面一部分扇區(qū)的數(shù)據(jù),同時,由于有技術中的復合文檔碎片多,這部分 數(shù)據(jù)極有可能并不是當前流的數(shù)據(jù)。因此,采用上述本發(fā)明實施例中的讀取數(shù)據(jù)的方法,可 以解決上述現(xiàn)有技術中的問題。另一方面,由于分配和釋放扇區(qū)鏈表時需要頻繁寫入/擦除SAT/SSAT項,在本發(fā) 明實施例中的流的數(shù)據(jù)塊是成塊連續(xù)的,相應的SAT表項也是連續(xù)的,因此在操作SAT表項 時可采用如下步驟Cl、在分配和釋放扇區(qū)鏈表時,判斷相應的內(nèi)部控制流項是否連續(xù);C2、當判斷結果為連續(xù)時,對該連續(xù)的內(nèi)部控制流項進行批量操作。相應于上述各方法的實施例,本發(fā)明實施例也提供了相應的實現(xiàn)裝置,如圖5所 示,為相應的復合文檔存儲裝置1,該裝置包括控制流初始預分配模塊10,用于為復合文檔的內(nèi)部控制流預分配初始存儲區(qū)域, 所述初始存儲區(qū)域為連續(xù)的扇區(qū)或扇區(qū)簇??刂屏鞯诙A分配模塊12,用于在所述初始存儲區(qū)域內(nèi)存儲所述內(nèi)部控制流,并 當所述內(nèi)部控制流大小超出所述初始存儲區(qū)域時,預分配第二存儲區(qū)域以便存儲超出的內(nèi) 部控制流,所述第二存儲區(qū)域也為連續(xù)的扇區(qū)或扇區(qū)簇。其中,內(nèi)部控制流為主扇區(qū)分配表、扇區(qū)分配表、短流存放流、短扇區(qū)分配表及目 錄流中的一種或多種;并當所述內(nèi)部控制流為主扇區(qū)分配表、扇區(qū)分配表、短流存放流、短 扇區(qū)分配表及目錄流中的多種時,所述控制流初始預分配模塊10用于分別為各種不同的 內(nèi)部控制流預分配不同的初始存儲區(qū)域。如圖6所示,該裝置1還可包括控制流策略預分配模塊14,用于當所述超出的內(nèi)部控制流超過第二存儲區(qū)域大小 時,根據(jù)預分配空間策略預分配新的存儲區(qū)域存儲內(nèi)部控制流;其中,所述預分配空間策略 是指,在存儲內(nèi)部控制流時,當已分配的存儲區(qū)域不夠使用時,總是預分配新的存儲區(qū)域來 存儲內(nèi)部控制流,所有預分配的存儲區(qū)域都分別為連續(xù)的扇區(qū)或扇區(qū)簇。其中,在部分實施例中,扇區(qū)簇是指大小為池字節(jié)的連續(xù)完整的扇區(qū);預分配的 初始存儲區(qū)域大小為池字節(jié),預分配新的存儲區(qū)域的大小依次為80k字節(jié)、800k字節(jié)、IM 字節(jié),當前一次預分配的存儲區(qū)域大小為IM字節(jié)時,其后預分配的存儲區(qū)域大小均為IM字 節(jié)。如圖7和8所示,該裝置1還可包括數(shù)據(jù)流預留模塊11,用于為當前正處于打開狀態(tài)的復合文檔,預留數(shù)據(jù)流存儲空 間;數(shù)據(jù)流存儲模塊13,用于在預留的所述數(shù)據(jù)流存儲空間中存儲所述復合文檔的數(shù)據(jù)流;數(shù)據(jù)流預留釋放模塊15,用于當該復合文檔關閉時,釋放預留的數(shù)據(jù)流存儲空間 中未使用的空間。狀態(tài)記錄模塊17,用于記錄當前處于打開狀態(tài)的復合文檔的預留數(shù)據(jù)流存儲空間 的狀態(tài)。若包括狀態(tài)記錄模塊17則數(shù)據(jù)流預留模塊15還用于當需要為復合文檔申請預留 數(shù)據(jù)流存儲空間時,在扇區(qū)分配表中查找沒有被使用的扇區(qū)或扇區(qū)簇,確認該沒有被使用 的扇區(qū)或扇區(qū)簇不是已預留的數(shù)據(jù)流存儲空間,將該沒有被使用的也不是已預留的數(shù)據(jù)流 存儲空間的扇區(qū)或扇區(qū)簇分配為該復合文檔的預留數(shù)據(jù)流存儲空間;數(shù)據(jù)流預留釋放模塊 15還用于當該復合文檔關閉時,刪除關于該復合文檔的預留數(shù)據(jù)流存儲空間的狀態(tài)的信 肩、ο在圖7和圖8中虛線表示的模塊和連線,表示該復合文檔存儲裝置可以包括該模 塊也可以不包括。其中,在部分實施例中,數(shù)據(jù)流存儲空間包括普通流存儲空間或/和短流存儲空 間,所述普通流存儲空間大小為相應的當前流長度的50%或以上,所述短流存儲空間大小 為4k字節(jié)。相應的如圖9 11所示,為本發(fā)明實施例中的復合文檔讀寫裝置2,其包括扇區(qū)判斷模塊20,用于在讀取內(nèi)部控制流的扇區(qū)或扇區(qū)簇時,判斷該扇區(qū)或扇 區(qū)簇的相鄰的一個或多個扇區(qū)或扇區(qū)簇中是否也存儲了與該內(nèi)部控制流同類的內(nèi)部控制 流;控制流讀取模塊22,用于若判斷結果為是,則將所述扇區(qū)或扇區(qū)簇以及與其相鄰 的一個或多個扇區(qū)或扇區(qū)簇存儲的數(shù)據(jù)一次性讀入。數(shù)據(jù)流讀取模塊M,用于在讀取數(shù)據(jù)流時,判斷該數(shù)據(jù)流中是否存在連續(xù)的數(shù)據(jù) 塊,當判斷結果為是時,按最大連續(xù)快分批讀取該數(shù)據(jù)流??刂屏黜椗袛嗄K沈,用于在分配和釋放扇區(qū)鏈表時,判斷相應的內(nèi)部控制流項 是否連續(xù);批量操作模塊觀,用于當判斷結果為連續(xù)時,對該連續(xù)的內(nèi)部控制流項進行批量 操作。其中,內(nèi)部控制流為主扇區(qū)分配表、扇區(qū)分配表、短流存放流、短扇區(qū)分配表及目 錄流中的一種。上述裝置實施例中的具體概念和執(zhí)行方式與前述的方法實施例中的一致,此處不 做贅述。運用本發(fā)明實施例提出的預分配策略存儲復合文檔,并同時采取讀緩存和批量寫 入的策略進行1/0,可以大幅提升復合文檔的打開、讀寫性能。同時,采用本發(fā)明實施例中的 復合文檔的存儲方法獲得的復合文檔完全兼容現(xiàn)有的復合文檔。與現(xiàn)有的微軟復合文檔相比,本發(fā)明實施例中的復合文檔的讀取的速度是微軟復 合文檔的4倍左右,寫入的速度新復合文檔是微軟復合文檔的100倍左右。如圖12 14 可以看出新復合文檔的性能要遠遠超過微軟的復合文檔。在圖12 14中,示意了采用本發(fā)明實施例中的方法與采用現(xiàn)有技術的方法的耗 時對比。其中,圖12是用微軟復合文檔(現(xiàn)有技術中的一種復合文檔)接口打開dbl的耗時和本發(fā)明實施例中的復合文檔接口打開cft2耗時的結果對比;圖13是用微軟復合文檔接 口模擬讀取dbl中7個好友的消息記錄和本發(fā)明實施例中的復合文檔接口模擬讀取db2中 7個好友消息記錄的耗時對比;圖14則是用微軟復合文檔接口模擬寫入7個好友的消息記 錄和用本發(fā)明實施例中的復合文檔接口模擬寫入7個好友消息記錄的耗時對比。其中,上述3次實驗用到的復合文檔db是模擬即時通訊工具的消息記錄的生成過 程生成的用微軟的復合文檔接口產(chǎn)生一個600M字節(jié)的復合文檔數(shù)據(jù)(稱為dbl)和用本 發(fā)明實施例中的復合文檔接口產(chǎn)生一個600M字節(jié)的復合文檔數(shù)據(jù)(稱為db2)。通過以上的實施方式的描述,本領域的技術人員可以清楚地了解到各實施方式可 借助軟件加必需的通用硬件平臺的方式來實現(xiàn),當然也可以通過硬件?;谶@樣的理解,上 述技術方案本質上或者說對現(xiàn)有技術做出貢獻的部分可以以軟件產(chǎn)品的形式體現(xiàn)出來,該 計算機軟件產(chǎn)品可以存儲在計算機可讀存儲介質中,如ROM/RAM、磁碟、光盤等,包括若干指 令用以使得一臺計算機設備(可以是個人計算機,服務器,或者網(wǎng)絡設備等)執(zhí)行各個實施 例或者實施例的某些部分所述的方法。以上所述的實施方式,并不構成對該技術方案保護范圍的限定。任何在上述實施 方式的精神和原則之內(nèi)所作的修改、等同替換和改進等,均應包含在該技術方案的保護范 圍之內(nèi)。
1權利要求
1.一種復合文檔存儲方法,其特征在于,該方法包括為復合文檔的內(nèi)部控制流預分配初始存儲區(qū)域,所述初始存儲區(qū)域為連續(xù)的扇區(qū)或扇 區(qū)簇;在所述初始存儲區(qū)域內(nèi)存儲所述內(nèi)部控制流,并當所述內(nèi)部控制流大小超出所述初始 存儲區(qū)域時,預分配第二存儲區(qū)域以便存儲超出的內(nèi)部控制流,所述第二存儲區(qū)域也為連 續(xù)的扇區(qū)或扇區(qū)簇。
2.如權利要求1所述的方法,其特征在于,所述內(nèi)部控制流為主扇區(qū)分配表、扇區(qū)分配表、短流存放流、短扇區(qū)分配表及目錄流中 的一種或多種;并當所述內(nèi)部控制流為主扇區(qū)分配表、扇區(qū)分配表、短流存放流、短扇區(qū)分配表及目錄 流中的多種時,所述為復合文檔的內(nèi)部控制流預分配初始存儲區(qū)域是指,分別為各種不同 的內(nèi)部控制流預分配不同的初始存儲區(qū)域。
3.如權利要求2所述的方法,其特征在于,所述方法還包括,當所述超出的內(nèi)部控制流超過第二存儲區(qū)域大小時,根據(jù)預分配空間策略預分配新的 存儲區(qū)域存儲內(nèi)部控制流;其中,所述預分配空間策略是指,在存儲內(nèi)部控制流時,當已分配的存儲區(qū)域不夠使用 時,總是預分配新的存儲區(qū)域來存儲內(nèi)部控制流,所有預分配的存儲區(qū)域都分別為連續(xù)的 扇區(qū)或扇區(qū)簇。
4.如權利要求3所述的方法,其特征在于,所述扇區(qū)簇是指大小為池字節(jié)的連續(xù)完整 的扇區(qū);所述預分配空間策略中,預分配的初始存儲區(qū)域大小為池字節(jié),預分配新的存儲 區(qū)域的大小依次為80k字節(jié)、800k字節(jié)、IM字節(jié),當前一次預分配的存儲區(qū)域大小為IM字 節(jié)時,其后預分配的存儲區(qū)域大小均為IM字節(jié)。
5.如權利要求1至4中任一項所述的方法,其特征在于,所述方法還包括為當前正處于打開狀態(tài)的復合文檔,預留數(shù)據(jù)流存儲空間;在預留的所述數(shù)據(jù)流存儲空間中存儲所述復合文檔的數(shù)據(jù)流;當該復合文檔關閉時,釋放預留的數(shù)據(jù)流存儲空間中未使用的空間。
6.如權利要求5所述的方法,其特征在于,所述方法還包括記錄當前處于打開狀態(tài)的復合文檔的預留數(shù)據(jù)流存儲空間的狀態(tài);所述為當前正處于打開狀態(tài)的復合文檔,預留數(shù)據(jù)流存儲空間包括當需要為復合文 檔申請預留數(shù)據(jù)流存儲空間時,在扇區(qū)分配表中查找沒有被使用的扇區(qū)或扇區(qū)簇,確認該 沒有被使用的扇區(qū)或扇區(qū)簇不是已預留的數(shù)據(jù)流存儲空間,將該沒有被使用的也不是已預 留的數(shù)據(jù)流存儲空間的扇區(qū)或扇區(qū)簇分配為該復合文檔的預留數(shù)據(jù)流存儲空間;所述當該復合文檔關閉時,釋放預留的數(shù)據(jù)流存儲空間中未使用的空間還包括當該 復合文檔關閉時,刪除關于該復合文檔的預留數(shù)據(jù)流存儲空間的狀態(tài)的信息。
7.一種復合文檔讀寫方法,其特征在于,所述復合文檔采用如權利要求1所述的方法 存儲內(nèi)部控制流,所述復合文檔讀寫方法包括在讀取內(nèi)部控制流的扇區(qū)或扇區(qū)簇時,判斷該扇區(qū)或扇區(qū)簇的相鄰的一個或多個扇區(qū) 或扇區(qū)簇中是否也存儲了與該內(nèi)部控制流同類的內(nèi)部控制流;若判斷結果為是,則將所述扇區(qū)或扇區(qū)簇以及與其相鄰的一個或多個扇區(qū)或扇區(qū)簇存儲的數(shù)據(jù)一次性讀入。
8.如權利要求7所述的方法,其特征在于,所述內(nèi)部控制流為主扇區(qū)分配表、扇區(qū)分配 表、短流存放流、短扇區(qū)分配表及目錄流中的一種。
9.如權利要求7所述的方法,其特征在于,所述復合文檔采用預留數(shù)據(jù)流存儲空間存 儲數(shù)據(jù)流,所述復合文檔讀寫方法還包括在讀取數(shù)據(jù)流時,判斷該數(shù)據(jù)流中是否存在連續(xù)的數(shù)據(jù)塊,當判斷結果為是時,按最大 連續(xù)快分批讀取該數(shù)據(jù)流;在分配和釋放扇區(qū)鏈表時,判斷相應的內(nèi)部控制流項是否連續(xù),當判斷結果為連續(xù)時, 對該連續(xù)的內(nèi)部控制流項進行批量操作。
10.一種復合文檔存儲裝置,其特征在于,該裝置包括控制流初始預分配模塊,用于為復合文檔的內(nèi)部控制流預分配初始存儲區(qū)域,所述初 始存儲區(qū)域為連續(xù)的扇區(qū)或扇區(qū)簇;控制流第二預分配模塊,用于在所述初始存儲區(qū)域內(nèi)存儲所述內(nèi)部控制流,并當所述 內(nèi)部控制流大小超出所述初始存儲區(qū)域時,預分配第二存儲區(qū)域以便存儲超出的內(nèi)部控制 流,所述第二存儲區(qū)域也為連續(xù)的扇區(qū)或扇區(qū)簇。
11.如權利要求10所述的裝置,其特征在于,所述內(nèi)部控制流為主扇區(qū)分配表、扇區(qū)分 配表、短流存放流、短扇區(qū)分配表及目錄流中的一種或多種;并當所述內(nèi)部控制流為主扇區(qū)分配表、扇區(qū)分配表、短流存放流、短扇區(qū)分配表及目錄 流中的多種時,所述控制流初始預分配模塊用于分別為各種不同的內(nèi)部控制流預分配不同 的初始存儲區(qū)域。
12.如權利要求11所述的裝置,其特征在于,所述裝置還包括,控制流策略預分配模塊,用于當所述超出的內(nèi)部控制流超過第二存儲區(qū)域大小時,根 據(jù)預分配空間策略預分配新的存儲區(qū)域存儲內(nèi)部控制流;其中,所述預分配空間策略是指,在存儲內(nèi)部控制流時,當已分配的存儲區(qū)域不夠使用 時,總是預分配新的存儲區(qū)域來存儲內(nèi)部控制流,所有預分配的存儲區(qū)域都分別為連續(xù)的 扇區(qū)或扇區(qū)簇。
13.如權利要求12所述的裝置,其特征在于,所述扇區(qū)簇是指大小為池字節(jié)的連續(xù)完 整的扇區(qū);所述預分配空間策略中,預分配的初始存儲區(qū)域大小為池字節(jié),預分配新的存 儲區(qū)域的大小依次為80k字節(jié)、800k字節(jié)、IM字節(jié),當前一次預分配的存儲區(qū)域大小為IM 字節(jié)時,其后預分配的存儲區(qū)域大小均為IM字節(jié)。
14.如權利要求10至13中任一項所述的裝置,其特征在于,所述裝置還包括數(shù)據(jù)流預留模塊,用于為當前正處于打開狀態(tài)的復合文檔,預留數(shù)據(jù)流存儲空間;數(shù)據(jù)流存儲模塊,用于在預留的所述數(shù)據(jù)流存儲空間中存儲所述復合文檔的數(shù)據(jù)流;數(shù)據(jù)流預留釋放模塊,用于當該復合文檔關閉時,釋放預留的數(shù)據(jù)流存儲空間中未使 用的空間。
15.如權利要求14所述的裝置,其特征在于,所述裝置還包括狀態(tài)記錄模塊,用于記錄當前處于打開狀態(tài)的復合文檔的預留數(shù)據(jù)流存儲空間的狀態(tài);數(shù)據(jù)流預留模塊還用于當需要為復合文檔申請預留數(shù)據(jù)流存儲空間時,在扇區(qū)分配表中查找沒有被使用的扇區(qū)或扇區(qū)簇,確認該沒有被使用的扇區(qū)或扇區(qū)簇不是已預留的數(shù)據(jù) 流存儲空間,將該沒有被使用的也不是已預留的數(shù)據(jù)流存儲空間的扇區(qū)或扇區(qū)簇分配為該 復合文檔的預留數(shù)據(jù)流存儲空間;數(shù)據(jù)流預留釋放模塊還用于當該復合文檔關閉時,刪除關于該復合文檔的預留數(shù)據(jù)流 存儲空間的狀態(tài)的信息。
16.一種復合文檔讀寫裝置,其特征在于,所述復合文檔采用如權利要求10所述的裝 置存儲內(nèi)部控制流,所述復合文檔讀寫裝置包括扇區(qū)判斷模塊,用于在讀取內(nèi)部控制流的扇區(qū)或扇區(qū)簇時,判斷該扇區(qū)或扇區(qū)簇的相 鄰的一個或多個扇區(qū)或扇區(qū)簇中是否也存儲了與該內(nèi)部控制流同類的內(nèi)部控制流;控制流讀取模塊,用于若判斷結果為是,則將所述扇區(qū)或扇區(qū)簇以及與其相鄰的一個 或多個扇區(qū)或扇區(qū)簇存儲的數(shù)據(jù)一次性讀入。
17.如權利要求16所述的裝置,其特征在于,所述內(nèi)部控制流為主扇區(qū)分配表、扇區(qū)分 配表、短流存放流、短扇區(qū)分配表及目錄流中的一種;所述復合文檔采用預留數(shù)據(jù)流存儲空間存儲數(shù)據(jù)流,所述復合文檔讀寫裝置還包括 數(shù)據(jù)流讀取模塊,用于在讀取數(shù)據(jù)流時,判斷該數(shù)據(jù)流中是否存在連續(xù)的數(shù)據(jù)塊,當判 斷結果為是時,按最大連續(xù)快分批讀取該數(shù)據(jù)流;控制流項判斷模塊,用于在分配和釋放扇區(qū)鏈表時,判斷相應的內(nèi)部控制流項是否連續(xù);批量操作模塊,用于當判斷結果為連續(xù)時,對該連續(xù)的內(nèi)部控制流項進行批量操作。
全文摘要
本發(fā)明公開了一種復合文檔存儲、讀寫方法和裝置,該方法包括為復合文檔的內(nèi)部控制流預分配初始存儲區(qū)域,所述初始存儲區(qū)域為連續(xù)的扇區(qū)或扇區(qū)簇;在所述初始存儲區(qū)域內(nèi)存儲所述內(nèi)部控制流,并當所述內(nèi)部控制流大小超出所述初始存儲區(qū)域時,預分配第二存儲區(qū)域以便存儲超出的內(nèi)部控制流,所述第二存儲區(qū)域也為連續(xù)的扇區(qū)或扇區(qū)簇。采用本方法或裝置,可減少了復合文檔中的用戶數(shù)據(jù)流和內(nèi)部控制流的碎片。相應的,由于預分配存儲空間,使得復合文檔中的用戶數(shù)據(jù)流和內(nèi)部控制流連續(xù)存儲的概論增加,可引入讀緩存和批量寫入的策略來優(yōu)化I/O,提高讀寫效率。
文檔編號G06F17/30GK102122284SQ20101004269
公開日2011年7月13日 申請日期2010年1月8日 優(yōu)先權日2010年1月8日
發(fā)明者鄧立波, 陳祎 申請人:騰訊科技(深圳)有限公司