本發(fā)明涉及嵌入式數(shù)據(jù)庫領(lǐng)域,具體涉及一種異構(gòu)存儲介質(zhì)下嵌入式數(shù)據(jù)庫的管理方法。
背景技術(shù):嵌入式數(shù)據(jù)庫系統(tǒng)在運行環(huán)境和運行方式上與常見的企業(yè)級數(shù)據(jù)庫管理系統(tǒng)有很大差別,主要表現(xiàn)在傳統(tǒng)的企業(yè)級數(shù)據(jù)庫如Oracle、DB2過于龐大,對cpu主頻和磁盤容量有很高的要求,無法在硬件資源有限的嵌入式系統(tǒng)上面安裝和使用;除此之外,傳統(tǒng)數(shù)據(jù)庫缺乏實時響應(yīng)的機制,并且受限于硬盤讀寫速度,無法滿足高實時性的要求。在嵌入式數(shù)據(jù)庫領(lǐng)域,存儲管理的研究目的是運用嵌入式、數(shù)據(jù)庫等多種技術(shù)實現(xiàn)數(shù)據(jù)在存儲器上的高效存儲與快速存取。目前,常見的嵌入式數(shù)據(jù)庫有兩種,內(nèi)存數(shù)據(jù)庫和外存數(shù)據(jù)庫。但無論哪種,都只是基于單一存儲介質(zhì)。內(nèi)存數(shù)據(jù)庫存在于嵌入式處理器的內(nèi)存中,其優(yōu)勢是I/O操作少、訪問速度快,但存在的問題是存儲空間有限,稍微大一些的數(shù)據(jù)量就無法使用;而外存數(shù)據(jù)庫的所有數(shù)據(jù)及索引存儲在外存中,其優(yōu)勢是存儲容量大,但問題是外存讀寫速度慢,頻繁的外存訪問導(dǎo)致數(shù)據(jù)庫效能低下。
技術(shù)實現(xiàn)要素:針對現(xiàn)有的單一存儲介質(zhì)下嵌入式數(shù)據(jù)庫存在的問題,本發(fā)明提出一種異構(gòu)存儲介質(zhì)下的嵌入式數(shù)據(jù)庫管理方法,其目的在于綜合兩種存儲介質(zhì)的優(yōu)勢,提高數(shù)據(jù)庫反應(yīng)速度,擴大數(shù)據(jù)庫存儲容量,充分利用了嵌入式處理器的內(nèi)存,由此解決單一存儲介質(zhì)所帶來的數(shù)據(jù)庫性能瓶頸的技術(shù)問題。一種異構(gòu)存儲介質(zhì)下嵌入式數(shù)據(jù)庫的管理方法,具體為:構(gòu)建數(shù)據(jù)庫的準(zhǔn)備步驟:將數(shù)據(jù)文件分為小數(shù)據(jù)塊和大數(shù)據(jù)塊,并為各數(shù)據(jù)塊分配ID、地址和優(yōu)先級,大數(shù)據(jù)塊的優(yōu)先級低于小數(shù)據(jù)塊,地址初始賦值為數(shù)據(jù)塊待存入的外存地址;為每個數(shù)據(jù)塊建立包含數(shù)據(jù)塊ID、地址和優(yōu)先級信息的索引塊;構(gòu)建包含所有索引塊信息的信息塊;將數(shù)據(jù)庫存入外存的步驟:將信息塊、索引塊和數(shù)據(jù)塊存入外存;將數(shù)據(jù)庫加載到嵌入式處理器內(nèi)存的步驟:將信息塊加載到內(nèi)存,依據(jù)信息塊攜帶的索引塊信息將索引塊加載到內(nèi)存,依據(jù)索引塊攜帶的數(shù)據(jù)塊信息將小數(shù)據(jù)塊中優(yōu)先級高的加載到內(nèi)存,并將被加載小數(shù)據(jù)塊的索引塊內(nèi)的地址更新為所在內(nèi)存地址;訪問數(shù)據(jù)庫的步驟:嵌入式處理器查詢到待訪問數(shù)據(jù)的索引塊,若該數(shù)據(jù)塊存在于內(nèi)存,則根據(jù)索引塊攜帶的內(nèi)存地址訪問數(shù)據(jù),若該數(shù)據(jù)塊存在于外存,則根據(jù)索引塊攜帶的外存地址訪問數(shù)據(jù)。進一步地,還包括數(shù)據(jù)塊在內(nèi)存的動態(tài)調(diào)度步驟:對于已經(jīng)完成訪問的內(nèi)存數(shù)據(jù)塊,將其優(yōu)先級降到最低級;對于訪問時延要求降低的內(nèi)存數(shù)據(jù)文件,將其優(yōu)先級降低;將上述兩種降低優(yōu)先級的內(nèi)存數(shù)據(jù)塊釋放到外存,并將其索引塊內(nèi)的地址更新為所在外存地址;根據(jù)內(nèi)存使用情況,綜合考慮將訪問時延要求和優(yōu)先級相對較高的外存數(shù)據(jù)塊補充加載到內(nèi)存,并將該數(shù)據(jù)塊的索引塊內(nèi)的地址更新為其所在內(nèi)存地址。進一步地,在所述構(gòu)建數(shù)據(jù)庫的準(zhǔn)備步驟中,還根據(jù)邏輯形式將所述大數(shù)據(jù)塊劃分為一維大數(shù)據(jù)塊和二維大數(shù)據(jù)塊;二維大數(shù)據(jù)塊被劃分為多個子塊;所述二維大數(shù)據(jù)塊對應(yīng)的索引塊包括一級索引塊和二級索引塊,一級索引塊包含二級索引塊待存入的外存地址信息,二級索引塊包含各子塊待存入的外存地址信息;在所述將數(shù)據(jù)庫加載到嵌入式處理器內(nèi)存的步驟中,將二維大數(shù)據(jù)塊的一級索引塊和二級索引塊加載到內(nèi)存,并將一級索引塊內(nèi)的地址更新為二級索引塊在內(nèi)存中的地址;在所述訪問數(shù)據(jù)庫的步驟中,嵌入式處理器查詢到待訪問數(shù)據(jù)的一級索引塊,進而找到對應(yīng)的二級索引塊,再根據(jù)二級索引塊攜帶的子塊地址信息訪問外存中的子塊。進一步地,在所述構(gòu)建數(shù)據(jù)庫的準(zhǔn)備步驟中,對于小數(shù)據(jù)塊按照被訪問緊急程度和訪問頻率綜合考慮越高則優(yōu)先級別越高的原則分配優(yōu)先級,大數(shù)據(jù)塊的優(yōu)先級設(shè)置為最低級。進一步地,所述信息塊、索引塊存儲于數(shù)據(jù)庫的第一個頁面,小數(shù)據(jù)量文件以多個文件合并方式從數(shù)據(jù)庫第二個頁面開始的位置起存儲,接著存儲二維大數(shù)據(jù)塊的各子塊,最后存儲一維大數(shù)據(jù)塊。本發(fā)明的技術(shù)效果體現(xiàn)在:本發(fā)明組合使用內(nèi)存和外存兩種存儲介質(zhì),將大數(shù)據(jù)文件存儲在外部大容量存儲器,小數(shù)據(jù)文件根據(jù)嵌入式處理器內(nèi)存使用情況及文件的優(yōu)先級決定其存儲在內(nèi)存還是外部大容量存儲器,綜合兩種存儲介質(zhì)的優(yōu)勢,提高數(shù)據(jù)庫反應(yīng)速度,擴大數(shù)據(jù)庫存儲容量。采用優(yōu)先級機制,使用戶能以最快的速度訪問到最需要訪問的數(shù)據(jù),滿足了用戶的數(shù)據(jù)使用需求。進一步地,對內(nèi)存進行動態(tài)調(diào)度,將訪問幾率低和時延要求降低的數(shù)據(jù)塊釋放于外存,而訪問時延要求和訪問幾率高的數(shù)據(jù)塊補充加載到內(nèi)存中,提高數(shù)據(jù)訪問效率,彌補嵌入式處理器內(nèi)存容量小的客觀短板。進一步地,在數(shù)據(jù)庫加載和動態(tài)調(diào)度的過程中使用了自適應(yīng)內(nèi)存分配技術(shù),有效地利用了寶貴的內(nèi)存資源,提高了數(shù)據(jù)庫反應(yīng)速度。進一步地,對數(shù)據(jù)塊的尋址采用差別化的策略,小數(shù)據(jù)文件和一維大數(shù)據(jù)文件一級索引尋址,二維大數(shù)據(jù)文件二級索引尋址,拓展了數(shù)據(jù)庫的存儲容量。進一步地,數(shù)據(jù)在外存采取不同的存儲方法,二維大數(shù)據(jù)文件切割后分塊存儲,提高了二維大數(shù)據(jù)文件的訪問速度;小數(shù)據(jù)文件可以連續(xù)存儲,可以充分利用存儲資源。總體而言,通過本發(fā)明所構(gòu)思的以上技術(shù)方案與現(xiàn)有技術(shù)相比,由于異構(gòu)存儲、優(yōu)先級機制、動態(tài)調(diào)度、自適應(yīng)內(nèi)存分配技術(shù)的使用,能夠取得反應(yīng)速度通常在1us以內(nèi),存儲容量達(dá)到GB級別、內(nèi)存利用率高的有益效果。附圖說明圖1為存儲結(jié)構(gòu)及尋址方式;圖2為數(shù)據(jù)庫構(gòu)建流程;圖3為索引編號示例;圖4為動態(tài)調(diào)度中內(nèi)存數(shù)據(jù)文件搬移到外存示意圖;圖5為動態(tài)調(diào)度中外存數(shù)據(jù)文件搬移到內(nèi)存示意圖。具體實施方式為了使本發(fā)明的目的、技術(shù)方案及優(yōu)點更加清楚明白,以下結(jié)合附圖及實施例,對本發(fā)明進行進一步詳細(xì)說明。應(yīng)當(dāng)理解,此處所描述的具體實施例僅僅用以解釋本發(fā)明,并不用于限定本發(fā)明。此外,下面所描述的本發(fā)明各個實施方式中所涉及到的技術(shù)特征只要彼此之間未構(gòu)成沖突就可以相互組合。參見圖1,本發(fā)明提出嵌入式數(shù)據(jù)庫異構(gòu)存儲介質(zhì)存儲,數(shù)據(jù)庫的內(nèi)存選擇性存儲于嵌入式處理器內(nèi)存和外部存儲器,基本原則是將大數(shù)據(jù)文件存儲在外部大容量存儲器,小數(shù)據(jù)文件根據(jù)嵌入式處理器內(nèi)存使用情況及文件的優(yōu)先級決定其存儲在內(nèi)存還是外部大容量存儲器。本發(fā)明數(shù)據(jù)庫包含信息塊、索引塊、數(shù)據(jù)塊三級結(jié)構(gòu)。數(shù)據(jù)庫適用于常見的嵌入式處理器+FLASH存儲芯片環(huán)境。首先,對本發(fā)明涉及的術(shù)語即信息塊、索引塊、數(shù)據(jù)塊的定義如下:信息塊,描述數(shù)據(jù)庫的基本信息,起到標(biāo)識數(shù)據(jù)庫、指導(dǎo)應(yīng)用程序分配內(nèi)存空間、輔助尋址的作用,其屬性如表1所示。序號符號數(shù)據(jù)類型屬性1DbId無符號16位整型數(shù)據(jù)庫的標(biāo)記2IdxSize無符號16位整型單個索引塊的大小,以字節(jié)為單位3IdxNum無符號16位整型索引塊個數(shù)4IdxAddr無符號32位整型索引塊的起始地址5IntSize無符號32位整型適合內(nèi)存的數(shù)據(jù)塊大小6ExtSize無符號32位整型適合外存的數(shù)據(jù)塊大小表1信息塊屬性表索引塊,描述數(shù)據(jù)塊的優(yōu)先級、地址信息,起到?jīng)Q定調(diào)度策略及尋址的作用。索引塊分為一級索引塊和二級索引塊,其屬性如表2和3所示。一級索引塊表2一級索引塊屬性表二級索引塊表3二級索引塊屬性表數(shù)據(jù)塊,包含具體的數(shù)據(jù),其屬性如表4所示。序號符號數(shù)據(jù)類型屬性1ChkId無符號16位整型數(shù)據(jù)塊的標(biāo)記2Data具體數(shù)據(jù)表4數(shù)據(jù)塊屬性表基于上述數(shù)據(jù)庫結(jié)構(gòu),本發(fā)明提供了一種異構(gòu)存儲介質(zhì)下的嵌入式數(shù)據(jù)庫管理方法的實例,詳細(xì)流程參見圖2,本實例方法具體為:一、數(shù)據(jù)庫的準(zhǔn)備工作1.1文件定義將數(shù)據(jù)文件劃分為小數(shù)據(jù)塊(下文稱小數(shù)據(jù)量文件)和大數(shù)據(jù)塊(下文稱大數(shù)據(jù)量文件),劃分的依據(jù)是文件大小相對于嵌入式處理器內(nèi)存容量的比例,可根據(jù)經(jīng)驗調(diào)整。本實例中,規(guī)定當(dāng)比例大于20%時定義為大數(shù)量文件,小于此值時為小數(shù)據(jù)量文件。根據(jù)文件的邏輯形式,將大數(shù)據(jù)量文件進一步劃分為一維大數(shù)據(jù)量文件(如程序)和二維大數(shù)據(jù)量文件(如圖像)。1.2存儲定義一維大數(shù)據(jù)量文件在外部存儲器中連續(xù)存儲,其可能涉及跨頁存儲。二維大數(shù)據(jù)量文件分解為若干個子塊,每個子塊不能大于一個存儲頁面的大小,其具體大小由用戶根據(jù)使用需要自行指定,每個子塊存儲到一個頁面。對于小數(shù)據(jù)量文件,則可以多個文件存儲到同一個頁面。1.3分配ID一個一維大數(shù)據(jù)量文件分配一個數(shù)據(jù)塊ID,二維大數(shù)據(jù)量文件的每個分塊分配一個數(shù)據(jù)塊ID,一個小數(shù)據(jù)量文件分配一個數(shù)據(jù)塊ID。ID編號規(guī)則為從小數(shù)據(jù)量文件開始,接著是一維大數(shù)據(jù)量文件,最后是二維大數(shù)據(jù)量文件的分塊,從低到高連續(xù)編號。二、將信息塊、索引塊和數(shù)據(jù)塊存入外存。2.1存儲規(guī)劃信息塊、索引塊存儲在數(shù)據(jù)庫最開始的一個頁面,小數(shù)據(jù)量文件存儲在從數(shù)據(jù)庫第2個頁面開始的位置,接著是二維大數(shù)據(jù)量文件的分塊,最后是一維大數(shù)據(jù)量文件。小數(shù)據(jù)量文件可以多個文件合并存儲到一個頁面,遵循的原則是盡可能提高外部存儲器的利用率。二維大數(shù)據(jù)量文件是每個分塊存儲到一個頁面。一維大數(shù)據(jù)量文件連續(xù)存儲,可能跨越多個頁面存儲。2.2統(tǒng)計數(shù)據(jù)塊的地址與長度信息按照2.1中所描述的存儲方法,統(tǒng)計各數(shù)據(jù)塊的地址與長度。2.3填充索引塊的內(nèi)容對于小數(shù)據(jù)量文件,給每個文件創(chuàng)建一個索引塊,將IdxId置為ChkId,IdxH2nd設(shè)置為不含二級索引,IdxFlg置為在外存,IdxChkAddr設(shè)置為小數(shù)據(jù)量文件在外存的地址,IdxChkLen設(shè)置為小數(shù)據(jù)量文件的長度;依據(jù)訪問頻繁程度、調(diào)用的緊急程度設(shè)置其優(yōu)先級,如果數(shù)據(jù)文件被頻繁訪問或調(diào)用時要求時延很小,在內(nèi)存許可的情況下,將其IdxPri置為優(yōu)先級1,其他要求低一些的則設(shè)置為優(yōu)先級2,不要求直接加載到內(nèi)存的設(shè)置為優(yōu)先級3。對于二維大數(shù)據(jù)量文件,首先創(chuàng)建一個一級索引,將IdxId置為文件起始分塊的ChkId,IdxH2nd設(shè)置為包含二級索引,IdxFlg設(shè)置為在外存,將其IdxPri置為優(yōu)先級1;IdxChkId設(shè)置為文件起始分塊的ChkId,IdxChkAddr設(shè)置為二級索引塊的地址,IdxChkLen設(shè)置為二級索引塊的長度。創(chuàng)建二級索引塊,Idx2Id設(shè)置為文件起始分塊的ChkId,Idx2Flg設(shè)置為在外存,Idx2Pri置為優(yōu)先級4,Idx2ChkId[n]按照數(shù)據(jù)塊編號順序設(shè)置為每個分塊的ChkId,具體編號示例可以參見圖3,Idx2ChkAddr[n]按照數(shù)據(jù)塊編號順序設(shè)置為每個分塊的地址,Idx2ChkLen[n]按照數(shù)據(jù)塊編號順序設(shè)置為每個分塊的長度。對于一維大數(shù)據(jù)量文件,給每個文件創(chuàng)建一個索引塊,將IdxId置為ChkId,IdxH2nd設(shè)置為不含二級索引,IdxFlg設(shè)置為在外存,將其IdxPri置為優(yōu)先級4,IdxChkAddr設(shè)置為一維大數(shù)據(jù)量文件在外存的地址,IdxChkLen設(shè)置為一維大數(shù)據(jù)量文件的長度。2.4填充信息塊的內(nèi)容給數(shù)據(jù)庫分配唯一的DbId,IdxSize設(shè)置為一級索引塊的大小,IdxNum設(shè)置為2.3中所創(chuàng)建的一級索引塊的個數(shù),IdxAddr設(shè)置為第一個一級索引塊的地址,IntSize設(shè)置為優(yōu)先級為1的數(shù)據(jù)塊的總的大小,ExtSize設(shè)置為其余優(yōu)先級的數(shù)據(jù)塊的總的大小。當(dāng)上述信息準(zhǔn)備好后,將數(shù)據(jù)庫存入外部存儲器中。三、將數(shù)據(jù)庫加載到嵌入式處理器內(nèi)存中加載的基本思路是:將信息塊加載到內(nèi)存,依據(jù)信息塊攜帶的索引塊信息將索引塊加載到內(nèi)存,依據(jù)索引塊攜帶的數(shù)據(jù)塊信息將小數(shù)據(jù)塊中優(yōu)先級高的加載到內(nèi)存,并將被加載小數(shù)據(jù)塊的索引塊內(nèi)的地址更新為所在內(nèi)存地址。特別的針對二維大數(shù)據(jù)塊的,將其一級索引和二級索引加載到內(nèi)存,并將一級索引內(nèi)的地址更新為二級索引在內(nèi)存中的地址。本實例加載的具體過程為:3.1嵌入式處理器啟動后,將嵌入式數(shù)據(jù)庫信息塊的起始地址告知程序,程序在內(nèi)存中分配固定長度的存儲空間,將信息塊從外存加載到該空間。3.2程序依據(jù)信息塊中參數(shù)IdxSize和IdxNum,計算出索引塊的總長度,在內(nèi)存中分配所需長度的存儲空間,依據(jù)參數(shù)IdxAddr將所有一級索引塊加載到該空間。3.3加載數(shù)據(jù)塊3.3.1計算所需內(nèi)存空間,將索引塊中參數(shù)IdxH2nd為包含二級索引的IdxChkLen,加上索引塊中參數(shù)IdxH2nd為不含二級索引、參數(shù)IdxPri等于優(yōu)先級1的IdxChkLen,再估算出內(nèi)存所??臻g,如果空間剩余較多,則增加部分優(yōu)先級2的數(shù)據(jù)塊,計算出最后的長度。3.3.2根據(jù)步驟3.3.1計算出的長度,分配所需內(nèi)存空間。3.3.3根據(jù)IdxChkAddr加載步驟3.3.1中已判定要加載的數(shù)據(jù)塊。3.3.4將二級索引塊加載到內(nèi)存空間。數(shù)據(jù)庫加載的后續(xù)工作:對于已加載到內(nèi)存的小數(shù)據(jù)量文件,將其索引塊的IdxChkAddr修改為其數(shù)據(jù)塊在內(nèi)存中的地址,將其索引塊的IdxFlg修改為在內(nèi)存。對于二維大數(shù)據(jù)量文件,將其一級索引塊的IdxChkAddr修改為其二級索引塊在內(nèi)存中的地址,將其一級索引塊的IdxFlg修改為在內(nèi)存。將信息塊的IdxAddr修改為第一個索引塊在內(nèi)存中的起始地址。四、訪問數(shù)據(jù)庫訪問數(shù)據(jù)庫的策略是:嵌入式處理器查詢到待訪問數(shù)據(jù)的索引塊,若該數(shù)據(jù)塊存在于內(nèi)存,則根據(jù)索引塊攜帶的內(nèi)存地址直接訪問數(shù)據(jù),若該數(shù)據(jù)塊存在于外存,則根據(jù)索引塊攜帶的外存地址訪問數(shù)據(jù)。本實例訪問數(shù)據(jù)庫的具體實現(xiàn)過程為:對于給定的ChkId,如果一級索引塊IdxId==ChkId,而且IdxH2nd為不含二級索引,則可以根據(jù)IdxChkAddr和IdxChkLen直接訪問數(shù)據(jù)塊,如果IdxFlg為在內(nèi)存,則IdxChkAddr表示內(nèi)存地址,如果IdxFlg為在外存,則IdxChkAddr表示外存地址。對于給定的ChkId,如果一級索引塊IdxId==ChkId,而IdxH2nd為包含二級索引,則依據(jù)IdxChkAddr訪問二級索引,由于二級索引中Idx2ChkId[0]==ChkId,所以根據(jù)Idx2ChkAddr[0]和Idx2ChkLen[0]直接訪問數(shù)據(jù)塊。對于給定的ChkId,如果索引塊IdxId?。紺hkId,則需進一步判斷:如果(ChkId>當(dāng)前IdxId)且(ChkId<下一個IdxId),則認(rèn)為所要找的數(shù)據(jù)塊在當(dāng)前一級索引所指向的二級索引中可以找到,所以訪問二級索引,找到Idx2ChkId[n]==ChkId,根據(jù)Idx2ChkAddr[n]訪問數(shù)據(jù)塊;如果(ChkId>當(dāng)前IdxId),并且下一個IdxId不存在,則認(rèn)為所要找的數(shù)據(jù)塊在當(dāng)前一級索引所指向的二級索引中可以找到,所以訪問二級索引,找到Idx2ChkId[n]==ChkId,根據(jù)Idx2ChkAddr[n]訪問數(shù)據(jù)塊。五、數(shù)據(jù)文件在內(nèi)存的動態(tài)調(diào)度對于已經(jīng)完成訪問的內(nèi)存數(shù)據(jù)塊,將其優(yōu)先級降到最低級;對于訪問時延要求降低的內(nèi)存數(shù)據(jù)文件,將其優(yōu)先級降低;將上述兩種降低優(yōu)先級的內(nèi)存數(shù)據(jù)塊釋放到外存,并將其索引塊內(nèi)的地址更新為所在外存地址;根據(jù)內(nèi)存使用情況,綜合考慮將訪問時延要求和優(yōu)先級相對較高的外存數(shù)據(jù)塊補充加載到內(nèi)存,并將該數(shù)據(jù)塊的索引塊內(nèi)的地址更新為其所在內(nèi)存地址。在本實例中,對于已經(jīng)完成訪問的內(nèi)存數(shù)據(jù)文件,將其索引塊中的IdxPri修改為優(yōu)先級4,對于訪問時延要求降低的內(nèi)存數(shù)據(jù)文件,將其索引塊中的IdxPri修改為優(yōu)先級3。當(dāng)系統(tǒng)空閑時,收回優(yōu)先級4的數(shù)據(jù)文件的內(nèi)存空間,將其在索引塊中的IdxChkAddr修改為數(shù)據(jù)文件在外存的地址,將IdxFlg修改為在外存,示意圖參見圖4。根據(jù)最新的內(nèi)存使用情況,將部分訪問時延要求較高的優(yōu)先級2數(shù)據(jù)文件加載到內(nèi)存,將其索引塊的IdxChkAddr修改為其數(shù)據(jù)塊在內(nèi)存中的地址,將其索引塊的IdxFlg修改為在內(nèi)存,示意圖參見圖5。本領(lǐng)域的技術(shù)人員容易理解,以上所述僅為本發(fā)明的較佳實施例而已,并不用以限制本發(fā)明,凡在本發(fā)明的精神和原則之內(nèi)所作的任何修改、等同替換和改進等,均應(yīng)包含在本發(fā)明的保護范圍之內(nèi)。