亚洲成年人黄色一级片,日本香港三级亚洲三级,黄色成人小视频,国产青草视频,国产一区二区久久精品,91在线免费公开视频,成年轻人网站色直接看

一種面向云數(shù)據(jù)庫(kù)的非結(jié)構(gòu)化數(shù)據(jù)的存儲(chǔ)與管理方法與流程

文檔序號(hào):12124215閱讀:448來(lái)源:國(guó)知局
一種面向云數(shù)據(jù)庫(kù)的非結(jié)構(gòu)化數(shù)據(jù)的存儲(chǔ)與管理方法與流程

本發(fā)明屬于非結(jié)構(gòu)化云存儲(chǔ)管理研究與應(yīng)用領(lǐng)域,具體涉及一種面向云數(shù)據(jù)庫(kù)的非結(jié)構(gòu)化數(shù)據(jù)存儲(chǔ)與管理方法。



背景技術(shù):

近年來(lái),隨著物聯(lián)網(wǎng)、互聯(lián)網(wǎng)的發(fā)展,信息系統(tǒng)處理、交換的數(shù)據(jù)在形態(tài)上發(fā)生較大變換,非結(jié)構(gòu)化數(shù)據(jù)逐漸成為信息系統(tǒng)內(nèi)部以及信息系統(tǒng)之間互操作的載體,例如json數(shù)據(jù)、xml數(shù)據(jù)等。這些數(shù)據(jù)在語(yǔ)義表達(dá)上具有部分確定性,在數(shù)據(jù)的長(zhǎng)度上存在較強(qiáng)的不確定性。由于非結(jié)構(gòu)化數(shù)據(jù)的特點(diǎn)導(dǎo)致其底層基本操作方面的效率存在一定制約,由此形成云化信息系統(tǒng)的瓶頸。非機(jī)構(gòu)化數(shù)據(jù)的存儲(chǔ)管理也逐漸成為數(shù)據(jù)庫(kù)領(lǐng)域重要研究與發(fā)展方向。

數(shù)據(jù)的存儲(chǔ)與管理除了數(shù)據(jù)寫(xiě)入外,還包括數(shù)據(jù)的刪除與更新等基本操作。關(guān)系數(shù)據(jù)庫(kù)是傳統(tǒng)信息系統(tǒng)中實(shí)現(xiàn)數(shù)據(jù)存儲(chǔ)、管理的主要工具。關(guān)系數(shù)據(jù)庫(kù)以關(guān)系代數(shù)為基礎(chǔ),通過(guò)數(shù)據(jù)建模實(shí)現(xiàn)結(jié)構(gòu)化定義。這一結(jié)構(gòu)化本質(zhì)上是為數(shù)據(jù)的語(yǔ)義表達(dá)與數(shù)據(jù)長(zhǎng)度進(jìn)行確定性的處理。在數(shù)據(jù)增量過(guò)程中,根據(jù)這一確定性的結(jié)構(gòu)定義實(shí)現(xiàn)數(shù)據(jù)的讀寫(xiě)操作組織。數(shù)據(jù)庫(kù)在底層操作過(guò)程中,為數(shù)據(jù)建立rowIndex,以散列處理的方式,在數(shù)據(jù)存儲(chǔ)分塊(dBlock)中建立存儲(chǔ)位置指針與rowIndex之間確定性的映射關(guān)系。由于數(shù)據(jù)在結(jié)構(gòu)與長(zhǎng)度上具有確定性的特點(diǎn)。因此在dBlock中空間利用效率較高。同時(shí),在數(shù)據(jù)的更新與刪除操作中,一條數(shù)據(jù)記錄在dBlock中的內(nèi)容變化不會(huì)影響其它數(shù)據(jù)記錄的存儲(chǔ)位置,存儲(chǔ)分塊中的碎片回收簡(jiǎn)單,且空間利用效率較高。

在云存儲(chǔ)環(huán)境中,大量數(shù)據(jù)以非結(jié)構(gòu)化的形式存在。一條數(shù)據(jù)記錄的長(zhǎng)度無(wú)法在數(shù)據(jù)模型中確定性的描述。在數(shù)據(jù)寫(xiě)入過(guò)程中,由于數(shù)據(jù)記錄的存儲(chǔ)空間長(zhǎng)度無(wú)法確定,導(dǎo)致其位置不能通過(guò)散列操作建立存儲(chǔ)指針與rowIndex之間的映射關(guān)系,無(wú)法在實(shí)現(xiàn)非結(jié)構(gòu)化數(shù)據(jù)的正確基本讀寫(xiě)操作。

云環(huán)境中上述存儲(chǔ)管理基本問(wèn)題逐漸引起研究人員的注意。2000年以來(lái),Google等一批研究機(jī)構(gòu)以云計(jì)算為基礎(chǔ),先后推出鍵值(key-value)數(shù)據(jù)庫(kù)為代表的大數(shù)據(jù)存儲(chǔ)、查詢解決方案?;趉ey-value的的云數(shù)據(jù)存儲(chǔ)查詢技術(shù)具有高可擴(kuò)展性、高可用性和容錯(cuò)性等特點(diǎn),能夠?qū)崿F(xiàn)對(duì)海量數(shù)據(jù)的高效存儲(chǔ)與查詢的目的。在云數(shù)據(jù)庫(kù)底層存儲(chǔ)中,數(shù)據(jù)記錄以序列的方式在dBlock中一次寫(xiě)入。同時(shí),以rowIndex建立底層倒排索引,實(shí)現(xiàn)數(shù)據(jù)記錄在dBlock中存儲(chǔ)位置的記錄。在數(shù)據(jù)讀取過(guò)程中,利用這一倒排索引實(shí)現(xiàn)數(shù)據(jù)記錄的檢索、定位與提取。這一方式具有結(jié)構(gòu)簡(jiǎn)單,空間利用率高的優(yōu)勢(shì)。將底層倒排索引與散列相結(jié)合能有效提高檢索效率,數(shù)據(jù)記錄的提取受數(shù)據(jù)集規(guī)模大小的影響較小。

上述非結(jié)構(gòu)化數(shù)據(jù)底層存儲(chǔ)存儲(chǔ)管理技術(shù)在數(shù)據(jù)只有簡(jiǎn)單的增量與查詢場(chǎng)景中表現(xiàn)較好。然而,在多數(shù)信息系統(tǒng)中,數(shù)據(jù)除了簡(jiǎn)單讀寫(xiě)外還具有更新、刪除操作的要求。在這一場(chǎng)景中,上述手段的適應(yīng)性存在一定問(wèn)題。在數(shù)據(jù)更新、刪除操作過(guò)程中,由于數(shù)據(jù)記錄在操作前后占用空間長(zhǎng)度的變化,在dBlock中形成較多的碎片。為了提高空間利用率就需要進(jìn)行碎片回收。在碎片回收過(guò)程中,形成大量的數(shù)據(jù)搬運(yùn)、遷移以及對(duì)應(yīng)指針與索引的更新操作,導(dǎo)致數(shù)據(jù)存儲(chǔ)管理的效率較低,不能滿足云環(huán)境中應(yīng)用對(duì)數(shù)據(jù)底層讀寫(xiě)的要求。



技術(shù)實(shí)現(xiàn)要素:

圍繞上述問(wèn)題,本發(fā)明提出一種面向云數(shù)據(jù)庫(kù)的非結(jié)構(gòu)化數(shù)據(jù)的存儲(chǔ)與管理方法。

本發(fā)明的面向云數(shù)據(jù)庫(kù)的非結(jié)構(gòu)化數(shù)據(jù)的存儲(chǔ)與管理方法中,數(shù)據(jù)存儲(chǔ)由數(shù)據(jù)塊(dBlock)、塊占用索引(dBlockFreeIdx)、行占用索引(vLineIdx)與數(shù)據(jù)記錄索引(dIdx)構(gòu)成。dBlock由一組長(zhǎng)度確定的虛數(shù)據(jù)行(vLine)構(gòu)成。vLine由行存儲(chǔ)信息、存儲(chǔ)鏈?zhǔn)孜恢羔樢约坝行Т鎯?chǔ)空間構(gòu)成。其中行存儲(chǔ)信息用于記錄當(dāng)前行的類型、數(shù)據(jù)記錄指針、數(shù)據(jù)記錄長(zhǎng)度、以及當(dāng)前虛數(shù)據(jù)行的有效存儲(chǔ)數(shù)據(jù)的字節(jié)長(zhǎng)度。存儲(chǔ)鏈?zhǔn)孜恢羔樣糜谟涗洰?dāng)前數(shù)據(jù)記錄占用的存儲(chǔ)鏈中下一個(gè)vLine的指針位置。行占用索引采用位圖索引的方式標(biāo)記dBlock中vLine的空間占用狀態(tài)。

在非結(jié)構(gòu)化數(shù)據(jù)存儲(chǔ)過(guò)程中,根據(jù)其長(zhǎng)度計(jì)算所占用的vLine數(shù)量,從行占用索引vlineIdx中獲取未被占用的首個(gè)vLine位置,而后將當(dāng)前數(shù)據(jù)寫(xiě)入該vLine中,如果當(dāng)前數(shù)據(jù)記錄的長(zhǎng)度超過(guò)一條vLine的容納空間,則在dBlock中繼續(xù)獲取未被占用的vLine,繼續(xù)寫(xiě)入,直到全部數(shù)據(jù)寫(xiě)入dBlock中對(duì)應(yīng)的vLine集中。同時(shí),在vLine之間的存儲(chǔ)鏈之間建立鏈接關(guān)系,實(shí)現(xiàn)數(shù)據(jù)提取過(guò)程中的定位。完成數(shù)據(jù)寫(xiě)入后,更新對(duì)應(yīng)的vlineIdx與數(shù)據(jù)記錄索引dIdx信息。

在數(shù)據(jù)提取過(guò)程中,掃描dBlock中vLine,過(guò)濾識(shí)別其中數(shù)據(jù)記錄的首行信息,實(shí)現(xiàn)數(shù)據(jù)記錄的提取。在這一過(guò)程中如果數(shù)據(jù)記錄長(zhǎng)度超過(guò)vLine的長(zhǎng)度,則根據(jù)vLine尾部存儲(chǔ)鏈指針定位下一個(gè)的vLine的位置繼續(xù)提取,直到全部數(shù)據(jù)提取完成。

在數(shù)據(jù)更新操作過(guò)程中,根據(jù)數(shù)據(jù)長(zhǎng)度的變換調(diào)整其所占用的vLine數(shù)量并變更其中的記錄內(nèi)容。同時(shí)更新vLineIdx中的占用信息。

在碎片回收過(guò)程中,以vLine為單位進(jìn)行回收。在回收過(guò)程中僅需修改被回收vLine的首尾信息同時(shí)變更該vLine在vLineIdx中位圖對(duì)應(yīng)字節(jié)值即可。

本發(fā)明的有益效果如下:

針對(duì)云環(huán)境中,以json數(shù)據(jù)為代表的非結(jié)構(gòu)化數(shù)據(jù)底層存儲(chǔ)特點(diǎn),本發(fā)明基于虛擬分塊的方式實(shí)現(xiàn)非定長(zhǎng)數(shù)據(jù)記錄的分割與基本存儲(chǔ),通過(guò)虛擬分塊的鏈表關(guān)系實(shí)現(xiàn)數(shù)據(jù)記錄的排序與提?。煌瑫r(shí),為存儲(chǔ)分塊建立索引,實(shí)現(xiàn)存儲(chǔ)空間的碎片回收與數(shù)據(jù)記錄的倒排索引。通過(guò)本發(fā)明的數(shù)據(jù)存儲(chǔ)管理技術(shù),可以有效滿足海量、非結(jié)構(gòu)化數(shù)據(jù)應(yīng)用場(chǎng)景下,數(shù)據(jù)庫(kù)底層數(shù)據(jù)高性能讀寫(xiě)的要求。同時(shí),可以提高存儲(chǔ)空間利用效率。這一方法在互聯(lián)網(wǎng)、云化服務(wù)集成環(huán)境、物聯(lián)網(wǎng)等方面具有積極的應(yīng)用價(jià)值。

附圖說(shuō)明

圖1存儲(chǔ)結(jié)構(gòu)示意圖。

圖2數(shù)據(jù)塊存儲(chǔ)模型示意圖。

圖3虛數(shù)據(jù)行示意圖。

圖4數(shù)據(jù)接入執(zhí)行流程圖。

圖5索引維護(hù)執(zhí)行流程圖。

圖6塊占用索引維護(hù)過(guò)程圖。

圖7數(shù)據(jù)記錄索引維護(hù)過(guò)程圖。

圖8數(shù)據(jù)刪除過(guò)程圖。

圖9數(shù)據(jù)記錄長(zhǎng)度小于虛擬行長(zhǎng)度更新過(guò)程圖。

圖10數(shù)據(jù)記錄長(zhǎng)度大于虛數(shù)據(jù)行長(zhǎng)度更新過(guò)程圖。

圖11數(shù)據(jù)提取過(guò)程圖。

具體實(shí)施方式

針對(duì)海云協(xié)同工作平臺(tái)操作行為數(shù)據(jù)的高效存取和修改的需求,本發(fā)明提出一種高性能的非結(jié)構(gòu)化數(shù)據(jù)存儲(chǔ)與索引技術(shù)。這一技術(shù)在底層實(shí)現(xiàn)對(duì)非結(jié)構(gòu)化數(shù)據(jù)的高效存儲(chǔ)。同時(shí),在存儲(chǔ)過(guò)程中,根據(jù)數(shù)據(jù)長(zhǎng)度的不同進(jìn)行倒排序索引的維護(hù)。利用倒排序索引,實(shí)現(xiàn)數(shù)據(jù)的快速更新和刪除操作。在這一基礎(chǔ)上,根據(jù)索引數(shù)據(jù)實(shí)現(xiàn)數(shù)據(jù)的高效提取。其整體的存儲(chǔ)架構(gòu)如圖1,具體實(shí)施內(nèi)容如下:

一.數(shù)據(jù)模型

在數(shù)據(jù)增量過(guò)程中,將數(shù)據(jù)記錄以非結(jié)構(gòu)化的方式實(shí)現(xiàn)底層存儲(chǔ)。針對(duì)數(shù)據(jù)接入的過(guò)程,有如下定義:

存儲(chǔ)頁(yè)

dataPage={dBlockFreeIdx,dBlocki|i=1,2,…n}

存儲(chǔ)頁(yè),包含dBlockFreeIdx和dBlock兩個(gè)部分。其中,dBlockFreeIdx表示塊占用索引,用以記錄當(dāng)前存儲(chǔ)頁(yè)的各個(gè)數(shù)據(jù)塊是否存在空閑的存儲(chǔ)空間。dBlock表示數(shù)據(jù)塊,用于實(shí)際存儲(chǔ)數(shù)據(jù)。一個(gè)存儲(chǔ)頁(yè)包含多個(gè)數(shù)據(jù)塊,數(shù)據(jù)塊的個(gè)數(shù)和大小可根據(jù)實(shí)際情況進(jìn)行設(shè)定。

數(shù)據(jù)塊

dBlock={vLinei|i=1,2,…,MaxLineNum}

數(shù)據(jù)塊為實(shí)際數(shù)據(jù)存儲(chǔ)的基本單元。vLine表示虛數(shù)據(jù)行,每個(gè)數(shù)據(jù)塊內(nèi)存儲(chǔ)多條虛數(shù)據(jù)行(圖1中HEOF表示行首起始符,datacache表示虛數(shù)據(jù)行存儲(chǔ)空間,TEOF表示行尾截止符)。若以MaxLineNum表示數(shù)據(jù)塊存儲(chǔ)的最大行數(shù),以MaxDBlock表示數(shù)據(jù)塊的最大容量,以VLineLength表示vLine的最大長(zhǎng)度,則存在以下關(guān)系:

其中,MaxDBlock建議取值為VLineLength的整數(shù)倍。

本發(fā)明根據(jù)實(shí)際使用情況,將數(shù)據(jù)塊的容量MaxDBlock設(shè)置為1024K,虛數(shù)據(jù)行的最大長(zhǎng)度VLineLength設(shè)置為256Byte,則數(shù)據(jù)塊存儲(chǔ)的最大行數(shù)MaxLineNum的值為4096。

如圖2所示,即為本例中的數(shù)據(jù)塊存儲(chǔ)模型。

虛數(shù)據(jù)行

vLine={type,head,length,curLength,next,content}

虛數(shù)據(jù)行表示實(shí)際存儲(chǔ)在數(shù)據(jù)塊中的當(dāng)前數(shù)據(jù)的虛行信息。數(shù)據(jù)記錄映射成虛數(shù)據(jù)行后,執(zhí)行實(shí)際的存儲(chǔ)操作。一條數(shù)據(jù)記錄可以映射成n行vLine,其中n滿足n>=1且n<=MaxLineNum。如圖3所示,為vLine的存儲(chǔ)結(jié)構(gòu)。

其中:

type表示vLine的類型,用于標(biāo)記該vLine是否為數(shù)據(jù)記錄存儲(chǔ)的首行。type預(yù)留位占據(jù)1位存儲(chǔ)空間,0表示非數(shù)據(jù)記錄首行,1表示數(shù)據(jù)記錄首行。

head表示行首預(yù)留位,記錄當(dāng)前vLine所屬的數(shù)據(jù)記錄的首個(gè)虛數(shù)據(jù)行的存儲(chǔ)位置。行首預(yù)留位存儲(chǔ)的最大值為最后一行vLine的起始位置,其值為1024K-256Byte+1即220-28+1,故本例中head占用20位存儲(chǔ)空間。

length表示當(dāng)前數(shù)據(jù)記錄的總長(zhǎng)度,本例中一個(gè)數(shù)據(jù)塊的最大容量為1024K=220Byte,故數(shù)據(jù)記錄的最大長(zhǎng)度必然小于220Byte,本例中l(wèi)ength占用20位存儲(chǔ)空間。

curLength表示當(dāng)前數(shù)據(jù)記錄在本條vLine內(nèi)的實(shí)際有效長(zhǎng)度,本例中的curLength<256Byte即28Byte,故本例中curLength占用8位存儲(chǔ)空間。

next表示行尾預(yù)留位,記錄當(dāng)前數(shù)據(jù)記錄的下一條vLine的起始位置。若當(dāng)前vLine為最后一行,則置為空值,否則記錄下一條vLine的起始位置。next記錄的最大值為最后一行vLine的起始位置,其值的計(jì)算過(guò)程和head相同,本例中分配20位存儲(chǔ)空間。

content表示當(dāng)前vLine存儲(chǔ)的有效數(shù)據(jù),本例中的長(zhǎng)度為256Byte-(1+20+20+8+20)bit,即247字節(jié)。

因此,vLine的實(shí)際長(zhǎng)度為247Byte+(1+20+20+8+20)bit=256Byte-3bit,故每行vLine比預(yù)期的256Byte少占用3位存儲(chǔ)空間,每個(gè)數(shù)據(jù)塊dBlock比預(yù)期的1024K存儲(chǔ)空間少占用1.5K,實(shí)際的存儲(chǔ)空間為1022.5K。

數(shù)據(jù)記錄

data表示數(shù)據(jù)記錄,是待接入的原始數(shù)據(jù),是滿足一定規(guī)則條件的合法的非結(jié)構(gòu)化字節(jié)流。其字節(jié)流長(zhǎng)度小于等于一個(gè)數(shù)據(jù)塊存儲(chǔ)的有效字節(jié)流的總長(zhǎng)度。

塊占用索引

dBlockFreeIdx表示塊占用索引,用以記錄當(dāng)前存儲(chǔ)頁(yè)的各個(gè)數(shù)據(jù)塊是否存在空閑的存儲(chǔ)空間。塊占用索引是以位圖的方式記錄各個(gè)數(shù)據(jù)塊的空閑存儲(chǔ)空間是否占用。以0表示當(dāng)前數(shù)據(jù)塊不存在空閑存儲(chǔ)空間,以1表示當(dāng)前數(shù)據(jù)塊存在空閑空間,每個(gè)數(shù)據(jù)塊占用一位數(shù)據(jù)位來(lái)記錄當(dāng)前數(shù)據(jù)塊是否存在空閑數(shù)據(jù)空間。

塊索引

dBlockIdx={vLineIdx,dIdx}

塊索引表示數(shù)據(jù)塊的索引信息,包含行占用索引和數(shù)據(jù)記錄索引兩部分。其中,vLindIdx表示行占用索引,dIdx表示數(shù)據(jù)記錄索引。

行占用索引

vLineIdx表示行占用索引,是以位圖的方式記錄當(dāng)前數(shù)據(jù)塊的虛數(shù)據(jù)行是否被占用。以0表示當(dāng)前行未被占用,以1表示當(dāng)前行被占用。行占用索引文件以MaxLineNum位存儲(chǔ)空間表示。

數(shù)據(jù)記錄索引

dIdx={(i,loc,len)i|i=1,2,……n}

數(shù)據(jù)記錄索引用于記錄第i條數(shù)據(jù)記錄在數(shù)據(jù)塊dBlock中存儲(chǔ)的虛數(shù)據(jù)行vLine的起始位置。其中,i為數(shù)據(jù)記錄序列中第i條記錄;loc表示塊索引指針,指向數(shù)據(jù)塊中存儲(chǔ)的虛數(shù)據(jù)行的起始位置;len表示該數(shù)據(jù)記錄的總長(zhǎng)度。

數(shù)據(jù)寫(xiě)入的過(guò)程如下:

1.接收原始數(shù)據(jù)data,獲取數(shù)據(jù)記錄的序號(hào)i,并計(jì)算data的長(zhǎng)度len及所需的存儲(chǔ)空間的大小。

needSpace=getSpace(data),表示存儲(chǔ)data所需要的存儲(chǔ)空間的大小。

2.獲取當(dāng)前數(shù)據(jù)存儲(chǔ)頁(yè),定位當(dāng)前的數(shù)據(jù)存儲(chǔ)塊;

dBlock=getCurDBlock,

freeSpace=getFreeSpace(dBlock),

firstLine=getFirstFreeLine(dBlock),

其中,freeSpace滿足freeSpace>=needSpace,firstLine表示dBlock中的首個(gè)空行行號(hào)。

3.在當(dāng)前的數(shù)據(jù)存儲(chǔ)塊中存儲(chǔ)數(shù)據(jù)data;

pos(data)=storeData(data,dBlock)=data→dBlock,

其中,pos(data)表示data存儲(chǔ)的首行起始位置。

4.針對(duì)數(shù)據(jù)塊的增量數(shù)據(jù),更新行占用索引;

firstLine→vLineIdx,vLineIdx∈dBlock

5.針對(duì)原始數(shù)據(jù),更新數(shù)據(jù)記錄索引;

updateDIdx(i,pos(data),len)→dIdx,dIdx∈dBlock

圖4中展示了這一數(shù)據(jù)接入的過(guò)程。如圖所示,其流程如下:

1.首先,獲取原始數(shù)據(jù)data;

2.判斷原始數(shù)據(jù)data的合法性;

3.若合法,則轉(zhuǎn)步驟5,否則轉(zhuǎn)步驟4;

4.返回?cái)?shù)據(jù)不合法標(biāo)識(shí),結(jié)束;

5.計(jì)算data的長(zhǎng)度len;

6.計(jì)算data寫(xiě)入數(shù)據(jù)塊所需要的存儲(chǔ)空間的大小needSpace;

7.獲取當(dāng)前數(shù)據(jù)存儲(chǔ)頁(yè);

8.根據(jù)數(shù)據(jù)塊占用索引獲取當(dāng)前數(shù)據(jù)存儲(chǔ)頁(yè)中第一個(gè)空閑數(shù)據(jù)塊;

9.若空閑數(shù)據(jù)塊存在,則轉(zhuǎn)步驟10,否則轉(zhuǎn)步驟13;

10.獲取當(dāng)前數(shù)據(jù)塊的剩余存儲(chǔ)空間freeSpace;

11.若freeSpace>=needSpace,則轉(zhuǎn)步驟16,否則轉(zhuǎn)步驟12;

12.獲取下一個(gè)空閑數(shù)據(jù)塊,轉(zhuǎn)步驟9;

13.創(chuàng)建新的存儲(chǔ)數(shù)據(jù)塊;

14.更新數(shù)據(jù)塊占用索引;

15.新建行占用索引文件和數(shù)據(jù)記錄索引文件,轉(zhuǎn)步驟17;

16.獲取空閑行信息;

17.原始數(shù)據(jù)data映射成虛數(shù)據(jù)行列表List<vLine>;

18.虛數(shù)據(jù)行列表List<vLine>寫(xiě)入數(shù)據(jù)塊;

19.實(shí)現(xiàn)數(shù)據(jù)寫(xiě)入的索引的維護(hù);

20.返回?cái)?shù)據(jù)成功寫(xiě)入標(biāo)識(shí);

21.結(jié)束。

二.數(shù)據(jù)寫(xiě)入的索引的維護(hù)

在數(shù)據(jù)增量的過(guò)程中,通過(guò)索引的維護(hù),實(shí)現(xiàn)數(shù)據(jù)的高效管理。在數(shù)據(jù)寫(xiě)入的過(guò)程中,需要維護(hù)的索引包括塊占用索引、行占用索引以及數(shù)據(jù)記錄索引。本發(fā)明通過(guò)對(duì)塊占用索引的維護(hù),實(shí)現(xiàn)對(duì)數(shù)據(jù)塊是否存在可用存儲(chǔ)空間進(jìn)行標(biāo)記。在數(shù)據(jù)寫(xiě)入的過(guò)程中,通過(guò)對(duì)行占用索引的讀取,實(shí)現(xiàn)對(duì)于數(shù)據(jù)塊中可用存儲(chǔ)空間的定位。通過(guò)對(duì)數(shù)據(jù)記錄索引的維護(hù),實(shí)現(xiàn)對(duì)數(shù)據(jù)記錄在數(shù)據(jù)塊中的存儲(chǔ)位置記錄。

2.1行占用索引的維護(hù)

在數(shù)據(jù)寫(xiě)入數(shù)據(jù)塊后,首先執(zhí)行行占用索引的維護(hù),行占用索引的維護(hù)過(guò)程如圖5所示。如圖所示,數(shù)據(jù)寫(xiě)入時(shí)的行占用索引維護(hù)的流程如下:

1.首先,獲取當(dāng)前數(shù)據(jù)記錄寫(xiě)入數(shù)據(jù)塊時(shí)占用的虛數(shù)據(jù)行的行號(hào)組成的數(shù)組num[];

2.獲取當(dāng)前數(shù)據(jù)塊的行占用索引vLineIdx;

3.令i=0;

4.判斷i<num.size()?若是,則轉(zhuǎn)步驟5,否則轉(zhuǎn)步驟7;

5.更新vLineIdx中的第num[i]位,將其值置為1;

6.令i++,轉(zhuǎn)步驟4;

7.數(shù)據(jù)寫(xiě)入的行占用索引過(guò)程結(jié)束。

2.2塊占用索引的維護(hù)

數(shù)據(jù)寫(xiě)入的行占用索引維護(hù)完成后,執(zhí)行塊占用索引的維護(hù)。塊占用索引的維護(hù)過(guò)程如圖6所示。如圖所示,數(shù)據(jù)寫(xiě)入時(shí)的塊占用索引維護(hù)過(guò)程如下:

1.首先,獲取當(dāng)前數(shù)據(jù)塊的行占用索引;

2.掃描行占用索引;

3.若存在值為0的數(shù)據(jù)位,則轉(zhuǎn)步驟4,否則轉(zhuǎn)步驟5;

4.當(dāng)前數(shù)據(jù)塊存在未占用的虛數(shù)據(jù)行,不需要更新塊占用索引,轉(zhuǎn)步驟8;

5.當(dāng)前數(shù)據(jù)塊不存在未占用的虛數(shù)據(jù)行;

6.獲取當(dāng)前數(shù)據(jù)塊的塊占用索引;

7.將表示當(dāng)前數(shù)據(jù)塊存儲(chǔ)狀態(tài)的數(shù)據(jù)位的值置為0;

8.結(jié)束。

2.3數(shù)據(jù)記錄索引的維護(hù)

數(shù)據(jù)寫(xiě)入的塊占用索引維護(hù)完成后,執(zhí)行數(shù)據(jù)記錄索引的維護(hù)。數(shù)據(jù)記錄索引的維護(hù)過(guò)程如圖7所示。如圖所示,數(shù)據(jù)寫(xiě)入時(shí)的數(shù)據(jù)記錄索引維護(hù)過(guò)程如下:

1.首先,獲取當(dāng)前數(shù)據(jù)塊的數(shù)據(jù)記錄索引;

2.獲取當(dāng)前數(shù)據(jù)記錄的行號(hào)i;

3.獲取當(dāng)前數(shù)據(jù)記錄的存儲(chǔ)位置pos(data);

4.獲取當(dāng)前數(shù)據(jù)記錄的長(zhǎng)度len(data);

5.獲取當(dāng)前數(shù)據(jù)塊的數(shù)據(jù)記錄索引;

6.更新數(shù)據(jù)記錄索引(i,pos(data),len(data));

7.結(jié)束。

三.數(shù)據(jù)變更

在數(shù)據(jù)增量過(guò)程中,數(shù)據(jù)變更包含刪除數(shù)據(jù)和寫(xiě)入數(shù)據(jù)操作。刪除數(shù)據(jù)操作通過(guò)對(duì)原有的數(shù)據(jù)存儲(chǔ)空間進(jìn)行回收,實(shí)現(xiàn)數(shù)據(jù)的刪除操作。刪除操作并不實(shí)際執(zhí)行磁盤(pán)存儲(chǔ)空間的清空,而是在新的數(shù)據(jù)寫(xiě)入的過(guò)程中,實(shí)現(xiàn)存儲(chǔ)空間的覆蓋性寫(xiě)入。這種做法極大的提高了數(shù)據(jù)操作的運(yùn)行效率。

3.1刪除數(shù)據(jù),存儲(chǔ)空間回收

在數(shù)據(jù)刪除的過(guò)程中,根據(jù)數(shù)據(jù)記錄索引定位數(shù)據(jù)記錄的實(shí)際存儲(chǔ)位置。從數(shù)據(jù)塊中獲取虛數(shù)據(jù)行的信息,將該數(shù)據(jù)記錄的所有虛數(shù)據(jù)行占用索引置為0,并實(shí)現(xiàn)數(shù)據(jù)記錄索引的更新。同時(shí),檢測(cè)該數(shù)據(jù)塊占用索引的值,若為非空閑,則置為空閑。這一過(guò)程如下:

1.根據(jù)行號(hào)i,從數(shù)據(jù)記錄索引中查詢行號(hào)為i的索引(i,loc,len);

2.從數(shù)據(jù)記錄索引中清除該條索引的記錄;

3.以loc的值作為入口,從數(shù)據(jù)塊中定位該數(shù)據(jù)記錄的所有虛行數(shù)據(jù)信息;

curVLine=get(loc),nextVLine=get(curLine.next)

首先根據(jù)loc的值獲取第一個(gè)虛數(shù)據(jù)行,若當(dāng)前數(shù)據(jù)行的next預(yù)留位不為null,則以next作為指針獲取下一個(gè)虛數(shù)據(jù)行信息,直至next為null。

4.將所有的虛行數(shù)據(jù)的行占用索引置為0;

vLine→0

5.檢測(cè)塊占用索引,若為非空閑狀態(tài),則更新為空閑狀態(tài);

dBlock→1

圖8中展示了刪除數(shù)據(jù)的基本流程。如圖所示,這一過(guò)程如下:

1.首先,獲取待刪除數(shù)據(jù)的行號(hào)i;

2.查詢數(shù)據(jù)記錄索引,獲取索引(i,loc,len);

3.在數(shù)據(jù)記錄索引中刪除該條索引;

4.獲取loc指向的虛數(shù)據(jù)行curVLine=get(loc);

5.令j=0,num[j++]=i;

6.判斷curVLine==null?若是,則轉(zhuǎn)步驟9,否則轉(zhuǎn)步驟7;

7.獲取下一虛數(shù)據(jù)行curVLine=get(curVLine.next);

8.記錄當(dāng)前行號(hào)num[j++],轉(zhuǎn)步驟6;

9.獲取當(dāng)前數(shù)據(jù)塊的行占用索引;

10.將num中所有行在行占用索引中表示的占用狀態(tài)的值置為0;

11.檢測(cè)當(dāng)前數(shù)據(jù)塊的塊占用索引;

12.若塊占用索引的狀態(tài)值為0,則轉(zhuǎn)步驟13,否則轉(zhuǎn)步驟14;

13.將塊占用索引的值置為1;

14.結(jié)束。

3.2寫(xiě)入數(shù)據(jù)

在本例中,虛行數(shù)據(jù)實(shí)際存儲(chǔ)的原始數(shù)據(jù)的最大長(zhǎng)度為249字節(jié),因此,在數(shù)據(jù)增量過(guò)程中,根據(jù)原始數(shù)據(jù)的長(zhǎng)度是否大于249字節(jié),數(shù)據(jù)的寫(xiě)入過(guò)程將按照不同的流程實(shí)現(xiàn)。其流程如下:

3.2.1數(shù)據(jù)長(zhǎng)度<=249字節(jié)

在數(shù)據(jù)增量過(guò)程中,若原始數(shù)據(jù)的長(zhǎng)度小于等于249字節(jié),則原始數(shù)據(jù)可以映射成一條虛數(shù)據(jù)行,其實(shí)現(xiàn)過(guò)程如下:

1.根據(jù)行占用索引,獲取第一個(gè)空閑行

firstFreeLine=getFirstFreeLine(dBlock)

2.原始數(shù)據(jù)data映射成虛數(shù)據(jù)行vLine

vLine=data→vLine;

3.vLine寫(xiě)入數(shù)據(jù)塊

vLine→dBlock

4.更新行占用索引

fistFreeLine→1

5.檢測(cè)當(dāng)前數(shù)據(jù)塊的行占用索引,若全部行被占用,則更新塊占用索引為非空閑數(shù)據(jù)塊

dBlockFreeIdx=dBlock→0

6.數(shù)據(jù)記錄索引維護(hù)

圖9中展示了原始數(shù)據(jù)長(zhǎng)度小于等于249字節(jié)的數(shù)據(jù)寫(xiě)入的基本流程。如圖所示,這一過(guò)程如下:

1.首先,從當(dāng)前數(shù)據(jù)塊中獲取第一個(gè)空閑行firstFreeLine;

2.根據(jù)行號(hào)獲取行首位置head;

3.獲取原始數(shù)據(jù)長(zhǎng)度length,在此過(guò)程中,curLength=length;

4.原始數(shù)據(jù)data映射成vLine,其映射規(guī)則為vLine=

vLine(1,head,length,curLength,null,data);

5.vLine寫(xiě)入數(shù)據(jù)塊;

6.更新firstFreeLine的行占用索引,將當(dāng)前行占用索引置為已占用;

7.判斷當(dāng)前數(shù)據(jù)塊是否仍存在空閑行,若存在,轉(zhuǎn)步驟9,否則轉(zhuǎn)步驟8;

8.更新塊占用索引,將當(dāng)前數(shù)據(jù)存儲(chǔ)塊置為非空閑狀態(tài);

9.數(shù)據(jù)記錄索引維護(hù),維護(hù)過(guò)程詳見(jiàn)【2、數(shù)據(jù)寫(xiě)入的索引維護(hù)】部分;

10.結(jié)束。

3.2.2數(shù)據(jù)長(zhǎng)度>249字節(jié)

在數(shù)據(jù)增量過(guò)程中,若原始數(shù)據(jù)的長(zhǎng)度大于249字節(jié),則原始數(shù)據(jù)可以映射成多條虛數(shù)據(jù)行,其實(shí)現(xiàn)過(guò)程如下:

1.首先,計(jì)算原始數(shù)據(jù)映射的虛數(shù)據(jù)行的數(shù)量

2.根據(jù)行占用索引,獲取前num個(gè)空閑行

freeLines=getFreeLines(num)

3.原始數(shù)據(jù)data映射成虛數(shù)據(jù)行vLines

vLines=(data,freeLines)→vLines;

4.vLines寫(xiě)入數(shù)據(jù)塊

vLines→dBlock

5.更新行占用索引

freeLines→1

6.檢測(cè)當(dāng)前數(shù)據(jù)塊的行占用索引,若全部行被占用,則更新塊占用索引為非空閑數(shù)據(jù)塊

dBlockFreeIdx=dBlock→0

7.數(shù)據(jù)記錄索引維護(hù)

圖10中展示了原始數(shù)據(jù)長(zhǎng)度大于249字節(jié)的數(shù)據(jù)寫(xiě)入的基本流程。如圖所示,這一過(guò)程如下:

1.首先,計(jì)算原始數(shù)據(jù)data的長(zhǎng)度length;

2.計(jì)算原始數(shù)據(jù)data映射的虛數(shù)據(jù)行的數(shù)量num;

3.根據(jù)行占用索引,獲取前num個(gè)空閑行freeLines;

4.計(jì)算空閑行的其實(shí)位置heads;

5.原始數(shù)據(jù)data中截取第0至249的字節(jié)流content;

6.映射第1行vLine,vLine[0]=vLine(1,heads[0],length,249,heads[1],content);

7.令i=1;

8.i<(num-1)?若是,則轉(zhuǎn)步驟9,否則轉(zhuǎn)步驟12;

9.原始數(shù)據(jù)data中截取第i*249+1至(i+1)*249的字節(jié)流content;

10.映射第i+1行vLine,

vline[i]=vLine(0,heads[0],length,249,heads[i+1],content);

11.i++,轉(zhuǎn)步驟8;

12.原始數(shù)據(jù)data中截取第i*249+1至末尾的字節(jié)流content;

13.獲取字節(jié)流content的長(zhǎng)度curLength;

14.映射最后一行vLine,

vLine[i]=vLine(0,heads[0],length,curLength,null,content);

15.更新行占用索引,將freeLines置為已占用;

16.判斷當(dāng)前數(shù)據(jù)塊是否存在空閑行?若存在,則轉(zhuǎn)步驟18,否則轉(zhuǎn)步驟17;

17.塊占用索引維護(hù),將當(dāng)前數(shù)據(jù)塊狀態(tài)置為非空閑;

18.數(shù)據(jù)記錄索引維護(hù);

19.結(jié)束。

四.數(shù)據(jù)提取

在數(shù)據(jù)提取的過(guò)程中,根據(jù)數(shù)據(jù)記錄的行號(hào)匹配,實(shí)現(xiàn)數(shù)據(jù)記錄索引的提取,并根據(jù)數(shù)據(jù)記錄索引的信息,實(shí)現(xiàn)數(shù)據(jù)記錄的定位。數(shù)據(jù)塊中的存儲(chǔ)的數(shù)據(jù)記錄可能分布在連續(xù)或不連續(xù)的虛數(shù)據(jù)行中,以數(shù)據(jù)記錄索引中記錄的loc值作為數(shù)據(jù)記錄提取的入口,最終實(shí)現(xiàn)數(shù)據(jù)記錄的提取過(guò)程。這一過(guò)程由以下幾個(gè)步驟完成:

1.首先,根據(jù)數(shù)據(jù)記錄的行號(hào)i進(jìn)行匹配,從數(shù)據(jù)記錄索引中提取出數(shù)據(jù)記錄索引(i,loc,length);

2.以loc值作為數(shù)據(jù)提取的入口,實(shí)現(xiàn)虛數(shù)據(jù)行的提??;

3.自虛數(shù)據(jù)行中提取并封裝出原始數(shù)據(jù)記錄data;

4.計(jì)算獲取的數(shù)據(jù)記錄data的長(zhǎng)度,并和len的值進(jìn)行比較,若兩者相等,則返回data,數(shù)據(jù)提取流程結(jié)束;若兩者不等,則返回?cái)?shù)據(jù)提取錯(cuò)誤標(biāo)識(shí),數(shù)據(jù)提取流程結(jié)束。

圖11中展示了數(shù)據(jù)提取的基本流程。如圖所示,數(shù)據(jù)記錄的提取流程描述如下:

1.首先,獲取數(shù)據(jù)記錄行號(hào)i;

2.根據(jù)i從數(shù)據(jù)記錄索引中提取(i,loc,len)索引;

3.以loc為入口,提取數(shù)據(jù)塊中起始位置為loc的虛數(shù)據(jù)行vLine;

4.記res=vLine.content;

5.判斷vLine.next==null?若是,則轉(zhuǎn)步驟8,否則轉(zhuǎn)步驟6;

6.獲取起始位置為vLine.next的vLine;

7.res+=vLine.content,轉(zhuǎn)步驟5;

8.計(jì)算res的長(zhǎng)度len(res);

9.判斷l(xiāng)en(res)==len?若是,則轉(zhuǎn)步驟10,否則轉(zhuǎn)步驟11;

10.返回res即為所求數(shù)據(jù)記錄,轉(zhuǎn)步驟12;

11.返回?cái)?shù)據(jù)提取錯(cuò)誤標(biāo)識(shí);

12.結(jié)束。

結(jié)合以上手段,本發(fā)明提出一種面向非結(jié)構(gòu)化數(shù)據(jù)的高性能的非結(jié)構(gòu)化數(shù)據(jù)存儲(chǔ)與索引技術(shù),該技術(shù)適用于海云協(xié)同工作平臺(tái)操作行為數(shù)據(jù)的高效存取和修改的需求。經(jīng)過(guò)測(cè)試表明,本發(fā)明提出的技術(shù)相對(duì)于傳統(tǒng)的關(guān)系數(shù)據(jù)庫(kù)和非結(jié)構(gòu)化數(shù)據(jù)庫(kù)在查詢上性能提升19%,空間利用率提高8%,數(shù)據(jù)更新效率提高50%。

以上實(shí)施例僅用以說(shuō)明本發(fā)明的技術(shù)方案而非對(duì)其進(jìn)行限制,本領(lǐng)域的普通技術(shù)人員可以對(duì)本發(fā)明的技術(shù)方案進(jìn)行修改或者等同替換,而不脫離本發(fā)明的精神和范圍,本發(fā)明的保護(hù)范圍應(yīng)以權(quán)利要求書(shū)所述為準(zhǔn)。

當(dāng)前第1頁(yè)1 2 3 
網(wǎng)友詢問(wèn)留言 已有0條留言
  • 還沒(méi)有人留言評(píng)論。精彩留言會(huì)獲得點(diǎn)贊!
1