一種實時數(shù)據(jù)庫的存儲方法
【專利摘要】本發(fā)明公開了一種實時數(shù)據(jù)庫的存儲方法,包括:使用有損壓縮算法對歷史數(shù)據(jù)過濾;歷史數(shù)據(jù)通過有損壓縮的例外檢查時,將歷史數(shù)據(jù)寫入當前內(nèi)存表和操作日志緩沖區(qū);當前內(nèi)存表滿時,將當前內(nèi)存表中的歷史數(shù)據(jù)壓縮后寫入到分鐘級歷史數(shù)據(jù)文件中,申請一個新內(nèi)存表作為當前內(nèi)存表;合并線程在每天預設時間將多個分鐘級歷史數(shù)據(jù)文件合并為日級歷史數(shù)據(jù)文件,在每月預設時間將多個日級歷史數(shù)據(jù)文件合并為月級歷史數(shù)據(jù)文件,在每年預設時間將多個月級歷史數(shù)據(jù)文件合并為年級歷史數(shù)據(jù)文件。本發(fā)明支持多核優(yōu)化、固態(tài)硬盤優(yōu)化,采用文件塊結(jié)構(gòu)設計,保證數(shù)據(jù)寫入全順序操作;本發(fā)明具有更快的歷史數(shù)據(jù)讀寫速度,滿足綜合監(jiān)控系統(tǒng)對歷史數(shù)據(jù)的處理的需求。
【專利說明】一種實時數(shù)據(jù)庫的存儲方法
【技術(shù)領域】
[0001]本發(fā)明涉及實時數(shù)據(jù)庫技術(shù),特別涉及一種實時數(shù)據(jù)庫的存儲方法。
【背景技術(shù)】
[0002]目前,在很多領域中一般使用關系數(shù)據(jù)庫存貯歷史數(shù)據(jù)。然而,在很多高頻采樣、海量數(shù)據(jù)的應用場景(例如,軌道交通綜合監(jiān)控)下,關系數(shù)據(jù)庫在讀寫性能和存貯容量上都遇到了瓶頸,難以滿足綜合監(jiān)控系統(tǒng)對歷史數(shù)據(jù)處理的需求。以軌道交通綜合監(jiān)控領域為例,報表統(tǒng)計、事故反演、培訓仿真等操作都需要處理海量的歷史運營數(shù)據(jù),因此,綜合監(jiān)控系統(tǒng)對歷史數(shù)據(jù)處理的要求也越來越高,關系數(shù)據(jù)庫也越來越難以滿足上述的要求。
[0003]為了解決上述的問題,在現(xiàn)有技術(shù)中開始使用實時數(shù)據(jù)庫系統(tǒng)對系統(tǒng)的歷史數(shù)據(jù)進行相應的處理。實時數(shù)據(jù)庫系統(tǒng)是開發(fā)工業(yè)監(jiān)控系統(tǒng)、數(shù)據(jù)采集系統(tǒng)等的支撐系統(tǒng),能夠解決行業(yè)內(nèi)歷史數(shù)據(jù)處理的性能和容量瓶頸,因此在流程行業(yè)中大量使用了實時數(shù)據(jù)庫系統(tǒng)。
[0004]時序數(shù)據(jù)庫,全稱為時間序列數(shù)據(jù)庫,是實時數(shù)據(jù)庫的另一種名稱。在本發(fā)明中,時序數(shù)據(jù)庫與實時數(shù)據(jù)庫所指的對象完全一樣。主要用于指處理帶時間標簽(按照時間的順序變化,即時間序列化)的數(shù)據(jù),帶時間標簽的數(shù)據(jù)也稱為時間序列數(shù)據(jù)。
[0005]時間序列數(shù)據(jù)主要由軌道交通行業(yè)、電力行業(yè)、化工行業(yè)等各類型實時監(jiān)測、檢查與分析設備所采集、產(chǎn)生的數(shù)據(jù),這些工業(yè)數(shù)據(jù)的典型特點是:產(chǎn)生頻率快(每一個監(jiān)測點一秒鐘內(nèi)可產(chǎn)生多條數(shù)據(jù))、嚴重依賴于采集時間(每一條數(shù)據(jù)均要求對應唯一的時間)、測點多信息量大(常規(guī)的實時監(jiān)測系統(tǒng)均有成千上萬的監(jiān)測點,監(jiān)測點每秒鐘都產(chǎn)生數(shù)據(jù),每天產(chǎn)生幾十GB的數(shù)據(jù)量)。由上可知,基于時間序列數(shù)據(jù)的特點,關系型數(shù)據(jù)庫無法滿足對時間序列數(shù)據(jù)的有效存儲與處理,必須使用實時數(shù)據(jù)庫對上述的時間序列歷史數(shù)據(jù)進行存儲和處理。
[0006]時間序列歷史數(shù)據(jù),如工業(yè)監(jiān)控領域的模擬量歷史數(shù)據(jù),一般是由如下四元組構(gòu)成:測點ID、時間戳、質(zhì)量戳、值。實時數(shù)據(jù)庫的歷史數(shù)據(jù)中可以存貯多個測點(數(shù)量從I萬到1000萬)的海量時間序列歷史數(shù)據(jù)。
[0007]另外,在現(xiàn)有技術(shù)中,硬盤是一種常用的用于存儲數(shù)據(jù)的介質(zhì)?,F(xiàn)有技術(shù)中常用的硬盤一般有兩種:機械硬盤和固態(tài)硬盤(Solid State Drive)。
[0008]機械硬盤即為傳統(tǒng)普通硬盤,主要由:盤片,磁頭,盤片轉(zhuǎn)軸及控制電機,磁頭控制器,數(shù)據(jù)轉(zhuǎn)換器,接口,緩存等幾個部分組成。機械硬盤中所有的盤片都裝在一個旋轉(zhuǎn)軸上,每張盤片之間是平行的,在每個盤片的存儲面上有一個磁頭,所有的磁頭聯(lián)在一個磁頭控制器上,由磁頭控制器負責各個磁頭的運動。磁頭可沿盤片的半徑方向運動,加上盤片每分鐘幾千轉(zhuǎn)的高速旋轉(zhuǎn),磁頭就可以定位在盤片的指定位置上進行數(shù)據(jù)的讀寫操作。
[0009]固態(tài)硬盤是由控制單元和存儲單元(FLASH芯片)組成,簡單的說就是用固態(tài)電子存儲芯片陣列而制成的硬盤,固態(tài)硬盤的接口規(guī)范和定義、功能及使用方法上與機械硬盤相同,比機械硬盤讀寫速度快,但成本比機械硬盤要高。目前成本較高
[0010]在對數(shù)據(jù)進行讀寫時,機械硬盤一次讀寫的時間由兩個部分組成:讀寫時間=硬盤尋道時間+數(shù)據(jù)讀寫時間。
[0011]機械硬盤有多個磁盤片組成,每個磁盤又由多個同心的磁道構(gòu)成,磁頭移動到目標磁道的時間就是尋道時間(seek time),一般的硬盤平均尋道時間是10ms,而順序讀寫1000K數(shù)據(jù)需要20ms。即一次順序讀寫1000K數(shù)據(jù)需要30ms (10ms+20ms),而如果隨機讀寫1000K數(shù)據(jù),假定每次讀寫1K,讀寫IK數(shù)據(jù)需要10ms,則需要20000ms (1000*10ms+1000*10ms),可以看出,磁盤隨機讀寫比磁盤順序讀寫慢幾個數(shù)量級。
[0012]在現(xiàn)有技術(shù)中,常規(guī)的關系數(shù)據(jù)庫可以采用B+樹索引結(jié)構(gòu)。B+樹索引結(jié)構(gòu)追求盡可能少地減少磁盤讀寫次數(shù),但不保證建立索引時的磁盤順序讀寫,特別在樹平衡分裂時,會有多交隨機讀寫。許多實時數(shù)據(jù)庫也使用了 b+樹索引結(jié)構(gòu),例如:申請?zhí)枮镃N102402602A,發(fā)明名稱為“一種實時數(shù)據(jù)庫的B+樹索引方法及裝置”的中國專利申請;申請?zhí)枮镃N103020078A,發(fā)明名稱為“分布式實時數(shù)據(jù)庫數(shù)據(jù)層次索引方法”的中國專利申請等,而申請?zhí)枮镃N102654863A,發(fā)明名稱為“一種實時數(shù)據(jù)庫歷史數(shù)據(jù)組織管理方式”的中國專利申請中,雖然采用了改進型B+樹索引結(jié)構(gòu),但是仍不能避免隨機寫操作。
[0013]現(xiàn)有技術(shù)中也有部分實時數(shù)據(jù)庫沒有采用b+樹索引結(jié)構(gòu),而是針對時間序列數(shù)據(jù)的特征設計特定的索引結(jié)構(gòu),例如:申請?zhí)枮镃N102184226A,發(fā)明名稱為“一種實時數(shù)據(jù)庫的構(gòu)建方法和數(shù)據(jù)檢索方法”的中國專利申請;申請?zhí)枮镃N201010235099,發(fā)明名稱為“一種使用類聚簇的實時數(shù)據(jù)庫存儲方法”的中國專利申請;申請?zhí)枮镃N103593409A,發(fā)明名稱為“實時數(shù)據(jù)庫檢索方法及檢索系統(tǒng)”的中國專利申請;申請?zhí)枮镃N103336828A,發(fā)明名稱為“實時數(shù)據(jù)庫讀取及寫入方法”的中國專利申請;申請?zhí)枮镃N103853752A,發(fā)明名稱為“管理時間序列數(shù)據(jù)庫的方法和裝置”的中國專利申請;申請?zhí)枮镃N102890722A,發(fā)明名稱為“應用于時序歷史數(shù)據(jù)庫的索引方法”的中國專利申請等所采用的是自定義索引結(jié)構(gòu),但是在數(shù)據(jù)插入時仍然會產(chǎn)生隨機寫操作。
[0014]另外,申請?zhí)枮镃N1564158A,發(fā)明名稱為“實時數(shù)據(jù)庫建模、存儲和訪問方法”的中國專利申請中采用了直接磁盤扇區(qū)讀寫方式,不需要建立索引。但是,該方法不能利用現(xiàn)在操作系統(tǒng)的文件系統(tǒng)特性,操作太底層,不能應對扇區(qū)故障等問題,只能應用于嵌入式系統(tǒng)。
[0015]此外,現(xiàn)有技術(shù)中的現(xiàn)代數(shù)據(jù)庫一般均使用鎖或多版本技術(shù)來實現(xiàn)并發(fā)讀寫,但是,采用鎖或多版本技術(shù)的讀寫并發(fā)程度并不是非常高。現(xiàn)有技術(shù)中,申請?zhí)枮镃N103336828A,發(fā)明名稱為“實時數(shù)據(jù)庫讀取及寫入方法”的中國專利申請中提到了一種加鎖方式,可有效提高讀寫性能,但是卻不能支持多寫并發(fā)操作。
[0016]由此可知,現(xiàn)有技術(shù)中的實時數(shù)據(jù)庫的歷史數(shù)據(jù)的存儲方法中都或多或少地存在上述的一些問題,因此難以滿足對實時數(shù)據(jù)庫的歷史數(shù)據(jù)的存儲的需要。
【發(fā)明內(nèi)容】
[0017]有鑒于此,本發(fā)明提供一種實時數(shù)據(jù)庫的存儲方法,從而可以具有更快的歷史數(shù)據(jù)讀寫速度,滿足綜合監(jiān)控系統(tǒng)對歷史數(shù)據(jù)的處理的需求。
[0018]本發(fā)明的技術(shù)方案具體是這樣實現(xiàn)的:
[0019]一種實時數(shù)據(jù)庫的存儲方法,該方法包括:
[0020]使用有損壓縮算法對需要寫入實時數(shù)據(jù)庫的歷史數(shù)據(jù)進行過濾;
[0021]當所述歷史數(shù)據(jù)通過所述有損壓縮的例外檢查時,將所述歷史數(shù)據(jù)寫入當前的內(nèi)存表和操作日志緩沖區(qū);
[0022]當當前的內(nèi)存表滿時,將當前的內(nèi)存表中的歷史數(shù)據(jù)經(jīng)壓縮后寫入到當前時刻所對應的分鐘級歷史數(shù)據(jù)文件中,申請一個新的內(nèi)存表,并將所申請的新內(nèi)存表作為當前的內(nèi)存表;
[0023]合并線程在每天的預設時間將多個分鐘級歷史數(shù)據(jù)文件合并為日級歷史數(shù)據(jù)文件,在每月的預設時間將多個日級歷史數(shù)據(jù)文件合并為月級歷史數(shù)據(jù)文件,在每年的預設時間將多個月級歷史數(shù)據(jù)文件合并為年級歷史數(shù)據(jù)文件。
[0024]較佳的,所述將所述歷史數(shù)據(jù)寫入當前的內(nèi)存表包括:
[0025]當需要將測點的歷史數(shù)據(jù)寫入到內(nèi)存表中時,先獲取當前內(nèi)存表中的當前可用位置。
[0026]將所述歷史數(shù)據(jù)寫入到當前內(nèi)存表中的當前可用位置中。
[0027]當一個歷史數(shù)據(jù)寫入完畢后,確定所述內(nèi)存表中的下一個可用位置,并將所確認的下一個可用位置作為該內(nèi)存表的當前的可用位置。
[0028]較佳的,所述寫入到內(nèi)存表中的歷史數(shù)據(jù)的內(nèi)容至少包括:
[0029]測點標識、時間戳、質(zhì)量戳和值。
[0030]較佳的,按區(qū)域和子系統(tǒng)將所述歷史數(shù)據(jù)保存為相應的歷史數(shù)據(jù)文件。
[0031]較佳的,所述歷史數(shù)據(jù)文件由多個塊構(gòu)成;
[0032]所述塊的類型包括:文件尾塊、首索引塊、索引塊和數(shù)據(jù)塊。
[0033]較佳的,所述文件尾塊的有效內(nèi)容為固定長度。
[0034]較佳的,該方法還進一步包括:
[0035]根據(jù)所接收的數(shù)據(jù)查詢請求中的傳入時間參數(shù),確定對應的歷史數(shù)據(jù)文件;
[0036]讀取所確定的歷史數(shù)據(jù)文件的文件尾塊,確定對應的首索引塊;
[0037]根據(jù)數(shù)據(jù)查詢請求中的測點標識,確定該測點的索引塊的位置;。
[0038]在所確定的索引塊中根據(jù)傳入時間參數(shù),確定對應的數(shù)據(jù)塊;
[0039]在所確定的數(shù)據(jù)塊中查詢到與所述傳入時間參數(shù)對應的測點值。
[0040]較佳的,該方法還進一步包括:
[0041 ] 所述操作日志緩存區(qū)中的操作日志以4K的整數(shù)倍為單位寫入到操作日志文件中。
[0042]較佳的,該方法還進一步包括:
[0043]所述當前的內(nèi)存表中的歷史數(shù)據(jù)以4K的整數(shù)倍為單位寫入到分鐘級歷史數(shù)據(jù)文件中。
[0044]較佳的,同時使用固態(tài)硬盤和機械硬盤存儲歷史數(shù)據(jù)和操作日志文件。
[0045]較佳的,所述操作日志文件的寫入操作、歷史數(shù)據(jù)文件的寫入操作、歷史數(shù)據(jù)文件的合并操作均為順序讀寫的操作。
[0046]如上可見,在本發(fā)明中的實時數(shù)據(jù)庫的存儲方法中,在將實時數(shù)據(jù)庫的歷史數(shù)據(jù)寫入內(nèi)存表時,對磁盤文件的操作全部都是順序操作,而沒有隨機寫操作,因此可以充分利用機械硬盤的順序操作的高效特性。同時,本發(fā)明中的實時數(shù)據(jù)庫的存儲方法中在寫操作日志和歷史數(shù)據(jù)時,都是以4K的整數(shù)倍為單位整塊讀寫,因此可充分利用固態(tài)硬盤的高效特性,提高數(shù)據(jù)讀寫操作的速度和效率,從而可以在對實時數(shù)據(jù)庫中的歷史數(shù)據(jù)進行讀寫操作時,獲得更快的讀寫速度。例如,現(xiàn)有技術(shù)中的常用實時數(shù)據(jù)庫在非壓縮情況下,對歷史數(shù)據(jù)的讀寫速度一般為每秒5萬至10萬次;而使用本發(fā)明中的實時數(shù)據(jù)庫的存儲方法之后,對歷史數(shù)據(jù)的讀寫速度可達到或超過每秒30萬次。
[0047]另外,由于在本發(fā)明中的實時數(shù)據(jù)庫的存儲方法中,是先獲取當前內(nèi)存表中的當前可用位置,然后再將歷史數(shù)據(jù)寫入到當前內(nèi)存表中的當前可用位置中,因此可以支持并發(fā)讀寫,并支持對多個測點的并發(fā)寫,讀寫操作之間互不干擾,多個測點寫之間也互不干擾,從而可利用現(xiàn)代多核計算機系統(tǒng)的特性,提高實時數(shù)據(jù)庫的并發(fā)訪問能力。
[0048]此外,本發(fā)明中的實時數(shù)據(jù)庫的歷史數(shù)據(jù)文件存貯結(jié)構(gòu)可以有效地利用時間序列數(shù)據(jù)的特點,將歷史數(shù)據(jù)按區(qū)域和子系統(tǒng)存貯,每個歷史數(shù)據(jù)文件對應一個固定的時間段,因此可以根據(jù)查詢時間快速定位到相應的歷史數(shù)據(jù)文件,并可在歷史數(shù)據(jù)文件中快速查找到某測點在某時間的值。例如,通過上述的實時數(shù)據(jù)庫的歷史數(shù)據(jù)查詢步驟,可以以最小的定位步驟在歷史數(shù)據(jù)文件中定位到某測點在某時間的值。
【專利附圖】
【附圖說明】
[0049]圖1為本發(fā)明實施例中的實時數(shù)據(jù)庫的存儲方法的流程示意圖。
[0050]圖2為本發(fā)明實施例中的實時數(shù)據(jù)庫的存儲方法的總體示意圖。
[0051]圖3為本發(fā)明實施例中的歷史數(shù)據(jù)寫入內(nèi)存表的示意圖。
[0052]圖4為本發(fā)明實施例中的歷史數(shù)據(jù)文件的結(jié)構(gòu)示意圖。
[0053]圖5為本發(fā)明實施例中的歷史數(shù)據(jù)文件中的文件尾塊的結(jié)構(gòu)示意圖。
[0054]圖6為本發(fā)明實施例中的歷史數(shù)據(jù)文件中的首索引塊的結(jié)構(gòu)示意圖。
[0055]圖7為本發(fā)明實施例中的歷史數(shù)據(jù)文件中的索引塊的結(jié)構(gòu)示意圖。
[0056]圖8為本發(fā)明實施例中的歷史數(shù)據(jù)文件中的數(shù)據(jù)塊的結(jié)構(gòu)示意圖。
【具體實施方式】
[0057]為使本發(fā)明的目的、技術(shù)方案及優(yōu)點更加清楚明白,以下參照附圖并舉實施例,對本發(fā)明進一步詳細說明。
[0058]本實施例提供了一種實時數(shù)據(jù)庫的存儲方法。
[0059]圖1為本發(fā)明實施例中的實時數(shù)據(jù)庫的存儲方法的流程示意圖。圖2為本發(fā)明實施例中的實時數(shù)據(jù)庫的存儲方法的總體示意圖。為如圖1和圖2所示,本發(fā)明實施例中的實時數(shù)據(jù)庫的存儲方法主要包括如下所述的步驟:
[0060]步驟11,使用有損壓縮算法對需要寫入實時數(shù)據(jù)庫的歷史數(shù)據(jù)進行過濾。
[0061]在本發(fā)明的技術(shù)方案中,當需要將歷史數(shù)據(jù)寫入實時數(shù)據(jù)庫時,在將歷史數(shù)據(jù)寫入實時數(shù)據(jù)庫之前,首先需要在前端使用有損壓縮算法對歷史數(shù)據(jù)進行處理,從而對需要寫入實時數(shù)據(jù)庫的歷史數(shù)據(jù)進行過濾。
[0062]步驟12,當所述歷史數(shù)據(jù)通過所述有損壓縮的例外檢查時,將所述歷史數(shù)據(jù)寫入當前的內(nèi)存表和操作日志緩沖區(qū)。
[0063]由此可知,在本發(fā)明的技術(shù)方案中,只有通過有損壓縮的例外檢查時,所述歷史數(shù)據(jù)才會被寫入到預設的內(nèi)存表中。
[0064]另外,在將上述歷史數(shù)據(jù)寫入上述內(nèi)存表的同時,還會將該歷史數(shù)據(jù)寫入操作日志緩存區(qū)。
[0065]較佳的,在本發(fā)明具體實施例中,本方法還可進一步包括:所述操作日志緩存區(qū)中的操作日志以4K的整數(shù)倍為單位寫入到操作日志文件中,從而便于在出現(xiàn)故障之后能及時恢復數(shù)據(jù)。
[0066]步驟13,當當前的內(nèi)存表滿時,將當前的內(nèi)存表中的歷史數(shù)據(jù)經(jīng)壓縮后寫入到當前時刻所對應的分鐘級歷史數(shù)據(jù)文件中,申請一個新的內(nèi)存表,并將所申請的新內(nèi)存表作為當前的內(nèi)存表。
[0067]在本發(fā)明的技術(shù)方案中,每一個時刻都對應一個分鐘級歷史數(shù)據(jù)文件,因此可以通過寫入線程將當前的內(nèi)存表中的歷史數(shù)據(jù)經(jīng)壓縮后寫入到當前時刻所對應的的分鐘級歷史數(shù)據(jù)文件中。同時,還將申請一個新的內(nèi)存表,并將該新的內(nèi)存表作為當前的內(nèi)存表,以便于隨后繼續(xù)寫入新的歷史數(shù)據(jù)。
[0068]較佳的,在本發(fā)明具體實施例中,本方法還可進一步包括:所述當前的內(nèi)存表中的歷史數(shù)據(jù)以4K的整數(shù)倍為單位寫入到分鐘級歷史數(shù)據(jù)文件中。
[0069]較佳的,在本發(fā)明具體實施例中,可以同時使用固態(tài)硬盤和機械硬盤存儲歷史數(shù)據(jù)和操作日志文件。
[0070]由于固態(tài)硬盤是采用FLASH芯片等存貯歷史數(shù)據(jù),不需要機械硬盤的尋道時間,因此讀寫速度比機械硬盤要快得多。但是,固態(tài)硬盤的特理特性決定了只有在每次讀寫時,數(shù)據(jù)塊必須扇區(qū)(大小為4K)對齊,且讀寫整數(shù)個扇區(qū)時才能達到最高性能,如果每次讀寫部分扇區(qū),則讀寫性能會急劇下降。在本發(fā)明的實時數(shù)據(jù)庫的存儲方法中,由于每次的數(shù)據(jù)讀寫操作都是扇區(qū)對齊操作(例如,以4K為單位的讀寫操作),且只讀寫整數(shù)個扇區(qū)的數(shù)據(jù),因此可以有效地發(fā)揮固態(tài)硬盤的優(yōu)點,大大提高數(shù)據(jù)的讀寫速度。
[0071]步驟14,合并線程定時進行檢查,在每天的預設時間將多個分鐘級歷史數(shù)據(jù)文件合并為日級歷史數(shù)據(jù)文件,在每月的預設時間將多個日級歷史數(shù)據(jù)文件合并為月級歷史數(shù)據(jù)文件,在每年的預設時間將多個月級歷史數(shù)據(jù)文件合并為年級歷史數(shù)據(jù)文件。
[0072]較佳的,在本發(fā)明的具體實施例中,上述操作日志文件的寫入操作、歷史數(shù)據(jù)文件的寫入操作、歷史數(shù)據(jù)文件的合并操作等操作都是順序讀寫的操作。
[0073]另外,圖3為本發(fā)明實施例中的歷史數(shù)據(jù)寫入內(nèi)存表的示意圖。如圖3所示,較佳的,在本發(fā)明的具體實施例中,所述將所述歷史數(shù)據(jù)寫入當前的內(nèi)存表可以包括如下所述的步驟:
[0074]步驟21,當需要將測點的歷史數(shù)據(jù)寫入到內(nèi)存表中時,先獲取當前內(nèi)存表中的當前可用位置。
[0075]步驟22,將所述歷史數(shù)據(jù)寫入到當前內(nèi)存表中的當前可用位置中。
[0076]較佳的,在本發(fā)明的具體實施例中,所述寫入到內(nèi)存表中的歷史數(shù)據(jù)的內(nèi)容至少包括:測點標識(ID)、時間戳、質(zhì)量戳和值。
[0077]步驟23,當一個歷史數(shù)據(jù)寫入完畢后,確定所述內(nèi)存表中的下一個可用位置,并將所確認的下一個可用位置作為該內(nèi)存表的當前的可用位置。這樣,當進行下一個歷史數(shù)據(jù)的寫入時,可以直接獲取到內(nèi)存表中的當前的可用位置,并進行后續(xù)的寫入操作。
[0078]例如,如圖3所示,可以通過如下所述的步驟,將多個測點的歷史數(shù)據(jù)寫入到圖3中右邊的內(nèi)存表中:
[0079]步驟31,增加新歷史數(shù)據(jù)時,首先獲取下一個可用位置,并在可用位置上記錄下時間戳、質(zhì)量戳和值。
[0080]步驟32,當所增加的新歷史數(shù)據(jù)是測點i的數(shù)據(jù)時,如果此時測點i的首數(shù)據(jù)位置的值為空,則在寫入所述新歷史數(shù)據(jù)時,將測點i的首數(shù)據(jù)位置的值更改為內(nèi)存表的當前可用位置的值。
[0081]步驟33,如果此時測點i的尾數(shù)據(jù)位置的值也為空,則將尾數(shù)據(jù)位置的值也更改為內(nèi)存表的當前可用位置的值。
[0082]步驟34,如果此時測點i的首數(shù)據(jù)位置的值不為空,則尾數(shù)據(jù)位置的值也一定不為空,則將尾數(shù)據(jù)位置的值的下一數(shù)據(jù)值作為內(nèi)存表的下一個可用位置,并在寫入該新歷史數(shù)據(jù)之后,將該測點i的尾數(shù)據(jù)位置的值更改為該歷史數(shù)據(jù)最后一個數(shù)據(jù)所占用的內(nèi)存表的位置。
[0083]例如,如圖3所示,當測點O當前測得的數(shù)據(jù)為空值(NULL)時,則測點O的首數(shù)據(jù)位置和尾數(shù)據(jù)位置均為空值;如果此時測點O新到了一個新數(shù)據(jù)A,且此時內(nèi)存表的下一個可用位置為8,則獲取內(nèi)存表中的當前可用位置8,并將內(nèi)存表的下一個可用位置修改為9,然后在位置8中記錄測點O的數(shù)據(jù)A,并將圖3所示的左表中的測點O的首數(shù)據(jù)位置和尾數(shù)據(jù)位置都修改為8;如果之后,測點O又測到了一個新數(shù)據(jù)B,且此時內(nèi)存表的下一個可用位置為9,則獲取該內(nèi)存表中的當前可用位置9,在位置9中記錄測點O的數(shù)據(jù)B,將內(nèi)存表的下一個可用位置修改為10,并將圖3所示的左表中的測點O的首數(shù)據(jù)位置和尾數(shù)據(jù)位置都修改為9 ;……,依此類推,即可不斷將測點O新測到的數(shù)據(jù)寫入到內(nèi)存表中。
[0084]另外,根據(jù)圖3所示的左表可知,在圖3所示的情況下,測點O沒有需要寫入的數(shù)值,因此測點O的首數(shù)據(jù)位置和尾數(shù)據(jù)位置均為NULL。測點I在內(nèi)存表的位置I寫入了一個數(shù)據(jù),即空值NULL,因此測點I的首數(shù)據(jù)位置和尾數(shù)據(jù)位置均為I ;測點2在內(nèi)存表的位置2、3、5分別寫入了 3個數(shù)據(jù),且測點2在內(nèi)存表中寫入的首數(shù)據(jù)位置為2,尾數(shù)據(jù)位置為5 ;測點3在內(nèi)存表的位置4、6、7分別寫入了 3個數(shù)據(jù),且測點3在內(nèi)存表中寫入的首數(shù)據(jù)位置為4,尾數(shù)據(jù)位置為7 ;依此類推。
[0085]較佳的,在本發(fā)明的具體實施例中,按區(qū)域和子系統(tǒng)將所述歷史數(shù)據(jù)保存為相應的歷史數(shù)據(jù)文件。
[0086]圖4為本發(fā)明實施例中的歷史數(shù)據(jù)文件的結(jié)構(gòu)示意圖。如圖4所示,較佳的,在本發(fā)明的具體實施例中,所述歷史數(shù)據(jù)文件由多個塊構(gòu)成;所述塊的類型包括:文件尾塊、首索引塊、索引塊和數(shù)據(jù)塊。
[0087]其中,可以將所述文件尾塊稱為文件尾區(qū),將所述首索引塊稱為首索引區(qū);將所述索引塊和數(shù)據(jù)塊統(tǒng)稱為索引+數(shù)據(jù)區(qū)。
[0088]較佳的,在本發(fā)明的具體實施例中,所述歷史數(shù)據(jù)文件中的塊內(nèi)容包括了上述文件尾塊、首索引塊、索引塊和數(shù)據(jù)塊;所述歷史數(shù)據(jù)文件中還包括:表示所述歷史數(shù)據(jù)文件是否壓縮的壓縮標識位(例如,長度可以為I位)、表示塊類型的塊類型標識位(例如,長度可以為7位)以及用于CRC校驗的校驗位(例如,長度可以為4個字節(jié))。
[0089]較佳的,在本發(fā)明的具體實施例中,所述文件尾塊的有效內(nèi)容為固定長度(例如,該固定長度為:36字節(jié)+5字節(jié))。因此,根據(jù)歷史數(shù)據(jù)文件的尺寸大小即可快速定位到文件尾塊。較佳的,在本發(fā)明的具體實施例中,所述文件尾塊中所包括的內(nèi)容如圖5所示。
[0090]較佳的,在本發(fā)明的具體實施例中,每一個測點標識(ID)都設置有對應的首索弓I。各個測點標識的首索引都存儲在首索引塊中,因此,通過對首索引塊的查詢,即可獲知各個測點標識的首索引。
[0091]較佳的,在本發(fā)明的具體實施例中,所述首索引塊中所包括的內(nèi)容如圖6所示。
[0092]較佳的,在本發(fā)明的具體實施例中,所述索引塊中包括:各個數(shù)據(jù)塊的起始時間、位置和尺寸等信息。例如,數(shù)據(jù)塊O的起始時間表是數(shù)據(jù)塊O中數(shù)據(jù)的最小時間。
[0093]較佳的,在本發(fā)明的具體實施例中,所述索引塊中所包括的內(nèi)容如圖7所示。
[0094]較佳的,在本發(fā)明的具體實施例中,所述數(shù)據(jù)塊的長度可以預先配置。例如,所述數(shù)據(jù)塊的長度可以是數(shù)K。
[0095]較佳的,在本發(fā)明的具體實施例中,所述數(shù)據(jù)塊中所包括的內(nèi)容如圖8所示。
[0096]較佳的,在本發(fā)明的具體實施例中,上述圖4?圖8中所示的數(shù)據(jù)塊中的數(shù)據(jù)所表示的是最終的數(shù)據(jù),在實際存儲時,上述數(shù)據(jù)塊會被壓縮。
[0097]另外,在本發(fā)明的技術(shù)方案中,還可以根據(jù)傳入時間參數(shù),定位到當前所需查詢的數(shù)據(jù)存儲在哪個歷史數(shù)據(jù)文件上。
[0098]例如,較佳的,在本發(fā)明的具體實施例中,所述實時數(shù)據(jù)庫的存儲方法還可進一步包括:
[0099]根據(jù)所接收的數(shù)據(jù)查詢請求中的傳入時間參數(shù),確定對應的歷史數(shù)據(jù)文件;
[0100]讀取所確定的歷史數(shù)據(jù)文件的文件尾塊,確定對應的首索引塊;
[0101]根據(jù)數(shù)據(jù)查詢請求中的測點標識,確定該測點的索引塊的位置;。
[0102]在所確定的索引塊中根據(jù)傳入時間參數(shù),確定對應的數(shù)據(jù)塊;
[0103]在所確定的數(shù)據(jù)塊中查詢到與所述傳入時間參數(shù)對應的測點值。
[0104]綜上可知,在本發(fā)明中的實時數(shù)據(jù)庫的存儲方法中,在將實時數(shù)據(jù)庫的歷史數(shù)據(jù)寫入內(nèi)存表時,對磁盤文件的操作全部都是順序操作,而沒有隨機寫操作,因此可以充分利用機械硬盤的順序操作的高效特性。同時,本發(fā)明中的實時數(shù)據(jù)庫的存儲方法中在寫操作日志和歷史數(shù)據(jù)時,都是以4K的整數(shù)倍為單位整塊讀寫,因此可充分利用固態(tài)硬盤的高效特性,提高數(shù)據(jù)讀寫操作的速度和效率,從而可以在對實時數(shù)據(jù)庫中的歷史數(shù)據(jù)進行讀寫操作時,獲得更快的讀寫速度。例如,現(xiàn)有技術(shù)中的常用實時數(shù)據(jù)庫在非壓縮情況下,對歷史數(shù)據(jù)的讀寫速度一般為每秒5萬至10萬次;而使用本發(fā)明中的實時數(shù)據(jù)庫的存儲方法之后,對歷史數(shù)據(jù)的讀寫速度可達到或超過每秒30萬次。
[0105]本發(fā)明中,支持多核優(yōu)化、固態(tài)硬盤優(yōu)化,采用文件塊結(jié)構(gòu)設計,保證數(shù)據(jù)寫入全順序操作。
[0106]另外,由于在本發(fā)明中的實時數(shù)據(jù)庫的存儲方法中,是先獲取當前內(nèi)存表中的當前可用位置,然后再將歷史數(shù)據(jù)寫入到當前內(nèi)存表中的當前可用位置中,因此可以支持并發(fā)讀寫,并支持對多個測點的并發(fā)寫,讀寫操作之間互不干擾,多個測點寫之間也互不干擾,從而可利用現(xiàn)代多核計算機系統(tǒng)的特性,提高實時數(shù)據(jù)庫的并發(fā)訪問能力。
[0107]此外,本發(fā)明中的實時數(shù)據(jù)庫的歷史數(shù)據(jù)文件存貯結(jié)構(gòu)可以有效地利用時間序列數(shù)據(jù)的特點,將歷史數(shù)據(jù)按區(qū)域和子系統(tǒng)存貯,每個歷史數(shù)據(jù)文件對應一個固定的時間段,因此可以根據(jù)查詢時間快速定位到相應的歷史數(shù)據(jù)文件,并可在歷史數(shù)據(jù)文件中快速查找到某測點在某時間的值。例如,通過上述的實時數(shù)據(jù)庫的歷史數(shù)據(jù)查詢步驟,可以以最小的定位步驟在歷史數(shù)據(jù)文件中定位到某測點在某時間的值。
[0108]以上所述僅為本發(fā)明的較佳實施例而已,并不用以限制本發(fā)明,凡在本發(fā)明的精神和原則之內(nèi),所做的任何修改、等同替換、改進等,均應包含在本發(fā)明保護的范圍之內(nèi)。
【權(quán)利要求】
1.一種實時數(shù)據(jù)庫的存儲方法,其特征在于,該方法包括: 使用有損壓縮算法對需要寫入實時數(shù)據(jù)庫的歷史數(shù)據(jù)進行過濾; 當所述歷史數(shù)據(jù)通過所述有損壓縮的例外檢查時,將所述歷史數(shù)據(jù)寫入當前的內(nèi)存表和操作日志緩沖區(qū); 當當前的內(nèi)存表滿時,將當前的內(nèi)存表中的歷史數(shù)據(jù)經(jīng)壓縮后寫入到當前時刻所對應的分鐘級歷史數(shù)據(jù)文件中,申請一個新的內(nèi)存表,并將所申請的新內(nèi)存表作為當前的內(nèi)存表; 合并線程在每天的預設時間將多個分鐘級歷史數(shù)據(jù)文件合并為日級歷史數(shù)據(jù)文件,在每月的預設時間將多個日級歷史數(shù)據(jù)文件合并為月級歷史數(shù)據(jù)文件,在每年的預設時間將多個月級歷史數(shù)據(jù)文件合并為年級歷史數(shù)據(jù)文件。
2.根據(jù)權(quán)利要求1所述的方法,其特征在于,所述將所述歷史數(shù)據(jù)寫入當前的內(nèi)存表包括: 當需要將測點的歷史數(shù)據(jù)寫入到內(nèi)存表中時,先獲取當前內(nèi)存表中的當前可用位置; 將所述歷史數(shù)據(jù)寫入到當前內(nèi)存表中的當前可用位置中; 當一個歷史數(shù)據(jù)寫入完畢后,確定所述內(nèi)存表中的下一個可用位置,并將所確認的下一個可用位置作為該內(nèi)存表的當前的可用位置。
3.根據(jù)權(quán)利要求2所述的方法,其特征在于,所述寫入到內(nèi)存表中的歷史數(shù)據(jù)的內(nèi)容至少包括: 測點標識、時間戳、質(zhì)量戳和值。
4.根據(jù)權(quán)利要求1所述的方法,其特征在于: 按區(qū)域和子系統(tǒng)將所述歷史數(shù)據(jù)保存為相應的歷史數(shù)據(jù)文件。
5.根據(jù)權(quán)利要求4所述的方法,其特征在于: 所述歷史數(shù)據(jù)文件由多個塊構(gòu)成; 所述塊的類型包括:文件尾塊、首索引塊、索引塊和數(shù)據(jù)塊。
6.根據(jù)權(quán)利要求5所述的方法,其特征在于: 所述文件尾塊的有效內(nèi)容為固定長度。
7.根據(jù)權(quán)利要求6所述的方法,其特征在于,該方法還進一步包括: 根據(jù)所接收的數(shù)據(jù)查詢請求中的傳入時間參數(shù),確定對應的歷史數(shù)據(jù)文件; 讀取所確定的歷史數(shù)據(jù)文件的文件尾塊,確定對應的首索引塊; 根據(jù)數(shù)據(jù)查詢請求中的測點標識,確定該測點的索引塊的位置; 在所確定的索弓I塊中根據(jù)傳入時間參數(shù),確定對應的數(shù)據(jù)塊; 在所確定的數(shù)據(jù)塊中查詢到與所述傳入時間參數(shù)對應的測點值。
8.根據(jù)權(quán)利要求1所述的方法,其特征在于,該方法還進一步包括: 所述操作日志緩存區(qū)中的操作日志以4K的整數(shù)倍為單位寫入到操作日志文件中。
9.根據(jù)權(quán)利要求8所述的方法,其特征在于,該方法還進一步包括: 所述當前的內(nèi)存表中的歷史數(shù)據(jù)以4K的整數(shù)倍為單位寫入到分鐘級歷史數(shù)據(jù)文件中。
10.根據(jù)權(quán)利要求9所述的方法,其特征在于: 同時使用固態(tài)硬盤和機械硬盤存儲歷史數(shù)據(jù)和操作日志文件。
11.根據(jù)權(quán)利要求1至10中的任一所述的方法,其特征在于: 所述操作日志文件的寫入操作、歷史數(shù)據(jù)文件的寫入操作、歷史數(shù)據(jù)文件的合并操作均為順序讀寫的操作。
【文檔編號】G06F17/30GK104504105SQ201410842334
【公開日】2015年4月8日 申請日期:2014年12月30日 優(yōu)先權(quán)日:2014年12月30日
【發(fā)明者】廖常斌, 萬思軍, 劉東海, 劉見, 宋艷榮 申請人:青島海信網(wǎng)絡科技股份有限公司