欧美在线观看视频网站,亚洲熟妇色自偷自拍另类,啪啪伊人网,中文字幕第13亚洲另类,中文成人久久久久影院免费观看 ,精品人妻人人做人人爽,亚洲a视频

一種空間數(shù)據(jù)引擎及應(yīng)用其管理空間數(shù)據(jù)的方法

文檔序號(hào):6618978閱讀:152來(lái)源:國(guó)知局
專利名稱:一種空間數(shù)據(jù)引擎及應(yīng)用其管理空間數(shù)據(jù)的方法
技術(shù)領(lǐng)域
本發(fā)明涉及地理信息技術(shù)領(lǐng)域,特別是涉及一種空間數(shù)據(jù)引擎及應(yīng)用其管 理空間數(shù)據(jù)的方法。
背景技術(shù)
空間數(shù)據(jù)是用于表示空間物體的位置、形狀、大小和分布特征等方面信息
的數(shù)據(jù),適用于描述二維、三維和多維分布的關(guān)于區(qū)域的現(xiàn)象??臻g凝:據(jù)的特 點(diǎn)是不僅包括物體本身的空間位置及狀態(tài)信息,還包4舌表示物體的空間關(guān)系的 信息??臻g數(shù)據(jù)引擎提供存儲(chǔ)、訪問(wèn)及檢索空間數(shù)據(jù)的功能,是用戶應(yīng)用系統(tǒng) 充分利用空間數(shù)據(jù)的關(guān)鍵。
在空間數(shù)據(jù)的生產(chǎn)中,需要一種適合數(shù)據(jù)編輯,具有恢復(fù)能力的空間數(shù)據(jù) 存儲(chǔ)載體?,F(xiàn)有技術(shù)中,針對(duì)空間數(shù)據(jù)的訪問(wèn)存儲(chǔ)問(wèn)題,有以下兩種解決方法
(1) 全內(nèi)存訪問(wèn)方法數(shù)據(jù)以文件方式存儲(chǔ),使用時(shí)將數(shù)據(jù)全部載入內(nèi) 存,訪問(wèn)在內(nèi)存中完成;
(2) 數(shù)據(jù)庫(kù)訪問(wèn)方法將數(shù)據(jù)存入數(shù)據(jù)庫(kù)中,數(shù)據(jù)訪問(wèn)交給數(shù)據(jù)庫(kù)引擎 來(lái)完成,通過(guò)數(shù)據(jù)庫(kù),系統(tǒng)具備了海量數(shù)據(jù)和事務(wù)處理的能力。
而在實(shí)現(xiàn)本發(fā)明的過(guò)程中,發(fā)明人發(fā)現(xiàn)現(xiàn)有技術(shù)中至少存在如下問(wèn)題 上述方法(1)雖然讀寫(xiě)操作簡(jiǎn)單、高效,但內(nèi)存占用大; 上述方法(2)的數(shù)據(jù)訪問(wèn)邏輯復(fù)雜、效率低下,許多功能難以定制。 在空間數(shù)據(jù)生產(chǎn)中,數(shù)據(jù)一般按區(qū)域存儲(chǔ),數(shù)據(jù)規(guī)模相對(duì)內(nèi)存偏大,生產(chǎn) 作業(yè)時(shí)數(shù)據(jù)更新頻繁;而且,由于空間數(shù)據(jù)繪制和數(shù)據(jù)作業(yè)批處理的要求,對(duì) 數(shù)據(jù)訪問(wèn)效率及內(nèi)存限制要求高,從而,需要提供一種適應(yīng)空間數(shù)據(jù)生產(chǎn)特點(diǎn) 的、效率高、且實(shí)現(xiàn)簡(jiǎn)單的空間數(shù)據(jù)引擎和空間數(shù)據(jù)存儲(chǔ)訪問(wèn)方法。

發(fā)明內(nèi)容
為了解決上述問(wèn)題,本發(fā)明的目的是提供一種基于內(nèi)存映射文件的空間數(shù)據(jù)引擎及應(yīng)用其管理空間數(shù)據(jù)的方法,該空間數(shù)據(jù)引擎及方法具有很高的數(shù)據(jù) 讀寫(xiě)性能,能夠適應(yīng)空間數(shù)據(jù)生產(chǎn)的特點(diǎn),且效率高、實(shí)現(xiàn)簡(jiǎn)單。
為了實(shí)現(xiàn)上述目的,本發(fā)明提供了一種空間數(shù)據(jù)引擎,包括 文件存儲(chǔ)管理^^莫塊,通過(guò)內(nèi)存映射文件來(lái)完成對(duì)物理文件中數(shù)據(jù)的加載或 將數(shù)據(jù)寫(xiě)入物理文件中、分配與所述物理文件相對(duì)應(yīng)的》茲盤(pán)空間、分配與所述 物理文件相對(duì)應(yīng)的內(nèi)存映射文件的映射對(duì)象、及管理所述物理文件的空閑塊列 表,所述物理文件包括數(shù)據(jù)文件和日志文件,所述物理文件的邏輯組織單元包 括數(shù)據(jù)頁(yè)、數(shù)據(jù)組塊、數(shù)據(jù)塊、數(shù)據(jù)段、數(shù)據(jù)區(qū)和數(shù)據(jù)對(duì)象;所述數(shù)據(jù)組塊 由多個(gè)連續(xù)的數(shù)據(jù)頁(yè)組成;所述數(shù)據(jù)塊由多個(gè)數(shù)據(jù)頁(yè)組成,所述數(shù)據(jù)塊的塊頭 記錄包含數(shù)據(jù)塊編號(hào)、數(shù)據(jù)段編號(hào)、數(shù)據(jù)對(duì)象編號(hào)、事務(wù)編號(hào);所述數(shù)據(jù)段 由定長(zhǎng)數(shù)據(jù)塊或定變長(zhǎng)數(shù)據(jù)塊組成,定長(zhǎng)數(shù)據(jù)塊中以行為單位存儲(chǔ)了定長(zhǎng)類型 的數(shù)據(jù)和固定長(zhǎng)度的變長(zhǎng)數(shù)據(jù)描述信息,包括在變長(zhǎng)塊中的位置及字節(jié)大小, 變長(zhǎng)數(shù)據(jù)塊中記錄了變長(zhǎng)的數(shù)據(jù)信息;所述數(shù)據(jù)區(qū)是數(shù)據(jù)段的集合,分為用戶 數(shù)據(jù)區(qū)和索引區(qū),所述用戶數(shù)據(jù)區(qū)記錄了用戶存儲(chǔ)的數(shù)據(jù),所述索引區(qū)記錄用 于定位所述用戶數(shù)據(jù)區(qū)中數(shù)據(jù)段的信息;所述數(shù)據(jù)對(duì)象,由一對(duì)數(shù)據(jù)區(qū)和索引 區(qū)構(gòu)成;
數(shù)據(jù)緩沖管理模塊,包括多個(gè)緩存塊,用于在對(duì)所述物理文件中的數(shù)據(jù)進(jìn) 行加栽或?qū)?shù)據(jù)寫(xiě)入物理文件時(shí),將欲力。載或欲寫(xiě)入的數(shù)據(jù)以數(shù)據(jù)頁(yè)為單位加 載到所述緩存塊中;
曰志管理模塊,用于創(chuàng)建及管理與數(shù)據(jù)文件相對(duì)應(yīng)的日志文件,在所述曰 志文件中記錄所述對(duì)應(yīng)數(shù)據(jù)文件中數(shù)據(jù)的變更;
數(shù)據(jù)訪問(wèn)接口模塊,用于提供用以訪問(wèn)所述物理文件中數(shù)據(jù)的數(shù)據(jù)集、表 及游標(biāo);所述數(shù)據(jù)集與所述物理文件相對(duì)應(yīng);每個(gè)數(shù)據(jù)集存儲(chǔ)了多張表,表中 的數(shù)據(jù)使用游標(biāo)來(lái)訪問(wèn),所述游標(biāo)提供了對(duì)表中行的訪問(wèn)方法,游標(biāo)中記錄了 它所指向行的信息。
另一方面,提供了 一種利用本發(fā)明實(shí)施例的空間數(shù)據(jù)引擎管理空間數(shù)據(jù)的 方法,其中,所述空間數(shù)據(jù)引擎中、在數(shù)據(jù)對(duì)象的索引區(qū)中記錄用戶數(shù)據(jù)區(qū)數(shù) 據(jù)段編號(hào)到該數(shù)據(jù)段中數(shù)據(jù)塊地址的映射對(duì)SIDX,所述空間數(shù)據(jù)引擎中、定 長(zhǎng)數(shù)據(jù)塊中所有行的字節(jié)數(shù)目相同,所述方法包括讀取數(shù)據(jù)文件中空間數(shù)據(jù)的步驟,所述讀取步驟具體包括
步驟a,根據(jù)游標(biāo)指向的、當(dāng)前欲讀取的數(shù)據(jù)集中數(shù)據(jù)行的行號(hào),確定所 述數(shù)據(jù)行對(duì)應(yīng)的數(shù)據(jù)段的編號(hào);
步驟b,根據(jù)所述數(shù)據(jù)段的編號(hào),從當(dāng)前數(shù)據(jù)對(duì)象的索引區(qū)中獲得所述數(shù) 據(jù)段中數(shù)據(jù)塊的地址信息;
步驟c,根據(jù)所述數(shù)據(jù)塊的地址信息,將所述數(shù)據(jù)段加載到數(shù)據(jù)緩沖管理 模塊的緩存塊中;
步驟d,從所述數(shù)據(jù)緩沖管理模塊的緩存塊中讀取所述數(shù)據(jù)段中的數(shù)據(jù)。 上述技術(shù)方案中的一個(gè)技術(shù)方案具有如下技術(shù)效果
基于本發(fā)明的新的數(shù)據(jù)邏輯組織結(jié)構(gòu)的物理文件、以及通過(guò)本發(fā)明的文件 存儲(chǔ)管理模塊、數(shù)據(jù)緩沖管理模塊、日志管理模塊和數(shù)據(jù)訪問(wèn)接口模塊,本發(fā) 明實(shí)施例的空間數(shù)據(jù)引擎可實(shí)現(xiàn)利用內(nèi)存映射文件的方式進(jìn)行空間數(shù)據(jù)的讀 寫(xiě),從而可以獲得很高的數(shù)據(jù)讀寫(xiě)性能,適應(yīng)了空間數(shù)據(jù)生產(chǎn)的特點(diǎn),且效率 高,實(shí)現(xiàn)簡(jiǎn)單。


圖1為本發(fā)明實(shí)施例的空間數(shù)據(jù)引擎的結(jié)構(gòu)示意圖2為本發(fā)明實(shí)施例的管理空間數(shù)據(jù)的方法中,讀取凄t據(jù)的流程示意圖。
具體實(shí)施例方式
為使本發(fā)明實(shí)施例要解決的技術(shù)問(wèn)題、技術(shù)方案和優(yōu)點(diǎn)更加清楚,下面將 結(jié)合附圖及具體實(shí)施例進(jìn)行詳細(xì)描述。
圖1為本發(fā)明的實(shí)施例的空間數(shù)據(jù)引擎的結(jié)構(gòu)示意圖。如圖1,本發(fā)明一 實(shí)施例的空間數(shù)據(jù)引擎包括文件存儲(chǔ)管理模塊101、數(shù)據(jù)緩沖管理模塊102、 日志管理模塊103、數(shù)據(jù)訪問(wèn)接口模塊104。
下面對(duì)各模塊的功能進(jìn)行較詳細(xì)的說(shuō)明。
文件存儲(chǔ)管理模塊,用于通過(guò)內(nèi)存映射文件來(lái)完成對(duì)物理文件中數(shù)據(jù)的 加載或?qū)?shù)據(jù)寫(xiě)入物理文件中、分配與物理文件相對(duì)應(yīng)的石茲盤(pán)空間、分配與物 理文件相對(duì)應(yīng)的內(nèi)存映射文件的映射對(duì)象、及管理物理文件的空閑塊列表。本發(fā)明的實(shí)施例中,系統(tǒng)維護(hù)的物理文件包括數(shù)據(jù)文件和日志文件,這兩個(gè)文 件的物理組織和格式相同。物理文件的邏輯組織單元按照從小到大分為數(shù)據(jù) 頁(yè)、數(shù)據(jù)組塊(CHUNK)、數(shù)據(jù)塊、數(shù)據(jù)段、數(shù)椐區(qū)和數(shù)據(jù)對(duì)象;其中,數(shù)據(jù) 組塊由多個(gè)連續(xù)的數(shù)據(jù)頁(yè)組成;數(shù)據(jù)塊由多個(gè)數(shù)據(jù)頁(yè)組成;數(shù)據(jù)段由定長(zhǎng)數(shù)據(jù) 塊或定變長(zhǎng)數(shù)據(jù)塊組成,定長(zhǎng)數(shù)據(jù)塊中以行為單位存儲(chǔ)了定長(zhǎng)類型的數(shù)據(jù)和固 定長(zhǎng)度的變長(zhǎng)數(shù)據(jù)描述信息,包括在變長(zhǎng)塊中的位置及字節(jié)大小,變長(zhǎng)數(shù)據(jù)塊 中記錄了變長(zhǎng)的數(shù)據(jù)信息,比如字符串,幾何信息等;數(shù)據(jù)區(qū)是數(shù)據(jù)段的集合, 分為用戶數(shù)據(jù)區(qū)和索引區(qū),用戶數(shù)據(jù)區(qū)用于記錄用戶存儲(chǔ)的數(shù)據(jù),索引區(qū)記錄 用于定位用戶數(shù)據(jù)區(qū)中數(shù)據(jù)段的信息;數(shù)據(jù)對(duì)象,由 一對(duì)數(shù)據(jù)區(qū)和索引區(qū)構(gòu)成; 所述數(shù)據(jù)對(duì)象包括表;
數(shù)據(jù)緩沖管理模塊,包括多個(gè)緩存塊,用于在對(duì)物理文件中的數(shù)據(jù)加載或 將數(shù)據(jù)寫(xiě)入物理文件中時(shí),將欲加載或欲寫(xiě)入的數(shù)據(jù)以數(shù)據(jù)頁(yè)為單位加載到緩 存塊中;
曰志管理模塊,用于創(chuàng)建及管理與數(shù)據(jù)文件相對(duì)應(yīng)的日志文件,在日志文 件中記錄對(duì)應(yīng)數(shù)據(jù)文件中數(shù)據(jù)的變更;
數(shù)據(jù)訪問(wèn)接口模塊,用于提供用以訪問(wèn)物理文件中數(shù)據(jù)的數(shù)據(jù)集、表及游 標(biāo);數(shù)據(jù)集與物理文件相對(duì)應(yīng);數(shù)據(jù)集的每個(gè)數(shù)據(jù)集存儲(chǔ)了一張或多張表,表 中的數(shù)據(jù)使用游標(biāo)來(lái)訪問(wèn),游標(biāo)提供了對(duì)表中行的訪問(wèn)方法,游標(biāo)中記錄了它 所指向行的信息,如當(dāng)前行序號(hào)、當(dāng)前行緩沖和/或當(dāng)前數(shù)據(jù)段的位置。
基于上述新定義的數(shù)據(jù)邏輯組織結(jié)構(gòu)的物理文件、以及通過(guò)上述文件存儲(chǔ) 管理模塊、數(shù)據(jù)緩沖管理模塊、日志管理模塊和數(shù)據(jù)訪問(wèn)接口模塊,本發(fā)明實(shí) 施例的空間數(shù)據(jù)引擎可實(shí)現(xiàn)利用內(nèi)存映射文件的方式進(jìn)行空間數(shù)據(jù)的讀寫(xiě),從 而可以獲得很高的數(shù)據(jù)讀寫(xiě)性能,適應(yīng)了空間數(shù)據(jù)生產(chǎn)的特點(diǎn),且效率高,實(shí) 現(xiàn)簡(jiǎn)單。
從層的角度來(lái)講,本發(fā)明實(shí)施例的空間數(shù)據(jù)引擎按照功能從低到高分為4 層文件存儲(chǔ)管理層、數(shù)據(jù)緩沖管理層、日志管理層、數(shù)據(jù)訪問(wèn)層。其中,文 件存儲(chǔ)管理層包括文件存儲(chǔ)管理模塊和物理文件。數(shù)據(jù)緩沖管理層包括數(shù) 據(jù)緩沖管理模塊。日志管理層包括日志管理模塊。數(shù)據(jù)訪問(wèn)層包括數(shù)據(jù)訪 問(wèn)接口模塊。
12示例性地,本發(fā)明的實(shí)施例中,對(duì)組成物理文件的上述各邏輯組織單元進(jìn)
行如下定義
定義l,數(shù)據(jù)頁(yè)P(yáng)AGE是數(shù)據(jù)組織的最小單元;示例性,但不作為限制地, 數(shù)據(jù)頁(yè)由64KB空間組成;
定義2,數(shù)據(jù)CHUNK由若千個(gè)連續(xù)的數(shù)據(jù)頁(yè)組成;
定義3,數(shù)據(jù)塊BLOCK由若干個(gè)數(shù)據(jù)頁(yè)組成;按存儲(chǔ)的數(shù)據(jù)類型可分為 定長(zhǎng)數(shù)據(jù)塊和變長(zhǎng)數(shù)據(jù)塊;數(shù)據(jù)塊的塊頭記錄中包含數(shù)據(jù)塊編號(hào)、數(shù)據(jù)段編號(hào)、 數(shù)據(jù)對(duì)象編號(hào)、事務(wù)編號(hào)等信息;
定義4,數(shù)據(jù)段SECTION為由定長(zhǎng)數(shù)據(jù)塊,或定變長(zhǎng)數(shù)據(jù)塊組成的邏輯 單位;定長(zhǎng)數(shù)據(jù)塊中以行為單位存儲(chǔ)了定長(zhǎng)類型的數(shù)據(jù)和固定長(zhǎng)度的、變長(zhǎng)數(shù) 據(jù)的描述信息,變長(zhǎng)數(shù)據(jù)的描述信息包括變長(zhǎng)數(shù)據(jù)在變長(zhǎng)數(shù)據(jù)塊中的位置及 變長(zhǎng)數(shù)據(jù)包括的字節(jié)數(shù)目,變長(zhǎng)數(shù)據(jù)塊中記錄了變長(zhǎng)的數(shù)據(jù)信息;
定義5,數(shù)據(jù)區(qū)EXTENT是數(shù)據(jù)段的集合,分為用戶數(shù)據(jù)區(qū)和索引區(qū); 用戶數(shù)據(jù)區(qū)用于記錄用戶存儲(chǔ)的數(shù)據(jù),索引區(qū)記錄的是用來(lái)定位用戶數(shù)據(jù)區(qū)中 數(shù)據(jù)段的信息;
定義6,數(shù)據(jù)對(duì)象由一對(duì)數(shù)據(jù)區(qū)和索引區(qū)構(gòu)成,在數(shù)據(jù)集中用編號(hào)來(lái)唯一 標(biāo)識(shí);表是一種數(shù)據(jù)對(duì)象。
現(xiàn)有技術(shù)的數(shù)據(jù)引擎實(shí)現(xiàn)多使用系統(tǒng)文件函數(shù)來(lái)讀寫(xiě)數(shù)據(jù),如SQLite, MySQL等,但該方法數(shù)據(jù)讀寫(xiě)效率低。本發(fā)明實(shí)施例的空間數(shù)據(jù)引擎通過(guò)內(nèi) 存映射文件來(lái)獲得較高的數(shù)據(jù)讀寫(xiě)性能。為解決內(nèi)存映射文件的文件大小在創(chuàng) 建后不能擴(kuò)展的問(wèn)題,本發(fā)明的實(shí)施例提出了一種在文件映射的物理空間不夠 時(shí),采取動(dòng)態(tài)分配數(shù)據(jù)塊的方法來(lái)解決該問(wèn)題。該動(dòng)態(tài)分配數(shù)據(jù)塊的方法可由 文件存儲(chǔ)管理模塊中的數(shù)據(jù)塊分配模塊來(lái)實(shí)現(xiàn)。下面對(duì)該動(dòng)態(tài)分配數(shù)據(jù)塊的方 法進(jìn)行詳細(xì)描述。
數(shù)據(jù)塊的分配ALLOC_BLOCK,用于在物理存儲(chǔ)文件中分配一個(gè)可用的 空閑塊。具體包括如下步驟
在向物理文件寫(xiě)入空間數(shù)據(jù)時(shí),如果當(dāng)前分配的映射對(duì)象的物理空間不夠 存儲(chǔ)欲寫(xiě)入的空間數(shù)據(jù),則通知與該物理文件對(duì)應(yīng)的數(shù)據(jù)集中已經(jīng)打開(kāi)的游標(biāo) 記錄當(dāng)前所加載的物理文件的地址、卸栽已經(jīng)加載的數(shù)據(jù)段,這些游標(biāo)在接到通知后,進(jìn)行相應(yīng)的記錄搡作和卸載操作;
根據(jù)欲寫(xiě)入的空間數(shù)據(jù)所需的物理空間,重新分配內(nèi)存映射文件的映射對(duì) 象,并根據(jù)重新分配的映射對(duì)象更新物理文件尾;
通知所有相關(guān)的游標(biāo)將在上述步驟中卸載的數(shù)據(jù)^:重新加栽到緩存塊中。
示例性地,在用戶修改數(shù)據(jù)文件時(shí),如利用 SET一XXX,MOVE一TO—INSERT一ROW修改數(shù)據(jù)文件時(shí),系統(tǒng)在日志文件中分 配塊;及,用戶將修改提交到數(shù)據(jù)文件中時(shí),對(duì)數(shù)據(jù)文件分配數(shù)據(jù)塊。上述 SET__XXX,MOVE_TO_INSERT_ROW的功能參見(jiàn)下文的詳細(xì)描述。
現(xiàn)有技術(shù)的數(shù)據(jù)引擎多采用B-TREE索引組織表來(lái)實(shí)現(xiàn)對(duì)數(shù)據(jù)的訪問(wèn),其 優(yōu)點(diǎn)是對(duì)于檢索行占全部數(shù)據(jù)量的比例很小且索引列是高基數(shù)列時(shí)性能突出, 但它對(duì)數(shù)據(jù)更新敏感, 一般來(lái)說(shuō)10%-15%的數(shù)據(jù)修改就需要重建索引。而空
間數(shù)據(jù)模型中表間相互引用關(guān)系復(fù)雜,針對(duì)主鍵的隨才;U企索普遍,比如道路網(wǎng)
的拓樸掛接關(guān)系。由于B-TREE對(duì)一個(gè)隨機(jī)的主鍵每次都需從根節(jié)點(diǎn)開(kāi)始來(lái)定 位行,隨機(jī)檢索性能不甚理想,因此,B-TREE不適合數(shù)據(jù)生產(chǎn)條件下的數(shù)據(jù) 組織。本發(fā)明實(shí)施例的空間數(shù)據(jù)引擎使用改進(jìn)的堆組織表來(lái)解決上述問(wèn)題,主 要包括
(1)空間系統(tǒng)引擎中、表的用戶數(shù)據(jù)區(qū)中的數(shù)據(jù)段使用雙向鏈表建立連
接;
(2 )在索引區(qū)中記錄用戶數(shù)據(jù)區(qū)數(shù)據(jù)段編號(hào)(SECTID)到該數(shù)據(jù)段中各 類型數(shù)據(jù)塊地址的映射對(duì),簡(jiǎn)稱為SIDX;
(3)定長(zhǎng)數(shù)據(jù)塊中所有行的字節(jié)大小相同。
對(duì)于行中的變長(zhǎng)數(shù)據(jù),定長(zhǎng)數(shù)據(jù)塊中存儲(chǔ)一個(gè)定長(zhǎng)的信息頭即固定長(zhǎng)度 的、變長(zhǎng)數(shù)據(jù)的描述信息,數(shù)據(jù)本身存儲(chǔ)在變長(zhǎng)數(shù)據(jù)塊中。因此一個(gè)定長(zhǎng)塊可 以容納的行數(shù)固定,固定塊內(nèi)的行緊跟上一行存儲(chǔ),這樣根據(jù)行序號(hào)就可以定 位到SECTID,進(jìn)而得到數(shù)據(jù)塊在文件中的位置信息。
針對(duì)基于主鍵的檢索可以建立另外一張索引表來(lái)定位行。索引和實(shí)際數(shù)據(jù) 存儲(chǔ)分開(kāi)后,在內(nèi)存中維護(hù)索引表,可以提高更新效率。
本發(fā)明實(shí)施例的空間數(shù)據(jù)引擎中,緩沖管理模塊包含多個(gè)緩存塊,用來(lái)實(shí) 現(xiàn)數(shù)據(jù)頁(yè)交換機(jī)制。上層系統(tǒng)需要的數(shù)據(jù)通過(guò)數(shù)據(jù)緩沖管理獲得。數(shù)據(jù)緩沖管理模塊包括如下模塊中的一個(gè)或多個(gè) w
數(shù)據(jù)段加載模塊,用于根據(jù)數(shù)據(jù)段編號(hào),加載定長(zhǎng)數(shù)據(jù)塊到所述數(shù)據(jù)緩沖 管理模塊的緩存塊中;
數(shù)據(jù)組塊加載模塊,用于根據(jù)數(shù)據(jù)段及數(shù)據(jù)頁(yè)編號(hào),加載變長(zhǎng)數(shù)據(jù)占用的 數(shù)據(jù)頁(yè)到所述數(shù)據(jù)緩沖管理模塊的緩存塊中。
具體的,數(shù)據(jù)緩沖管理模塊的主要功能如下 (1)數(shù)據(jù)段的加載LOAD_SECTION
功能根據(jù)數(shù)據(jù)段編號(hào)加載數(shù)據(jù)到緩存管理模塊中。
本系統(tǒng)只將需要的數(shù)據(jù)以數(shù)據(jù)頁(yè)為單位加載到緩存中。當(dāng)需要的數(shù)據(jù)還沒(méi) 加載時(shí),才進(jìn)行數(shù)據(jù)讀寫(xiě)。緩存塊根據(jù)訪問(wèn)即讀取的需要被不同數(shù)據(jù)頁(yè)重復(fù)使 用。上述方法可以減少內(nèi)存的占用和;茲盤(pán)讀寫(xiě)。為控制內(nèi)存占用,此函數(shù)只加 載定長(zhǎng)數(shù)據(jù)塊。在用戶使用游標(biāo)訪問(wèn)數(shù)據(jù)時(shí),使用該數(shù)據(jù)段的加載方法來(lái)加載 數(shù)據(jù)。
示例性地,在用戶使用游標(biāo)訪問(wèn)數(shù)據(jù)時(shí)加載數(shù)據(jù)段。 (2 )數(shù)據(jù)CHUNK的加載LOAD_CHUNK
功能根據(jù)數(shù)據(jù)段及數(shù)據(jù)頁(yè)編號(hào)加載數(shù)據(jù)到緩存管理模塊中。
由于數(shù)據(jù)變更, 一段時(shí)間后變長(zhǎng)數(shù)據(jù)塊可能比較大。為了減少內(nèi)存的占用, 系統(tǒng)只加載變長(zhǎng)數(shù)據(jù)占用的數(shù)據(jù)頁(yè)而不是整個(gè)變長(zhǎng)數(shù)據(jù)塊。示例性地,當(dāng)用戶 在修改或讀取變長(zhǎng)數(shù)據(jù)時(shí),根據(jù)變長(zhǎng)數(shù)據(jù)在變長(zhǎng)數(shù)據(jù)區(qū)中的位置和長(zhǎng)度,計(jì)算 該變長(zhǎng)數(shù)據(jù)對(duì)應(yīng)的lt據(jù)組塊,并加載。
示例性地,當(dāng)用戶在修改或讀取變長(zhǎng)數(shù)據(jù)時(shí),系統(tǒng)根據(jù)變長(zhǎng)數(shù)據(jù)在變長(zhǎng)數(shù) 據(jù)區(qū)的位置和長(zhǎng)度,計(jì)算其對(duì)應(yīng)的數(shù)據(jù)組塊即對(duì)應(yīng)占用的連續(xù)數(shù)據(jù)頁(yè),并加載。
本發(fā)明實(shí)施例的空間數(shù)據(jù)引擎中,日志管理模塊用于完成數(shù)據(jù)變更的記 錄,為事務(wù)及數(shù)據(jù)恢復(fù)提供基礎(chǔ)。為保證數(shù)據(jù)恢復(fù)的正確性,數(shù)據(jù)文件和日志 文件需要一種機(jī)制確保相互——對(duì)應(yīng)。日志文件和it據(jù)文件物理才各式相同,以 數(shù)據(jù)塊為單位記錄變更。每個(gè)事務(wù)存在一個(gè)事務(wù)編號(hào),用于表明事務(wù)發(fā)生的先 后順序。當(dāng)數(shù)據(jù)集正常關(guān)閉時(shí),系統(tǒng)會(huì)自動(dòng)刪除對(duì)應(yīng)的日志文件。示例性地, 曰志管理模塊包括如下模塊中的一個(gè)或多個(gè)
曰志文件創(chuàng)建^^塊,用于創(chuàng)建與數(shù)據(jù)文件一一對(duì)應(yīng)的日志文件,所述相對(duì)應(yīng)的數(shù)據(jù)文件和日志文件的文件頭中記錄的隨機(jī)數(shù)序列一致;
數(shù)據(jù)塊備份模塊,用于將指定的數(shù)據(jù)段從數(shù)據(jù)文件備份到對(duì)應(yīng)的日志文件 中,并在所述日志文件中為所述備^f分的數(shù)據(jù)塊分配一個(gè)用于標(biāo)識(shí)事務(wù)順序的、 遞增的事務(wù)編號(hào);
數(shù)據(jù)恢復(fù)模塊,用于將所述日志文件中的有效數(shù)據(jù)塊按照自身的事務(wù)編號(hào) 的順序恢復(fù)到所述翁:據(jù)文件中。
具體的,日志管理模塊主要功能為如下所示
(1) 日志管理模塊的創(chuàng)建CREATE—LOG 功能創(chuàng)建對(duì)應(yīng)的日志文件。
數(shù)據(jù)文件和日志文件通過(guò)文件名稱相互標(biāo)識(shí)。創(chuàng)建日志文件時(shí),在日志文 件頭和數(shù)據(jù)集文件頭中會(huì)記錄一個(gè)隨機(jī)數(shù)序列,當(dāng)日志文件和隨機(jī)數(shù)序列一致 時(shí),說(shuō)明日志文件和數(shù)據(jù)文件相互匹配。在提交所有修改之前,對(duì)應(yīng)表一直處 于無(wú)效^l大態(tài)。
(2) 數(shù)據(jù)塊的備份BACKUP—ON_LOG
功能將指定的數(shù)據(jù)段從物理文件備份到日志文件中。 由于數(shù)據(jù)塊可能被重復(fù)使用,因此數(shù)據(jù)塊的物理順序不能表明事務(wù)順序。 為了數(shù)據(jù)恢復(fù)的正確性,備份數(shù)據(jù)塊時(shí)同時(shí)要為其分配一個(gè)遞增的事務(wù)ID。 (3 )數(shù)據(jù)恢復(fù)RECOVERY
功能將日志文件中的有效數(shù)據(jù)塊按事務(wù)ID即事務(wù)編號(hào)的順序恢復(fù)到數(shù) 據(jù)文件中。
數(shù)據(jù)集打開(kāi)時(shí),系統(tǒng)都會(huì)檢查每個(gè)表, 一旦發(fā)現(xiàn)存在無(wú)效表,會(huì)進(jìn)行數(shù)據(jù) 恢復(fù)。在找到匹配的日志文件后,掃描對(duì)應(yīng)表的所有數(shù)據(jù)塊,對(duì)于多個(gè)數(shù)據(jù)塊 ID相同的數(shù)據(jù)塊,只保留事務(wù)ID最大的,恢復(fù)數(shù)據(jù)文件。
數(shù)據(jù)訪問(wèn)接口模塊對(duì)外提供訪問(wèn)數(shù)據(jù)的方法,包括數(shù)據(jù)集、表、游標(biāo)等的 實(shí)現(xiàn)。本發(fā)明的實(shí)施例中,數(shù)據(jù)訪問(wèn)接口模塊包括如下模塊中的一個(gè)或多個(gè)
新行加入模塊,用于向游標(biāo)中加入新的數(shù)據(jù)行;
游標(biāo)移動(dòng)模塊,用于根據(jù)行號(hào)在表中檢索行;
行數(shù)據(jù)訪問(wèn)模塊,用于讀取游標(biāo)當(dāng)前指向行的數(shù)據(jù);
定長(zhǎng)數(shù)據(jù)變更模塊,用于變更游標(biāo)當(dāng)前行定長(zhǎng)列的值;
16變長(zhǎng)數(shù)據(jù)變更模塊,用于變更游標(biāo)當(dāng)前行變長(zhǎng)列的值; 開(kāi)始事務(wù)模塊,用于開(kāi)始一個(gè)新的事務(wù); 提交修改模塊,用于將所有的數(shù)據(jù)變更提交到數(shù)據(jù)文件中; 回滾模塊,用于放棄自最近事務(wù)以來(lái)的所有變更。 優(yōu)選地,該新行加入模塊包括
空閑字節(jié)獲取單元,用于找到數(shù)據(jù)集的、當(dāng)前表的最后一個(gè)數(shù)據(jù)段,并得 到最后一個(gè)數(shù)據(jù)段中空閑字節(jié)的數(shù)目;
空閑空間判斷單元,用于判斷空閑字節(jié)的數(shù)目是否足夠存儲(chǔ)新加入的數(shù)據(jù) 行,并在判斷出空閑字節(jié)的數(shù)目足夠存儲(chǔ)新加入的數(shù)據(jù)行時(shí),在日志文件中備 份最后一個(gè)數(shù)據(jù)段,并更新當(dāng)前在索引區(qū)中記錄的數(shù)據(jù)段編號(hào)到數(shù)據(jù)段中數(shù)據(jù) 塊地址信息的映射對(duì);并在判斷出空閑字節(jié)的數(shù)目不夠時(shí),分配新數(shù)據(jù)段;
更新單元,用于將最后一個(gè)數(shù)據(jù)段或新數(shù)據(jù)段加載至數(shù)據(jù)緩沖管理模塊, 從緩存管理模塊中得到數(shù)據(jù)段,并更新當(dāng)前行序號(hào)、行緩存和當(dāng)前數(shù)據(jù)段。
示例性地,空閑空間判斷單元在判斷出空閑字節(jié)的數(shù)據(jù)不夠時(shí),分配新數(shù) 據(jù)段的方法同上文所述的數(shù)據(jù)塊的分配方法。
本發(fā)明實(shí)施例中,數(shù)據(jù)訪問(wèn)接口模塊還包括
下面對(duì)本發(fā)明實(shí)施例的數(shù)據(jù)訪問(wèn)接口模塊中數(shù)據(jù)集、表、游標(biāo)等的實(shí)現(xiàn)進(jìn) 4亍詳細(xì)i兌明。
數(shù)據(jù)集包含若干張表。 一個(gè)數(shù)據(jù)集在沒(méi)有被更新時(shí)對(duì)應(yīng)一個(gè)數(shù)據(jù)文件,當(dāng) 有數(shù)據(jù)更新時(shí),還會(huì)有一個(gè)日志文件。
表是行的集合,從類型上分用戶表、索引表和系統(tǒng)表三種。用戶表存儲(chǔ)了 用戶關(guān)心的數(shù)據(jù);索引表提供了快速檢索用戶表里行的途徑;系統(tǒng)表存儲(chǔ)了用 戶表的元凄t據(jù)和系統(tǒng)信息。
表使用表頭數(shù)據(jù)塊表示。創(chuàng)建表或打開(kāi)表就是在文件中創(chuàng)建或加載該數(shù)據(jù)塊。
用戶通過(guò)游標(biāo)訪問(wèn)表中數(shù)據(jù),分為只讀游標(biāo)和讀寫(xiě)游標(biāo)。允許多個(gè)讀游標(biāo) 和唯一的讀寫(xiě)游標(biāo)同時(shí)存在。游標(biāo)在內(nèi)部維護(hù)當(dāng)前4亍序號(hào)、當(dāng)前行緩沖、當(dāng)前 數(shù)據(jù)段、以及文件存儲(chǔ)管理模塊和數(shù)據(jù)緩沖管理;漠塊等的信息。如果是讀寫(xiě)游 標(biāo)還存在一個(gè)日志管理模塊。每個(gè)打開(kāi)的游標(biāo)都會(huì)加入到表的游標(biāo)集合中。定長(zhǎng)塊中可以容納的行數(shù)固定,各類型數(shù)據(jù)列大小固定。根據(jù)行號(hào)可以加 栽對(duì)應(yīng)數(shù)據(jù)塊,根據(jù)列在行中的偏移可得到對(duì)應(yīng)的數(shù)據(jù)。
在修改數(shù)據(jù)時(shí),在日志文件中復(fù)制還沒(méi)有備份的數(shù)據(jù)塊,并更新游標(biāo)的對(duì)
應(yīng)緩存,將數(shù)據(jù)的變更保留在日志文件中。提交事務(wù)時(shí)修改數(shù)據(jù)文件。本系統(tǒng) 由于使用內(nèi)存映射文件,在事務(wù)實(shí)現(xiàn)時(shí)與傳統(tǒng)方式有所不同,具體方法見(jiàn)下文。 下面對(duì)用于實(shí)現(xiàn)新行加入、游標(biāo)移動(dòng)、行數(shù)據(jù)訪問(wèn)、定長(zhǎng)數(shù)據(jù)變更、變長(zhǎng)數(shù)據(jù) 變更、開(kāi)始事務(wù)、提交修改、回滾等功能的功能模塊或功能函數(shù)進(jìn)行描述。其 中,行數(shù)據(jù)訪問(wèn)通過(guò)檢索定長(zhǎng)數(shù)據(jù)和檢索變長(zhǎng)數(shù)據(jù)來(lái)實(shí)現(xiàn)。
(1) 利用游標(biāo)向物理文件中加入新行MOVE—TO—INSERT—ROW 找到當(dāng)前表的最后一個(gè)數(shù)據(jù)段,并得到數(shù)據(jù)段的空閑字節(jié)數(shù)目; 如果這個(gè)數(shù)據(jù)段的空閑空間的大小不夠,則分配新數(shù)據(jù)段;否則,在日志
文件中a這個(gè)數(shù)據(jù)段,更新當(dāng)前SIDX,加載表最后一個(gè)數(shù)據(jù)段,從緩存管 理模塊中得到這個(gè)數(shù)據(jù)段,并更新當(dāng)前行序號(hào),行緩存和當(dāng)前數(shù)據(jù)段。
(2) 變更定長(zhǎng)數(shù)據(jù)SET_XXX,其中XXX代表定長(zhǎng)數(shù)據(jù)類型,如INT; 用于變更游標(biāo)當(dāng)前行定長(zhǎng)列的值;
判斷當(dāng)前行所在的定長(zhǎng)數(shù)據(jù)塊是否已經(jīng)備份到日志文件中;如果沒(méi)有,則 備份該定長(zhǎng)數(shù)據(jù)塊的數(shù)據(jù)到日志文件,重新從日志文件只加載這個(gè)塊到數(shù)據(jù)緩 存管理模塊的緩存塊中;
從數(shù)據(jù)緩存管理4莫塊中得到上述對(duì)應(yīng)的緩存塊
根據(jù)輸入的列序號(hào)得到列在行中的偏移,并復(fù)制輸入的數(shù)據(jù)到緩存塊中。
(3) 移動(dòng)MOVE—TO,用于根據(jù)行號(hào)在表中檢索行; 根據(jù)行序號(hào)計(jì)算行所在的數(shù)據(jù)段編號(hào)SECTID;
根據(jù)上述數(shù)據(jù)段編號(hào),從索引區(qū)的SIDX中得到該數(shù)據(jù)段在文件中的偏移, 并加載其到數(shù)據(jù)緩沖管理器中; 更新游標(biāo)的行緩沖。
上述游標(biāo)移動(dòng)it塊的功能通過(guò)該移動(dòng)函數(shù)實(shí)現(xiàn)。
(4) 檢索定長(zhǎng)數(shù)據(jù)GET—XXX, XXX為定長(zhǎng)數(shù)據(jù)類型,如INT等; 加載當(dāng)前行對(duì)應(yīng)的數(shù)據(jù)段定長(zhǎng)塊到內(nèi)存; 根據(jù)列序號(hào)得到列偏移;根據(jù)列偏移返回?cái)?shù)據(jù)。
(5)檢索變長(zhǎng)數(shù)據(jù)GET—BYTEARRAY,如檢索幾何信息的數(shù)據(jù); 加載當(dāng)前行對(duì)應(yīng)的數(shù)據(jù)段定長(zhǎng)塊到內(nèi)存; 根據(jù)列序號(hào)得到列偏移; 根據(jù)列偏移得到變長(zhǎng)描述信息;
加載變長(zhǎng)塊到內(nèi)存,根據(jù)變長(zhǎng)信息定位變長(zhǎng)塊中的數(shù)據(jù),并返回。 (6 )變更變長(zhǎng)數(shù)據(jù)類型的數(shù)據(jù)SET—BYTEARRAY 功能變更游標(biāo)當(dāng)前行變長(zhǎng)列的值。
從定長(zhǎng)數(shù)據(jù)塊中存儲(chǔ)的變長(zhǎng)信息頭中得到變長(zhǎng)列的變長(zhǎng)數(shù)據(jù)的相關(guān)信息, 包括變長(zhǎng)數(shù)據(jù)在數(shù)據(jù)塊內(nèi)的偏移及變長(zhǎng)數(shù)據(jù)包含的字節(jié)的數(shù)目;
根據(jù)變長(zhǎng)數(shù)據(jù)體即變長(zhǎng)數(shù)據(jù)的位置信息、塊內(nèi)的偏移、變長(zhǎng)數(shù)據(jù)包含的字 節(jié)數(shù)目,定位數(shù)據(jù)體所占用的數(shù)據(jù)頁(yè),并判斷這個(gè)連續(xù)的數(shù)據(jù)頁(yè)是否已經(jīng)加載 到游標(biāo)緩存中,如果沒(méi)有,則加載數(shù)據(jù)頁(yè);
如果當(dāng)前變長(zhǎng)列數(shù)據(jù)占用的空間大小足夠存儲(chǔ)輸入的變長(zhǎng)數(shù)據(jù),則直接將 輸入的變長(zhǎng)數(shù)據(jù)存入,并結(jié)束流程;
如果當(dāng)前變長(zhǎng)列數(shù)據(jù)占用的空間的大小不夠存儲(chǔ)輸入的變長(zhǎng)數(shù)據(jù),且當(dāng)前 變長(zhǎng)塊中有空閑的空間,則直接將輸入的數(shù)據(jù)復(fù)制到空閑空間,更新SIDX; 如果當(dāng)前變長(zhǎng)列數(shù)據(jù)占用的空間的大小不夠存儲(chǔ)輸入的變長(zhǎng)數(shù)據(jù),且當(dāng)前變長(zhǎng) 塊中沒(méi)有空閑的空間,則分配新擴(kuò)大的變長(zhǎng)數(shù)據(jù)塊,復(fù)制原變長(zhǎng)塊到新塊,更 新SIDX;
重新加載對(duì)應(yīng)的數(shù)據(jù)頁(yè)到緩存塊中。將原變長(zhǎng)數(shù)據(jù)塊加入空閑列表中;計(jì) 算存儲(chǔ)輸入的變長(zhǎng)數(shù)據(jù)所占用的數(shù)據(jù)頁(yè),將計(jì)算出的數(shù)據(jù)頁(yè)加載到緩存塊中; 記錄這個(gè)存儲(chǔ)了變長(zhǎng)數(shù)據(jù)的變長(zhǎng)數(shù)據(jù)槽的大??;復(fù)制數(shù)據(jù)到變長(zhǎng)數(shù)據(jù)的空閑位 置中;在定長(zhǎng)塊中更新對(duì)應(yīng)變長(zhǎng)塊的存儲(chǔ)信息。 (7)開(kāi)始事務(wù)START_TRANSACTION
功能開(kāi)始一個(gè)新的事務(wù)。
將游標(biāo)當(dāng)前的SIDX、行序號(hào)壓入事務(wù)棧中、并復(fù)制一個(gè)新的SIDX作為 游標(biāo)的當(dāng)前SIDX,遞增事務(wù)ID。 (8 )提交修改COMMIT
19功能將所有的數(shù)據(jù)變更提交到數(shù)據(jù)文件中。 找到所有已備份到日志文件中的數(shù)據(jù)段; 在數(shù)據(jù)文件的表頭中標(biāo)識(shí)開(kāi)始提交日志文件; 復(fù)制日志文件中的數(shù)據(jù)段到數(shù)據(jù)文件中;
對(duì)于重新分配的數(shù)據(jù)塊,更新SIDX,將廢棄的塊加入數(shù)據(jù)文件空閑塊列 表;標(biāo)識(shí)這個(gè)表有步文;
將已經(jīng)提交的日志文件中的數(shù)據(jù)塊加入日志文件的空閑塊列表; 清空事務(wù)棧。重新加栽當(dāng)前行,當(dāng)前數(shù)據(jù)段; 將原來(lái)的緩存塊重新/人數(shù)據(jù)文件中加載; 通知所有游標(biāo)重新更新它們的緩存塊; (9)回滾ROLLBACK 功能:放棄自最近事務(wù)開(kāi)始以來(lái)的所有變更。 如果事務(wù)棧為空,返回;
在當(dāng)前SIDX中將所有屬于當(dāng)前事務(wù)ID的數(shù)據(jù)段標(biāo)識(shí)廢棄,全部回收到 空閑鏈表中;
釋放當(dāng)前SIDX。將事務(wù)棧頂?shù)腟IDX作為當(dāng)前SIDX。重新加載游標(biāo)的當(dāng) 前行和數(shù)據(jù)段;
將原來(lái)映射到當(dāng)前事務(wù)ID的日志的緩存塊重新加載。
為了加快數(shù)據(jù)的檢索,數(shù)據(jù)引擎中需要建立索引。B-TREE的隨才緣索性 能不佳,本系統(tǒng)使用表來(lái)實(shí)現(xiàn)。這個(gè)表中存儲(chǔ)的是主鍵-行序號(hào)映射對(duì)。用戶 根據(jù)內(nèi)存的占用情況可以選擇是全部加載到內(nèi)#,還是以游標(biāo)的方式。除主鍵 外的其他字段也可以建立索引表。
本發(fā)明實(shí)施例的空間數(shù)據(jù)51擎可嵌入到具體的空間數(shù)據(jù)應(yīng)用系統(tǒng)中。 本發(fā)明的實(shí)施例還提供了 一種利用上述實(shí)施例的空間數(shù)據(jù)引擎管理空間 數(shù)據(jù)的方法。在前文對(duì)本發(fā)明實(shí)施例的空間數(shù)據(jù)引擎的描述中,已結(jié)合描述了 應(yīng)用本發(fā)明實(shí)施例的空間數(shù)據(jù)引擎管理空間數(shù)據(jù)的方法。在此,僅對(duì)本發(fā)明實(shí) 施例的管理空間數(shù)據(jù)的方法的主要步驟進(jìn)行描述,具體實(shí)現(xiàn)細(xì)節(jié)可參照前文中 的相應(yīng)描述。
本發(fā)明實(shí)施例的管理空間數(shù)據(jù)的方法,包括讀取數(shù)據(jù)文件中空間數(shù)據(jù)的步驟。圖2為本發(fā)明實(shí)施例的方法中,讀取步驟的流程示意圖。如圖2,該讀取 步驟包括
步驟201,根據(jù)游標(biāo)指向的、當(dāng)前欲讀取的數(shù)據(jù)集中數(shù)據(jù)行的行號(hào),確定 數(shù)據(jù)行對(duì)應(yīng)的數(shù)據(jù)段的編號(hào);
步驟202,根據(jù)數(shù)據(jù)段的編號(hào),從當(dāng)前數(shù)據(jù)對(duì)象的索引區(qū)中獲得數(shù)據(jù)段中 數(shù)據(jù)塊的地址信息;
步驟203,根據(jù)數(shù)據(jù)塊的地址信息,將數(shù)據(jù)段加載到數(shù)據(jù)緩沖管理模塊的 緩存塊中;
步驟204,從數(shù)據(jù)緩沖管理模塊的緩存塊中讀取數(shù)據(jù)段中的數(shù)據(jù)。
本發(fā)明實(shí)施例的管理空間數(shù)據(jù)的方法,實(shí)現(xiàn)了基于內(nèi)存映射文件的訪問(wèn)物 理文件中的數(shù)據(jù),上層系統(tǒng)需要的數(shù)據(jù)通過(guò)游標(biāo)從數(shù)據(jù)緩沖管理模塊中的緩存 塊獲得,與現(xiàn)有技術(shù)的管理空間數(shù)據(jù)的方法相比,提高了數(shù)據(jù)訪問(wèn)的效率。
示例性地,步驟201中,由于每個(gè)定長(zhǎng)塊中存儲(chǔ)的行數(shù)固定,例如每塊存 儲(chǔ)5行,且除最后一塊外全部存滿,因此當(dāng)需要檢索第31行時(shí),SECTID = 31/5,該行在定長(zhǎng)塊中的位置為31%5即31除以5的余數(shù)。
優(yōu)選地,該實(shí)施例的方法,其中,在步驟201之后,步驟202之前,還包 括步驟bl:根據(jù)數(shù)據(jù)段的編號(hào),判斷數(shù)據(jù)段是否已加載到了數(shù)據(jù)緩沖管理模 塊的緩存塊中;如是,則轉(zhuǎn)入執(zhí)行步驟203;否則,執(zhí)行步驟204。
本發(fā)明的該實(shí)施例在實(shí)現(xiàn)物理文件的訪問(wèn)時(shí),只在緩存塊中加載未曾加載 過(guò)的數(shù)據(jù),不重復(fù)加載已經(jīng)加載過(guò)的數(shù)據(jù),這樣能提高訪問(wèn)的效率,節(jié)約內(nèi)存。
優(yōu)選地,該實(shí)施例的方法,其中,步驟bl包括如下步驟
判斷數(shù)據(jù)段是否已備份到對(duì)應(yīng)的日志文件中;如是,則確定出數(shù)據(jù)段已加 載到了數(shù)據(jù)緩沖管理模塊的緩存塊中;否則,確定出數(shù)據(jù)段未加載到數(shù)據(jù)緩沖 管理模塊的緩存塊。
優(yōu)選地,該實(shí)施例的方法,其中,步驟203中,將數(shù)據(jù),爻加載到數(shù)據(jù)緩沖 管理模塊的緩存塊中的步驟包括以數(shù)據(jù)頁(yè)為單位,將數(shù)據(jù)段的定長(zhǎng)數(shù)據(jù)塊加 載到數(shù)據(jù)緩沖管理才莫塊的緩存塊中;和/或,以數(shù)據(jù)頁(yè)為單位,將數(shù)據(jù)段的變 長(zhǎng)數(shù)據(jù)塊中變長(zhǎng)數(shù)據(jù)占用的數(shù)據(jù)頁(yè)加載到數(shù)據(jù)緩沖管理模塊的緩存塊中。
優(yōu)選地,該實(shí)施例的方法,其中,還包括將數(shù)據(jù)寫(xiě)入數(shù)據(jù)文件的步驟,寫(xiě)入步驟具體包括
步驟m,根據(jù)數(shù)據(jù)文件對(duì)應(yīng)的數(shù)據(jù)集中、表的總行數(shù),確定最后一個(gè)數(shù)據(jù) 段的編號(hào);
步驟n,判斷最后一個(gè)數(shù)據(jù)段的空閑空間是否足夠存儲(chǔ)欲寫(xiě)入的空間數(shù) 據(jù);如是,則執(zhí)行步驟p;否則,執(zhí)行步驟q;
步驟p,在對(duì)應(yīng)的日志文件中備份最后一個(gè)數(shù)據(jù)段,更新當(dāng)前索引區(qū)中記 錄的、用戶數(shù)據(jù)區(qū)數(shù)據(jù)段編號(hào)到數(shù)據(jù)段中數(shù)據(jù)塊地址的映射對(duì),將最后一個(gè)數(shù) 據(jù)段加載到數(shù)據(jù)緩沖管理模塊的緩存塊中,從數(shù)據(jù)緩沖管理模塊的緩存塊中得 到最后一個(gè)數(shù)據(jù)段,并更新當(dāng)前行序號(hào)、行緩存和當(dāng)前數(shù)據(jù)段,結(jié)束流程;
步驟q,在對(duì)應(yīng)的日志文件中新分配一個(gè)數(shù)據(jù)段,并將新分配的數(shù)據(jù)段加 載到數(shù)據(jù)緩沖管理模塊的緩存塊中,從緩存塊中讀取新分配的數(shù)據(jù)段,在新分 配的數(shù)據(jù)段中分配用于存儲(chǔ)欲寫(xiě)入的空間數(shù)據(jù)的新的空間,并更新當(dāng)前行序 號(hào)、行緩存和當(dāng)前數(shù)據(jù)段。
本發(fā)明實(shí)施例的方法中,寫(xiě)入操作是用戶通過(guò)游標(biāo)觸發(fā)的。本發(fā)明實(shí)施例 的上述將數(shù)據(jù)寫(xiě)入數(shù)據(jù)文件的步驟是在用戶寫(xiě)操作之前的步驟,在執(zhí)行完上述 寫(xiě)入步驟后,用戶直接修改內(nèi)存即可,內(nèi)存映射文件有個(gè)特性就是對(duì)內(nèi)存的修 改會(huì)直接體現(xiàn)在磁盤(pán)的文件上。
其中,步驟q中,采用上述數(shù)據(jù)塊的分配ALLOC一BLOCK的方法來(lái)實(shí)現(xiàn) 在曰志文件中新分配一個(gè)數(shù)據(jù)段。
優(yōu)選地,該實(shí)施例的管理空間數(shù)據(jù)的方法中,在步驟m之后,步驟n之 前,還包括
判斷最后一個(gè)數(shù)據(jù)段是否已備份到對(duì)應(yīng)的日志文件中;如是,則在數(shù)據(jù)緩 沖管理模塊中得到最后一個(gè)數(shù)據(jù)段對(duì)應(yīng)的緩存塊,并將該緩存塊的內(nèi)容修改為 欲寫(xiě)入的數(shù)據(jù),結(jié)束當(dāng)前流程;否則,執(zhí)行步驟n。
優(yōu)選地,該實(shí)施例的管理空間數(shù)據(jù)的方法中,還包括變更游標(biāo)當(dāng)前行變 長(zhǎng)列的數(shù)據(jù)的步驟,包括
步驟i,得到變長(zhǎng)列對(duì)應(yīng)的變長(zhǎng)數(shù)據(jù)的位置信息、在數(shù)據(jù)塊內(nèi)的偏移、以 及變長(zhǎng)列對(duì)應(yīng)的變長(zhǎng)數(shù)據(jù)包含的字節(jié)數(shù)目,定位變長(zhǎng)數(shù)據(jù)所涉及的數(shù)據(jù)頁(yè),并 判斷變長(zhǎng)數(shù)據(jù)所涉及的數(shù)據(jù)頁(yè)是否已經(jīng)加載到游標(biāo)緩存中,如是,則執(zhí)行步驟j;否則,加載變長(zhǎng)數(shù)據(jù)所占用的數(shù)據(jù)頁(yè);
步驟j,在當(dāng)前變長(zhǎng)列的空間大小不夠存儲(chǔ)欲寫(xiě)入的變長(zhǎng)數(shù)據(jù)、且當(dāng)前變 長(zhǎng)數(shù)據(jù)塊中沒(méi)有空閑的空間時(shí),分配新的、擴(kuò)大的變長(zhǎng)數(shù)據(jù)塊,復(fù)制原變長(zhǎng)數(shù) 據(jù)塊到新變長(zhǎng)數(shù)據(jù)塊,更新當(dāng)前索引區(qū)中記錄的、數(shù)據(jù)段編號(hào)到數(shù)據(jù)段中數(shù)據(jù) 塊地址信息的映射對(duì),并重新加載對(duì)應(yīng)的數(shù)據(jù)頁(yè)到數(shù)據(jù)緩沖管理模塊的緩存塊 中;
步驟k,將變更前的原變長(zhǎng)數(shù)據(jù)塊加入空閑列表中;計(jì)算存儲(chǔ)輸入的變長(zhǎng) 數(shù)據(jù)需占用的數(shù)據(jù)頁(yè),并將占用的數(shù)據(jù)頁(yè)加載到數(shù)據(jù)緩沖管理模塊的緩存塊
中;
步驟l,記錄變長(zhǎng)數(shù)據(jù)塊的大小,復(fù)制數(shù)據(jù)到變長(zhǎng)數(shù)據(jù)的空閑位置中,在 定長(zhǎng)塊中更新對(duì)應(yīng)變長(zhǎng)塊的存儲(chǔ)信息。
該實(shí)施例的步驟j中,分配新的、擴(kuò)大的變長(zhǎng)數(shù)據(jù)塊的方法同前文所述的 數(shù)據(jù)塊的分配的方法。
下面對(duì)具體實(shí)現(xiàn)中,如何利用本發(fā)明實(shí)施例的管理空間數(shù)據(jù)的方法進(jìn)行空 間數(shù)據(jù)的存儲(chǔ)和讀取進(jìn)行舉例說(shuō)明。
用戶通過(guò)數(shù)據(jù)訪問(wèn)接口模塊中的游標(biāo)來(lái)觸發(fā)系統(tǒng)相應(yīng)功能實(shí)現(xiàn)存儲(chǔ)數(shù)據(jù), 根據(jù)上文對(duì)游標(biāo)的描述,可利用游標(biāo)具有的相應(yīng)變更定長(zhǎng)數(shù)據(jù)的函數(shù)來(lái)存儲(chǔ)數(shù)
據(jù),例如
SET一INT(INT COLUMN, INT * DATA); SET一DOUBLE(INT COLUMN,DOUBLE* DATA); MOVE一TOJNSERT一ROW。
A,當(dāng)用戶調(diào)用游標(biāo)相應(yīng)SET一XXX (其中,XXX表示數(shù)據(jù)類型)函數(shù) 后,包括如下步驟
根據(jù)游標(biāo)當(dāng)前行的行號(hào),計(jì)算得到對(duì)應(yīng)的數(shù)據(jù)段SECTION的編號(hào). 判斷數(shù)據(jù)段SECTION是否已備份到日志文件中;
如杲已經(jīng)備份到日志文件中,則直接在數(shù)據(jù)緩沖管理模塊中得到數(shù)據(jù)段對(duì) 應(yīng)的內(nèi)存,修改該內(nèi)存的內(nèi)容,并返回給用戶,結(jié)束當(dāng)前流程;
如果未備份到日志文件中,則在日志文件的空閑列表中查找對(duì)應(yīng)的合適大 小的數(shù)據(jù)塊;如果在空閑列表沒(méi)有找到上述對(duì)應(yīng)的合適大小的數(shù)據(jù)塊,則分配新的數(shù)據(jù)
塊,如利用上文所述的ALLOC—BLOCK函數(shù)來(lái)實(shí)現(xiàn)分配;并在分配完后,將原 數(shù)據(jù)文件中的數(shù)據(jù)段復(fù)制到新分配的日志文件數(shù)據(jù)塊中,并通過(guò)數(shù)據(jù)緩沖管理 模塊加載這個(gè)在日志文件中的數(shù)據(jù)段到內(nèi)存,并返回給用戶。
B,當(dāng)用戶調(diào)用游標(biāo)相應(yīng)MOVE_TO_INSERT—ROW函數(shù)后,包括如下步

系統(tǒng)根據(jù)表中的行的總數(shù),計(jì)算最后一個(gè)數(shù)據(jù)段SECTION的編號(hào)。
判斷該最后一個(gè)數(shù)據(jù)段是否已備份到日志文件中;如果未備份到日志文件 中,則在日志文件中分配數(shù)據(jù)塊,并將原數(shù)據(jù)文件中的該最后一個(gè)數(shù)據(jù)段的數(shù) 據(jù)塊到這個(gè)塊中,步驟同上述A中的復(fù)制步驟;
判斷最后一個(gè)數(shù)據(jù)段的空閑空間是否足夠,如果空間不足夠,則在日志文 件中分配新的數(shù)據(jù)段,并加載到內(nèi)存。
在這個(gè)數(shù)據(jù)段中分配新的空間,作為新行。
對(duì)于讀取,用戶使用游標(biāo)來(lái)訪問(wèn)表中的數(shù)據(jù),在指定行序號(hào)后,游標(biāo)移動(dòng) 到相應(yīng)行,具體地,根據(jù)上文對(duì)游標(biāo)的描述,可利用游標(biāo)具有的游標(biāo)移動(dòng)函數(shù) MOVE一TO(INT ROW—ID)和檢索定長(zhǎng)數(shù)據(jù)函數(shù)GET一XXX(INT COLUMN)來(lái) 訪問(wèn)數(shù)據(jù),其中,ROWJD為欲訪問(wèn)的行,COLUMN表示數(shù)據(jù)在指定行中所 處的列,具體包括如下步驟
用戶使用MOVE—TO(INT ROWJD)來(lái)在表中移動(dòng)游標(biāo)到指定行,用戶使 用GET一XXX(INTCOLUMN)來(lái)從數(shù)據(jù)緩沖管理器中得到對(duì)應(yīng)的數(shù)據(jù)段,在數(shù) 據(jù)段中得到對(duì)應(yīng)行,并返回行中對(duì)應(yīng)列的數(shù)據(jù)。
本發(fā)明實(shí)施例的管理空間數(shù)據(jù)的方法中,還包括如下步驟中的一個(gè)或多
個(gè)
創(chuàng)建步驟,在數(shù)據(jù)文件中的數(shù)據(jù)有更新時(shí),創(chuàng)建與所述數(shù)據(jù)文件一一對(duì)應(yīng) 的曰志文件,所述數(shù)據(jù)文件的文件頭和所述對(duì)應(yīng)的日志文件的文件頭中記錄的 隨機(jī)數(shù)序列一致;
備份步驟,將數(shù)據(jù)文件中的數(shù)據(jù)塊備份到日志文件,并在備份數(shù)據(jù)塊時(shí), 在日志文件中為備份的數(shù)據(jù)塊分配一個(gè)用于標(biāo)識(shí)事務(wù)順序的、遞增的事務(wù)編 號(hào);
24恢復(fù)步驟,在進(jìn)行數(shù)據(jù)恢復(fù)時(shí),將日志文件中的有效數(shù)據(jù)塊按事務(wù)編號(hào)的 順序恢復(fù)到數(shù)據(jù)文件中。
本發(fā)明實(shí)施例的管理空間數(shù)據(jù)的方法中的事務(wù)的實(shí)現(xiàn)方法及已在前文對(duì) 空間數(shù)據(jù)引擎的描述中進(jìn)行了描述,在此不再贅述。
以上所述是本發(fā)明的優(yōu)選實(shí)施方式,應(yīng)當(dāng)指出,對(duì)于本技術(shù)領(lǐng)域的普通 技術(shù)人員來(lái)說(shuō),在不脫離本發(fā)明實(shí)施例所述原理的前提下,還可以作出若干改 進(jìn)和潤(rùn)飾,這些改進(jìn)和潤(rùn)飾也應(yīng)一見(jiàn)為本發(fā)明的保護(hù)范圍。
權(quán)利要求
1.一種空間數(shù)據(jù)引擎,其特征在于,包括文件存儲(chǔ)管理模塊,用于通過(guò)內(nèi)存映射文件來(lái)完成對(duì)物理文件中數(shù)據(jù)的加載或?qū)?shù)據(jù)寫(xiě)入物理文件中、分配與所述物理文件相對(duì)應(yīng)的磁盤(pán)空間、分配與所述物理文件相對(duì)應(yīng)的內(nèi)存映射文件的映射對(duì)象、及管理所述物理文件的空閑塊列表,所述物理文件包括數(shù)據(jù)文件和日志文件,所述物理文件的邏輯組織單元包括數(shù)據(jù)頁(yè)、數(shù)據(jù)組塊、數(shù)據(jù)塊、數(shù)據(jù)段、數(shù)據(jù)區(qū)和數(shù)據(jù)對(duì)象;所述數(shù)據(jù)組塊由多個(gè)連續(xù)的數(shù)據(jù)頁(yè)組成;所述數(shù)據(jù)塊由多個(gè)數(shù)據(jù)頁(yè)組成,所述數(shù)據(jù)塊的塊頭記錄包含數(shù)據(jù)塊編號(hào)、數(shù)據(jù)段編號(hào)、數(shù)據(jù)對(duì)象編號(hào)、事務(wù)編號(hào);所述數(shù)據(jù)段由定長(zhǎng)數(shù)據(jù)塊或定變長(zhǎng)數(shù)據(jù)塊組成,所述定長(zhǎng)數(shù)據(jù)塊中以行為單位存儲(chǔ)了定長(zhǎng)類型的數(shù)據(jù)和固定長(zhǎng)度的、變長(zhǎng)數(shù)據(jù)的描述信息,所述變長(zhǎng)數(shù)據(jù)的描述信息包括所述變長(zhǎng)數(shù)據(jù)在變長(zhǎng)數(shù)據(jù)塊中的位置及所述變長(zhǎng)數(shù)據(jù)包括的字節(jié)數(shù)目,所述變長(zhǎng)數(shù)據(jù)塊中記錄了變長(zhǎng)的數(shù)據(jù)信息;所述數(shù)據(jù)區(qū)是數(shù)據(jù)段的集合,分為用戶數(shù)據(jù)區(qū)和索引區(qū),所述用戶數(shù)據(jù)區(qū)用于記錄用戶存儲(chǔ)的數(shù)據(jù),所述索引區(qū)記錄用于定位所述用戶數(shù)據(jù)區(qū)中數(shù)據(jù)段的信息;所述數(shù)據(jù)對(duì)象,由一對(duì)數(shù)據(jù)區(qū)和索引區(qū)構(gòu)成,所述數(shù)據(jù)對(duì)象包括表;數(shù)據(jù)緩沖管理模塊,包括多個(gè)緩存塊,用于在對(duì)所述物理文件中的數(shù)據(jù)加載或?qū)?shù)據(jù)寫(xiě)入物理文件中時(shí),將欲加載或欲寫(xiě)入的數(shù)據(jù)以數(shù)據(jù)頁(yè)為單位加載到所述緩存塊中;日志管理模塊,用于創(chuàng)建及管理與數(shù)據(jù)文件相對(duì)應(yīng)的日志文件,在所述日志文件中記錄所述對(duì)應(yīng)數(shù)據(jù)文件中數(shù)據(jù)的變更;數(shù)據(jù)訪問(wèn)接口模塊,用于提供用以訪問(wèn)所述物理文件中數(shù)據(jù)的數(shù)據(jù)集、表及游標(biāo);所述數(shù)據(jù)集與所述物理文件相對(duì)應(yīng);所述數(shù)據(jù)集中的每一個(gè)存儲(chǔ)了一張或多張表,所述表中的數(shù)據(jù)使用游標(biāo)來(lái)訪問(wèn),所述游標(biāo)提供了表中行的訪問(wèn)方法,所述游標(biāo)中記錄了自身所指向行的信息。
2. 根據(jù)權(quán)利要求1所述的空間數(shù)據(jù)引擎,其特征在于,所述物理文件按 如下方式進(jìn)行數(shù)據(jù)組織所述數(shù)據(jù)對(duì)象的用戶數(shù)據(jù)區(qū)中的數(shù)據(jù)段使用雙向鏈表建立連接;在所述索引區(qū)中記錄所述用戶數(shù)據(jù)區(qū)數(shù)據(jù)段編號(hào)到所述數(shù)據(jù)段中數(shù)據(jù)塊地址的映射對(duì)SIDX;所述定長(zhǎng)數(shù)據(jù)塊中所有行的字節(jié)數(shù)目相同。
3. 根據(jù)權(quán)利要求2所述的空間數(shù)據(jù)引擎,其特征在于,所述文件存儲(chǔ)管 理模塊包括數(shù)據(jù)塊分配模塊,用于在將數(shù)據(jù)寫(xiě)入所述物理文件時(shí),如果當(dāng)前分配的映射對(duì)象的物理空間不夠存儲(chǔ)所述欲寫(xiě)入的數(shù)據(jù),則通知與所述物理文件相對(duì)應(yīng)的數(shù)據(jù)集中已經(jīng)打開(kāi)的游標(biāo)記錄當(dāng)前所加載的物理文件的地址、卸載已經(jīng)加載的數(shù)據(jù)段;并根據(jù)所述欲寫(xiě)入的數(shù)據(jù)所需的物理空間,重新分配內(nèi)存映射文件的映射對(duì)象;并根據(jù)所述重新分配的映射對(duì)象更新所述物理文件的文件尾,并 通知所有相關(guān)的游標(biāo)將所述卸載的數(shù)據(jù)段重新加載到所述緩存塊。
4. 根據(jù)權(quán)利要求3所述的空間數(shù)據(jù)引擎,其特征在于,所述數(shù)據(jù)緩沖管 理模塊包括如下模塊中的 一個(gè)或多個(gè)數(shù)據(jù)段加載模塊,用于根據(jù)數(shù)據(jù)段編號(hào),加載定長(zhǎng)數(shù)據(jù)塊到所述數(shù)據(jù)緩沖 管理模塊的緩存塊中;數(shù)據(jù)組塊加載模塊,用于根據(jù)數(shù)據(jù)段及數(shù)據(jù)頁(yè)編號(hào),加載變長(zhǎng)數(shù)據(jù)占用的 數(shù)據(jù)頁(yè)到所述數(shù)據(jù)緩沖管理模塊的緩存塊中。
5. 根據(jù)權(quán)利要求1所述的空間數(shù)據(jù)引擎,其特征在于,所述日志管理模 塊包括如下模塊中的一個(gè)或多個(gè)日志文件創(chuàng)建才莫塊,用于創(chuàng)建與數(shù)據(jù)文件一一對(duì)應(yīng)的日志文件,所述相對(duì) 應(yīng)的數(shù)據(jù)文件和日志文件的文件頭中記錄的隨^/L數(shù)序列一致;數(shù)據(jù)塊備份模塊,用于將指定的數(shù)據(jù)段從數(shù)據(jù)文件備份到對(duì)應(yīng)的日志文件 中,并在所述日志文件中為所述備^f分的數(shù)據(jù)塊分配一個(gè)用于標(biāo)識(shí)事務(wù)順序的、 遞增的事務(wù)編號(hào);數(shù)據(jù)恢復(fù)模塊,用于將所述日志文件中的有效數(shù)據(jù)塊按照自身的事務(wù)編號(hào) 的順序恢復(fù)到所述數(shù)據(jù)文件中。
6. 根據(jù)權(quán)利要求4所述的空間數(shù)據(jù)引擎,其特征在于,所述數(shù)據(jù)訪問(wèn)接 口模塊包括如下模塊中的 一個(gè)或多個(gè)新行加入模塊,用于向所述游標(biāo)中加入新的數(shù)據(jù)行;游標(biāo)移動(dòng)模塊,用于根據(jù)行號(hào)在表中檢索行; 行數(shù)據(jù)訪問(wèn)才莫塊,用于讀取游標(biāo)當(dāng)前指向行的數(shù)據(jù); 定長(zhǎng)數(shù)據(jù)變更模塊,用于變更游標(biāo)當(dāng)前行定長(zhǎng)列的值; 變長(zhǎng)數(shù)據(jù)變更^t塊,用于變更游標(biāo)當(dāng)前行變長(zhǎng)列的值; 開(kāi)始事務(wù)模塊,用于開(kāi)始一個(gè)新的事務(wù); 提交修改模塊,用于將所有的數(shù)據(jù)變更提交到所述數(shù)據(jù)文件中; 回滾模塊,用于放棄自最近事務(wù)以來(lái)的所有變更。
7. 根據(jù)權(quán)利要求6所述的空間數(shù)據(jù)引擎,其特征在于,所述新行加入模 塊包括空閑字節(jié)獲取單元,用于找到所述數(shù)據(jù)集的、當(dāng)前表的最后一個(gè)數(shù)據(jù)段, 并得到所述最后一個(gè)數(shù)據(jù)段中空閑字節(jié)的數(shù)目;空閑空間判斷單元,用于判斷所述空閑字節(jié)的數(shù)目是否足夠存儲(chǔ)所述新加 入的數(shù)據(jù)行,并在判斷出所述空閑字節(jié)的數(shù)目足夠存儲(chǔ)所述新加入的數(shù)據(jù)行 時(shí),在所述日志文件中備份所述最后一個(gè)數(shù)據(jù)段,并更新當(dāng)前在所述索引區(qū)中 記錄的所述用戶數(shù)據(jù)區(qū)數(shù)據(jù)段編號(hào)到所述數(shù)據(jù)段中數(shù)據(jù)塊地址的映射對(duì);并在 判斷出所述空閑字節(jié)的數(shù)目不夠時(shí),分配新數(shù)據(jù)段;更新單元,用于將所述最后一個(gè)數(shù)據(jù)段或所述新數(shù)據(jù)段加載至所述數(shù)據(jù)緩 沖管理模塊,從所述緩存管理模塊中得到所述數(shù)據(jù)段,并更新當(dāng)前行序號(hào)、行 緩存和當(dāng)前數(shù)據(jù)段。
8. —種利用權(quán)利要求1的空間數(shù)據(jù)引擎管理空間數(shù)據(jù)的方法,其特征在 于,所述空間數(shù)據(jù)引擎中、在數(shù)據(jù)對(duì)象的索引區(qū)中記錄用戶數(shù)據(jù)區(qū)數(shù)據(jù)段編號(hào) 到所述數(shù)據(jù)段中數(shù)據(jù)塊地址的映射對(duì)SIDX,所述空間數(shù)據(jù)引擎中、定長(zhǎng)數(shù)據(jù) 塊中所有行的字節(jié)數(shù)目相同,所述方法包括讀取數(shù)據(jù)文件中空間數(shù)據(jù)的步驟,所述讀取步驟具體包括步驟a,根據(jù)游標(biāo)指向的、當(dāng)前欲讀取的數(shù)據(jù)集中數(shù)據(jù)行的行號(hào),確定所 述數(shù)據(jù)行對(duì)應(yīng)的數(shù)據(jù)革更的編號(hào);步驟b,根據(jù)所述數(shù)據(jù)段的編號(hào),從當(dāng)前數(shù)據(jù)對(duì)象的索引區(qū)中獲得所述數(shù) 據(jù)段中數(shù)據(jù)塊的地址信息;步驟c,根據(jù)所述數(shù)據(jù)塊的地址信息,將所述數(shù)據(jù)段加載到數(shù)據(jù)緩沖管理模塊的緩存塊中;步驟d,從所述數(shù)據(jù)緩沖管理模塊的緩存塊中讀取所述數(shù)據(jù)段中的數(shù)據(jù)。
9. 根據(jù)權(quán)利要求8所述的管理空間數(shù)據(jù)的方法,其特征在于,所述數(shù)據(jù)對(duì)象的用戶數(shù)據(jù)區(qū)中的數(shù)據(jù)段使用雙向鏈表建立連接。
10. 根據(jù)權(quán)利要求8所述的管理空間數(shù)據(jù)的方法,其特征在于,在所述步 驟a之后,所述步驟b之前,還包括步驟bl,根據(jù)所述數(shù)據(jù)段的編號(hào),判斷所述數(shù)據(jù)段是否已加載到了所述 數(shù)據(jù)緩沖管理模塊的緩存塊中;如是,則轉(zhuǎn)入執(zhí)行步驟c;否則,執(zhí)行步驟b。
11. 根據(jù)權(quán)利要求10所述的管理空間數(shù)據(jù)的方法,其特征在于,所述步 驟bl包括如下步驟判斷所述數(shù)據(jù)段是否已備份到對(duì)應(yīng)的日志文件中;如是,則確定出所述數(shù) 據(jù)段已加載到了所述數(shù)據(jù)緩沖管理模塊的緩存塊中;否則,確定出所述數(shù)據(jù)段 未加載到所述數(shù)據(jù)緩沖管理模塊的緩存塊。
12. 根據(jù)權(quán)利要求8所述的管理空間數(shù)據(jù)的方法,其特征在于,所述步驟 c中,所述將數(shù)據(jù)段加載到所述數(shù)據(jù)緩沖管理模塊的緩存塊中的步驟包括以數(shù)據(jù)頁(yè)為單位,將所述數(shù)據(jù)段的定長(zhǎng)數(shù)據(jù)塊加載到所述數(shù)據(jù)緩沖管理模 塊的緩存塊中;和/或,以數(shù)據(jù)頁(yè)為單位,將所述數(shù)據(jù)段的變長(zhǎng)數(shù)據(jù)塊中變長(zhǎng)數(shù)據(jù)占用的數(shù)據(jù)頁(yè)加 載到所述數(shù)據(jù)緩沖管理模塊的緩存塊中。
13. 根據(jù)權(quán)利要求8所述的管理空間數(shù)據(jù)的方法,其特征在于,還包括 將數(shù)據(jù)寫(xiě)入數(shù)據(jù)文件的步驟,所述寫(xiě)入步驟具體包括步驟m,根據(jù)所述數(shù)據(jù)文件對(duì)應(yīng)的數(shù)據(jù)集中、表的總行數(shù),確定最后一個(gè) 數(shù)據(jù)段的編號(hào);步驟n,判斷所述最后一個(gè)數(shù)據(jù)段的空閑空間是否足夠存儲(chǔ)欲寫(xiě)入的空間 數(shù)據(jù);如是,則執(zhí)行步驟p;否則,執(zhí)行步驟q;步驟p,在對(duì)應(yīng)的日志文件中備份所述最后一個(gè)數(shù)據(jù)段,更新當(dāng)前索引區(qū) 中記錄的、用戶數(shù)據(jù)區(qū)數(shù)據(jù)段編號(hào)到數(shù)據(jù)段中數(shù)據(jù)塊地址的映射對(duì),將所述最 后一個(gè)數(shù)據(jù)段加栽到所述數(shù)據(jù)緩沖管理模塊的緩存塊中,從所述數(shù)據(jù)緩沖管理 模塊的緩存塊中得到所述最后一個(gè)數(shù)據(jù)段,并更新游標(biāo)當(dāng)前所指向行的信息,結(jié)束流程;步驟q,在對(duì)應(yīng)的日志文件中新分配一個(gè)數(shù)據(jù)段,并將所述新分配的數(shù)據(jù)段加載到所述數(shù)據(jù)緩沖管理才莫塊的緩存塊中,從所述緩存塊中得到所述新分配 的數(shù)據(jù)段,在所述新分配的數(shù)據(jù)段中分配用于存儲(chǔ)所述欲寫(xiě)入的空間數(shù)據(jù)的新 的空間,并更新游標(biāo)當(dāng)前所指向行的信息。
14. 根據(jù)權(quán)利要求13所述的管理空間數(shù)據(jù)的方法,其特征在于,所述步 驟q中,在對(duì)應(yīng)的日志文件中新分配一個(gè)數(shù)據(jù)段的步驟包括通知與所述日志文件相對(duì)應(yīng)的數(shù)據(jù)集中已經(jīng)打開(kāi)的游標(biāo)記錄當(dāng)前所加載 的物理文件的地址、卸載已經(jīng)加載的數(shù)據(jù)段;根據(jù)所述欲寫(xiě)入的空間數(shù)據(jù)所需的物理空間,重新分配內(nèi)存映射文件的映 射對(duì)象;根據(jù)所述重新分配的映射對(duì)象更新所述日志文件的文件尾,并通知所有相 關(guān)的游標(biāo)將所述卸載的數(shù)據(jù)段重新加載到所述緩存塊。
15. 根據(jù)權(quán)利要求13所述的管理空間數(shù)據(jù)的方法,其特征在于,在所述 步驟m之后,所述步驟n之前,還包括判斷所述最后一個(gè)數(shù)據(jù)段是否已備份到對(duì)應(yīng)的日志文件中;如是,則在所 述數(shù)據(jù)緩沖管理模塊中得到所述最后一個(gè)數(shù)據(jù)段對(duì)應(yīng)的緩存塊,并將所述緩存 塊原來(lái)存儲(chǔ)的數(shù)據(jù)修改為所述欲寫(xiě)入的空間數(shù)據(jù),結(jié)束當(dāng)前流程;否則,執(zhí)行
16. 根據(jù)權(quán)利要求8所述的管理空間數(shù)據(jù)的方法,其特征在于,還包括 變更游標(biāo)當(dāng)前行變長(zhǎng)列的數(shù)據(jù)的步驟,包括步驟i,沖艮據(jù)所述變長(zhǎng)列對(duì)應(yīng)的變長(zhǎng)數(shù)據(jù)的位置信息、在數(shù)據(jù)塊內(nèi)的偏移、 以及所述變長(zhǎng)列對(duì)應(yīng)的變長(zhǎng)數(shù)據(jù)包含的字節(jié)數(shù)目,定位所述變長(zhǎng)數(shù)據(jù)所涉及的 數(shù)據(jù)頁(yè),并判斷所述變長(zhǎng)數(shù)據(jù)所涉及的數(shù)據(jù)頁(yè)是否已經(jīng)加載到游標(biāo)緩存中,如 是,則執(zhí)行步驟j;否則,加載所述變長(zhǎng)數(shù)據(jù)所占用的數(shù)據(jù)頁(yè);步驟j,在當(dāng)前變長(zhǎng)列的空間大小不夠存儲(chǔ)欲寫(xiě)入的變長(zhǎng)數(shù)據(jù)、且當(dāng)前變 長(zhǎng)數(shù)據(jù)塊中沒(méi)有空閑的空間時(shí),分配新的、擴(kuò)大的變長(zhǎng)數(shù)據(jù)塊,復(fù)制原變長(zhǎng)數(shù) 據(jù)塊到所述新變長(zhǎng)數(shù)據(jù)塊,更新當(dāng)前索引區(qū)中記錄的、用戶數(shù)據(jù)區(qū)數(shù)據(jù)段編號(hào) 到數(shù)據(jù)段中數(shù)據(jù)塊地址的映射對(duì),并重新加載對(duì)應(yīng)的數(shù)據(jù)頁(yè)到所述數(shù)據(jù)緩沖管理模塊的緩存塊中;步驟k,將變更前的原變長(zhǎng)數(shù)據(jù)塊加入空閑列表中;計(jì)算存儲(chǔ)所述輸入的 變長(zhǎng)數(shù)據(jù)需占用的數(shù)據(jù)頁(yè),并將所述占用的數(shù)據(jù)頁(yè)加載到所述數(shù)據(jù)緩沖管理模 塊的緩存塊中;步驟l,記錄所述變長(zhǎng)數(shù)據(jù)塊的大小,復(fù)制數(shù)據(jù)到變長(zhǎng)數(shù)據(jù)的空閑位置中, 在定長(zhǎng)數(shù)據(jù)塊中更新對(duì)應(yīng)變長(zhǎng)數(shù)據(jù)塊的存儲(chǔ)信息。
17.根據(jù)權(quán)利要求8所述的管理空間數(shù)據(jù)的方法,其特征在于,還包括 變更游標(biāo)當(dāng)前行定長(zhǎng)列的凝:據(jù)的步驟,包括判斷當(dāng)前行所在的定長(zhǎng)數(shù)據(jù)塊是否已經(jīng)備份到日志文件中;如果沒(méi)有,則 備份所述定長(zhǎng)數(shù)據(jù)塊的數(shù)據(jù)到日志文件,重新從日志文件加載所述定長(zhǎng)數(shù)據(jù)塊 到數(shù)據(jù)緩存管理模塊的緩存塊中;從數(shù)據(jù)緩存管理模塊中得到所述定長(zhǎng)數(shù)據(jù)塊對(duì)應(yīng)的緩存塊根據(jù)輸入的列序號(hào)得到列在行中的偏移,并復(fù)制輸入的數(shù)據(jù)到所述對(duì)應(yīng)的緩存塊中。
18. 根據(jù)權(quán)利要求8所述的管理空間數(shù)據(jù)的方法,其特征在于,還包括 在數(shù)據(jù)文件中的數(shù)據(jù)有更新時(shí),創(chuàng)建與所述數(shù)據(jù)文件——對(duì)應(yīng)的日志文件,所述數(shù)據(jù)文件的文件頭和所述對(duì)應(yīng)的日志文件的文件頭中記錄的隨機(jī)凄t^ 列一致。
19. 根據(jù)權(quán)利要求18所述的管理空間數(shù)據(jù)的方法,其特征在于,還包括 將數(shù)據(jù)文件中的數(shù)據(jù)塊備份到所述日志文件,并在備f分所述數(shù)據(jù)塊時(shí),在所述日志文件中為所述備份的數(shù)據(jù)塊分配一個(gè)用于標(biāo)識(shí)事務(wù)順序的、遞增的事 務(wù)編號(hào)。
20. 根據(jù)權(quán)利要求19所述的管理空間數(shù)據(jù)的方法,其特征在于,還包括 在進(jìn)行數(shù)據(jù)恢復(fù)時(shí),將所述日志文件中的有效數(shù)據(jù)塊按事務(wù)編號(hào)的順序恢復(fù)到所述數(shù)據(jù)文件中。
21. 根據(jù)權(quán)利要求8所述的管理空間數(shù)據(jù)的方法,其特征在于,還包括 在開(kāi)始一個(gè)新事務(wù)時(shí),將游標(biāo)當(dāng)前的SIDX和行序號(hào)壓入事務(wù)棧中,復(fù)制一個(gè)新的SIDX作為游標(biāo)的當(dāng)前SIDX,并遞增事務(wù)編號(hào)。
22. 根據(jù)權(quán)利要求19所述的管理空間數(shù)據(jù)的方法,其特征在于,還包括將所有的數(shù)據(jù)變更提交到數(shù)據(jù)文件的步驟,所述提交步驟具體包括 步驟sl,找到所有已備份到日志文件中的數(shù)據(jù)段; 步驟s2,在數(shù)據(jù)文件的表頭中標(biāo)識(shí)開(kāi)始提交日志文件; 步驟s3 ,復(fù)制日志文件中的數(shù)據(jù),歐到數(shù)據(jù)文件中; 步驟s4,對(duì)于重新分配的數(shù)據(jù)塊,更新SIDX,將廢棄的塊加入數(shù)據(jù)文件 空閑塊列表,并標(biāo)識(shí)這個(gè)表有效;步驟s5,將已經(jīng)提交的日志文件中的數(shù)據(jù)塊加入日志文件的空閑塊列表; 步驟s6,清空事務(wù)棧,重新加載當(dāng)前行,當(dāng)前數(shù)據(jù)^:; 步驟s7,將原來(lái)的緩存塊重新從數(shù)據(jù)文件中加載; 步驟s8,通知所有游標(biāo)重新更新自身的緩存塊。
23. 根據(jù)權(quán)利要求8所述的管理空間數(shù)據(jù)的方法,其特征在于,還包括 放棄自最近事務(wù)開(kāi)始以來(lái)的所有變更的步驟,所述放棄步驟具體包括步驟s10,在事務(wù)棧為非空時(shí),在當(dāng)前SIDX中將所有屬于當(dāng)前事務(wù)編號(hào) 的數(shù)據(jù)段標(biāo)識(shí)廢棄,全部回收到空閑鏈表中;步驟sll,釋放當(dāng)前SIDX,將事務(wù)棧頂?shù)腟IDX作為當(dāng)前SIDX;步驟sl2,重新加載游標(biāo)的當(dāng)前行和當(dāng)前數(shù)據(jù)段;步驟s13,將原來(lái)映射到當(dāng)前事務(wù)編號(hào)的日志的緩存塊重新加載。
24. 根據(jù)權(quán)利要求8或9所述的管理空間數(shù)據(jù)的方法,其特征在于,還包括建立索引表來(lái)檢索所述數(shù)據(jù)文件中存儲(chǔ)的空間數(shù)據(jù)的步驟,所述索引表中 存儲(chǔ)有主鍵-行序號(hào)映射對(duì)。
全文摘要
本發(fā)明提供了一種空間數(shù)據(jù)引擎及應(yīng)用其管理空間數(shù)據(jù)的方法,該空間數(shù)據(jù)引擎包括文件存儲(chǔ)管理模塊,用于通過(guò)內(nèi)存映射文件來(lái)完成對(duì)物理文件中數(shù)據(jù)的加載或?qū)?shù)據(jù)寫(xiě)入物理文件中、分配內(nèi)存映射文件的映射對(duì)象,物理文件的邏輯組織單元包括數(shù)據(jù)頁(yè)、數(shù)據(jù)組塊、數(shù)據(jù)塊、數(shù)據(jù)段、數(shù)據(jù)區(qū)和數(shù)據(jù)對(duì)象;數(shù)據(jù)緩沖管理模塊,用于在對(duì)數(shù)據(jù)進(jìn)行加載或?qū)?shù)據(jù)寫(xiě)入時(shí),將數(shù)據(jù)以數(shù)據(jù)頁(yè)為單位加載到緩存塊中;日志管理模塊,用于創(chuàng)建及管理日志文件,在日志文件中記錄對(duì)應(yīng)數(shù)據(jù)文件中數(shù)據(jù)的變更;數(shù)據(jù)訪問(wèn)接口模塊,用于提供用以訪問(wèn)物理文件中數(shù)據(jù)的數(shù)據(jù)集、表及游標(biāo)。利用上述技術(shù)方案,實(shí)現(xiàn)了基于內(nèi)存映射文件的空間數(shù)據(jù)引擎,提高了數(shù)據(jù)的訪問(wèn)效率。
文檔編號(hào)G06F17/30GK101639848SQ20091008580
公開(kāi)日2010年2月3日 申請(qǐng)日期2009年6月1日 優(yōu)先權(quán)日2009年6月1日
發(fā)明者韻 張, 曹曉航 申請(qǐng)人:北京四維圖新科技股份有限公司
網(wǎng)友詢問(wèn)留言 已有0條留言
  • 還沒(méi)有人留言評(píng)論。精彩留言會(huì)獲得點(diǎn)贊!
1
沾益县| 和静县| 育儿| 天镇县| 集贤县| 雷州市| 神农架林区| 云龙县| 酒泉市| 隆德县| 简阳市| 景洪市| 乌拉特中旗| 张家港市| 金川县| 宣城市| 广饶县| 郯城县| 梅河口市| 收藏| 武平县| 湘乡市| 永德县| 乐亭县| 浦北县| 武强县| 昌宁县| 衡南县| 隆林| 辽源市| 通辽市| 开化县| 高淳县| 当涂县| 会昌县| 甘肃省| 宁陕县| 广平县| 娱乐| 门源| 康保县|