一種歷史數據庫的壓縮方法【專利摘要】本發明公開了一種歷史數據庫的壓縮方法,其特征在于,包括如下步驟:步驟1、將行式數據庫轉化為列式數據庫,具體為:1a)分表;1b)拼裝;步驟2、進行分段線性擬合有損壓縮;步驟3、整理數據文件;步驟4、進行數據文件的無損壓縮并整理索引,組成完整的兩級壓縮后的列式數據庫。針對現有數據庫的特點,分兩級壓縮,先采取分段線性擬合的有損壓縮的方式,后采取數字字典的無損壓縮方式,將數據壓縮并節省所占用的空間,以滿足現代綜合監控系統對保存的歷史數據的時間長度越來越久的要求,并將誤差保持在一定的誤差精度范圍內。【專利說明】一種歷史數據庫的壓縮方法
技術領域:
[0001]本發明涉及一種歷史數據庫的壓縮方法。【
背景技術:
】[0002]現代綜合監控系統的數據測點的并發量規模越來越大,數據采集的頻率要求越來越高,在很多應用場景需要存儲海量并發、高頻捕捉的時序數據,每天需要存儲的原始數據規模可以達到上百G,故需要對數據進行壓縮存儲。[0003]系統對歷史數據的壓縮一般采用有損數據壓縮算法和無損壓縮算法。通用的有損數據壓縮算法分為3類:信號變換法、矢量量化法、以及分段線性法。分段線性法實現簡單,比較適合歷史數據的壓縮,主要有:矩形波串法(boxcar,BC)和向后傾斜(backwards1pe,DS)算法、旋轉門(swingdoortrending,SDT)。而通用的無損壓縮算法有霍夫曼(Huffman)編碼、行程編碼和字典編碼等壓縮算法。[0004]目前,綜合監控系統的實時數據采集與緩存都是行式的,并且歷史數據庫的設計也主要是行式數據庫,現在一般的歷史數據庫的設計都含有損壓縮和無損壓縮兩級數據壓縮,常見的是旋轉門有損壓縮+字典編碼無損壓縮。其存在下述不足:[0005]第一、行式數據庫的壓縮效率不高,越來越難以適應和滿足綜合監控系統對歷史數據庫數據壓縮存儲的需求。[0006]第二、旋轉門壓縮算法作為線性擬合的一種算法,具有效率高、壓縮比高、誤差可控制的優點。但是該算法結構還是相對有些復雜,代碼實現難度比最小二乘法擬合的代碼實現難度要小,但是還是有一定難度。【
發明內容】[0007]針對上述問題,本發明提供一種歷史數據庫的壓縮方法,針對現有數據庫的特點,分兩級壓縮,先采取分段線性擬合的有損壓縮的方式,后采取數字字典的無損壓縮方式,將數據壓縮并節省所占用的空間,以滿足現代綜合監控系統對保存的歷史數據的時間長度越來越久的要求,并將誤差保持在一定的誤差精度范圍內。[0008]為實現上述技術目的,達到上述技術效果,本發明通過以下技術方案實現:[0009]—種歷史數據庫的壓縮方法,其特征在于,包括如下步驟:[0010]步驟1、將行式數據庫轉化為列式數據庫,具體為:[0011]la)分表:將原有包含若干個測點數據的一個數據庫表,分成若干個數據庫表,其中,每個數據庫表中僅含有單個測點的數據,且數據項是按照原有時間順序排列;[0012]Ib)拼裝:假設分表后獲得M行數據,每行數據具有W個字段,則將M行數據按照次序整合為一行,其中,先按照次序存儲M行數據的第一個字段,最后按照次序存儲M行數據的第W個字段,獲得列式數據庫;[0013]步驟2、進行分段線性擬合有損壓縮;[0014]步驟3、整理數據文件保持各個列式數據文件的一致性;[0015]步驟4、進行數據文件的無損壓縮并整理索引,組成完整的兩級壓縮后的列式數據庫。[0016]優選,步驟2中,設時間片為Tp,對應的數據片為Pl,Ρ2...Ρη,數據片的起止兩點為Pl和Pn,誤差上限為δ,則分段線性擬合的過程是采用四點三段或三點兩段分割法來分割并擬合Pl,Ρ2...Ρη組成數據片段PS,具體為:[0017]Ia)四點三段分割法:將數據片的起止兩點Pl與Pn連接成線段L后,L左右兩側的誤差最大點分別為Pj,Pk兩點,如果Pj和Pk到L的距離誤差ΔPj和ΔPk中至少有一個超過誤差上限6,則根據?1乃,?1^,?11四點將數據分割成?51=?卜中]_少52=?}.種,?53=?1^中11三個子數據片段;[0018]如果Pj和Pk到L的距離誤差均未超過誤差上限δ,則線段L為Pl-Pn的擬合線段;[0019]Ib)若所有數據點均在L的一側,則為三點兩段分割法:[0020]將數據片的起止兩點Pl與Pn連接成線段L后,所有數據點均在L的一側且誤差最大點為Pj點,若Pj到L的距離誤差ΔPj超過誤差上限δ,則根據Pl,Pj,Pn三點將數據分割成PSl=Pl."Pj,PS2=Pj-Pn兩個子數據片段;[0021]如果Pj到L的距離誤差未超過誤差上限δ,則線段L為Pl-Pn的擬合線段;[0022]2)將分割好的子數據片段PSl,PS2,PS3,按照步驟Ia)或Ib)的方法遞歸繼續分割并作線段擬合,直至各個子數據片段均完成線段擬合;[0023]3)將時間片Tp按上述分割方法分割的各級子數據片段完成的擬合線段按時間順序拼接成擬合折線,與下一個時間片Tp’用同樣方法擬合的折線按照時間順序拼接,依次類推,實現單測點數據的全時域的分段線性壓縮。[0024]優選,步驟3中,將經過分段線性擬合壓縮的數據按照長字串的形式存入數據庫的同一條記錄的相應字段中,如果字段的數據類型為整型或浮點型數值類型,則將該字段拆分為對應的基準值、偏移值步長與偏移值文件三個字段,其中:[0025]基準值字段設定為原分表中一個初始值或者一個計算平均值的標準值;[0026]偏移值步長字段中保存數據的要求的精度并使得計算出的偏移值均為整型;[0027]該文件的文件名在字段偏移值文件中保存。[0028]本發明的有益效果是:[0029]本發明的兩級壓縮方法,分段線性擬合壓縮是有損壓縮,該壓縮方法采用分治法的原理,該原理簡單易操作,通過遞歸的形式可以層層分解為子問題便于理解,代碼實現起來也更加方便。列式數據壓縮,將文件索引與數據文件分離,追求同類數據壓縮率的最大化。將數據壓縮并節省所占用的空間,以滿足現代綜合監控系統對保存的歷史數據的時間長度越來越久的要求,并將誤差保持在一定的誤差精度范圍內。【附圖說明】[0030]圖1是本發明一種歷史數據庫的壓縮方法的流程圖;[0031]圖2是本發明四點三段及判別方法的示意圖;[0032]圖3是本發明列式數據庫索引表字段的示意圖。【具體實施方式】[0033]下面結合附圖和具體的實施例對本發明技術方案作進一步的詳細描述,以使本領域的技術人員可以更好的理解本發明并能予以實施,但所舉實施例不作為對本發明的限定。[0034]—種歷史數據庫的壓縮方法,如圖1所示,包括如下步驟:[0035]步驟1、將行式數據庫轉化為列式數據庫,數據庫行轉列的方法各有不同,但是基本的思想是將原有的行式數據庫看作一個M行N列的表格,將此表格旋轉90度做行列的轉換,形成一個N行M列的表格。然而,實際轉換成適合壓縮的列式數據庫時,操作上有一些問題,主要問題是分表和一般數據庫的列數的限制;[0036]Ia)分表:將原有包含若干個測點數據的一個數據庫表(table),分成若干個數據庫表,其中,每個數據庫表中僅含有單個測點的數據,且數據項是按照原有時間順序排列。[0037]可以將單測點的數據分表按照時間間隔再次分表,最后的每一個分表僅包含單個測點的一個確定時間片段的順序數據,而準確的測點ID與時間片段的信息將在該數據庫分表的表名中按固定格式體現。[0038]Ib)拼裝:假設分表后獲得M行數據,每行數據具有W個字段,則將M行數據按照次序整合為一行,其中,先按照次序存儲M行數據的第一個字段,最后按照次序存儲M行數據的第W個字段,獲得列式數據庫。[0039]突破一般數據庫列數的限制的方法,分表后的M行數據先按照次序整合拼裝到一行,如分表中含有M行和三個字段,這三個字段分別是“時間戳”、“數值”、“數據品質”字段:則先按次序存儲M個“時間戳”字段,“時間戳”字段后按次序存儲M個“數值”字段,“數值”字段后按次序存儲M個“數據品質”等字段內容。[0040]將所有數據按次序分別“拼裝”到一個長的字串中,以TEXT或者BLOG格式存入一個值字段,而M個長整數也以字串形式。拼裝的方式可以是直接拼裝的方式完成,也可以通過XML文件“轉拼裝”方式或其他的方式實現。[0041]步驟2、進行分段線性擬合有損壓縮。[0042]優選,步驟2中,設時間片為Tp,對應的數據片為Pl,Ρ2...Ρη,數據片的起止兩點為Pl和Ρη,誤差上限為δ。時間片(Tp)的選擇可以是根據固定時間長度(如若干分鐘、若干小時或若干天的數據)選擇,也可以是根據固定數據的數量(如固定若干數據點相對應的時間片)選擇。[0043]擬合的線段應當滿足條件:當且僅當若干時間點的數據相對擬合線段的誤差在給定的誤差上限S范圍以內時,這些若干時間點的數據擬合成一條線段。這條線段的時間范圍,就是這些數據段(Td)的起止時間,根據數據段(Td)的起止時間可得擬合線段的兩個端點。[0044]如圖2所示,分段線性擬合的過程是采用四點三段或三點兩段分割法來分割并擬合Pl,Ρ2...Ρη組成數據片段PS,具體為:[0045]Ia)四點三段分割法:將數據片的起止兩點Pl與Pn連接成線段L后,L左右兩側的誤差最大點分別為Pj,Pk兩點,如果Pj和Pk到L的距離誤差ΔPj和ΔPk中至少有一個超過誤差上限WAΡ_].>δ且ΔPkM,或者ΔPjM且ΡΚδ,或者ΔΡ_].〈δ且ΔPkM),則根據Pl,Pj,Pk,Pn四點將數據分割成PSl=Pl-Pj,PS2=Pj…Pk,PS3=Pk…Pn三個子數據片段;[0046]如果Pj和Pk到L的距離誤差均未超過誤差上限δ,則線段L為Pl-Pn的擬合線段;[0047]lb)若所有數據點均在L的一側(S卩Pj和Pk中的一個不存在),則為三點兩段分割法:[0048]將數據片的起止兩點Pl與Pn連接成線段L后,所有數據點均在L的一側且誤差最大點為Pj點,若Pj到L的距離誤差ΔPj超過誤差上限δ,則根據Pl,Pj,Pn三點將數據分割成PSl=Pl."Pj,PS2=Pj-Pn兩個子數據片段;[0049]如果Pj到L的距離誤差未超過誤差上限δ,則線段L為Pl-Pn的擬合線段;[0050]判斷Pj和Pk是否存在的方法:使用“到角”的概念,即L到L’(L’是Pl與Pj或Pk的連線)的逆時針夾角α,計算到角α正切值tana,如果tana值為正,則Pi在線L的左側,如果tana值為負,則Pi在線L的右側。tana值可以根據L與L’的斜率計算而得。如果線L的斜率為K1,線L’的斜率為K2,則根據到角公式tana=(K2-Kl)/(l+Kl*K2)計算而得。[0051]2)將分割好的子數據片段PSl,PS2,PS3,按照步驟Ia)或Ib)的方法遞歸繼續分割并作線段擬合,直至各個子數據片段均完成線段擬合;[0052]3)將時間片Tp按上述分割方法分割的各級子數據片段完成的擬合線段按時間順序拼接成擬合折線,與下一個時間片Tp’用同樣方法擬合的折線按照時間順序拼接,依次類推,實現單測點數據的全時域的分段線性壓縮。針對不同測點數據,用同樣的方法壓縮,可將數據庫的所有測點的數據壓縮。[0053]將特定測點的一個時間片Tp內的數據取出做本分段線性擬合,若干個擬合線段連接實現對時間片(Tp)的線性擬合,且保證該時間片內的所有數據到線性擬合的折線的距離誤差均不超過誤差上限S。[0054]步驟3、整理數據文件保持各個列式數據文件的一致性:采用基準值與偏移量重新組織數據,并將基準值與偏移單位作為索引的一部分保存,同時將偏移值保存在列式數據文件中。這樣,可以保持列式數據庫的數據簡潔,提高下一步無損壓縮的效率。另一方面,由于上一步的分段線性擬合中剔除了原始數據中的若干數據,則需將所有相關的列式數據文件(列式時間戳偏移文件、列式數值偏移文件)中的相關數據剔除,保持數據的一致性。[0055]分段線性擬合完成后的數據需要采用基準+偏移的方式,計算組織成為新的以整型為主的數據文件,以便于對數據文件進行無損壓縮。將經過分段線性擬合壓縮的數據按照長字串的形式存入數據庫的同一條記錄的相應字段中。[0056]如果字段“數值”中的數據類型為整型,浮點型等數值類型,則將字段“數值”拆分成對應的“基準值”,“偏移值步長”與“偏移值文件”三個字段,“基準值”字段可設定為原分表中一個初始值或者一個計算平均值等合理的標準值,字段“偏移值步長”中保存數據的要求的精度并確保計算出的“偏移值”均為整型,將原分表中“數值”字段中的所有數據(M’個數據)按照“基準值”和“偏移值步長”計算成相應的M,個“偏移值”數據(整型),將每個“偏移值”按照4字節整型的格式依次存入二進制VDAT(數值數據)文件,該文件的文件名應在字段“偏移值文件”中保存;[0057]比如,將經過分段線性擬合壓縮的數據按照長字串的形式存入上述“時間戳”、“數值”、“數據品質”等數據庫的同一條記錄的相應字段中,同時,MRN列的行式數據庫的分表,經過上述壓縮后成為一條數據庫記錄,“時間戳”、“數值”、“數據品質”等字段中存有M’個數值(M’=經分段線性壓縮后的數據個數),可以將這些字段內的內容轉存成相應的DAT(數據)文件,以便于對這些DAT(數據)文件使用無損壓縮方法進行再次壓縮。[0058]如圖3所示,字段“時間戳”,拆分成“基準時間”、“偏移時間單位”和“偏移時間文件”三個字段,“基準時間”字段存原分表中的數據初始時間,字段“偏移時間單位”中可選擇合適時間單位(毫秒,秒,分鐘等),將原分表中“時間戳”字段中的所有數據(M’個數據)按照“基準時間”和“偏移時間單位”計算成相應的M’個“偏移時間”數據,將每個“偏移時間”按照4字節整型格式依次存入二進制TSDAT(時間戳數據)文件,該文件的文件名應在字段“偏移時間文件”中保存。[0059]同時,“數據品質”等其他字段中保存的M’個數據,根據需要按照占用固定比特數或固定字節數的格式依次存入相應的DAT(數據)文件,并且,該文件的文件名應在相應的字段中保存。[0060]將分表中轉存為數據文件的字段擴充為“基準”、“偏移單位”和“偏移量文件”等字段,將整理好的新數據文件的地址存入“偏移量文件”字段;對“時間戳”字段也擴充為“基準時間”、“時間偏移單位”和“時間偏移量文件”等字段,將時間偏移數據文件的地址存入“時間偏移量文件”字段。[0061]步驟4、進行數據文件的無損壓縮并整理索引,組成完整的兩級壓縮后的列式數據庫:對整理完成的各個數據文件進行無損壓縮,可采用任何數據編碼算法(如LZ系列字典編碼算法,HufTmann編碼算法或行程編碼算法等)對其進行壓縮。[0062]由于M行N列的行式數據庫的分表,經過分段線性擬合壓縮后成為一條數據庫記錄,該條記錄可以視為組成列式數據庫的DAT(數據)文件的索引,將所有分表中經過分段線性擬合壓縮后的記錄,全部集中在一個完整的列式數據庫索引表中,該索引表的字段,除了包含原始行式數據庫表的“測點ID”、“測點名稱”等關于測點基本信息的字段以外,還包含“時間戳”、“數值”或“數據品質”等字段拆分而得的若干字段,此外還需要增加“開始時間”與“結束時間”兩個字段,如圖3所示。[0063]所有DAT(數據)文件,以及整理完成的索引表,組成完整的兩級壓縮的列式數據庫。[0064]本發明的兩級壓縮方法,分段線性擬合壓縮是有損壓縮,該壓縮方法采用分治法的原理,該原理簡單易操作,通過遞歸的形式可以層層分解為子問題便于理解,代碼實現起來也更加方便。列式數據壓縮,將文件索引與數據文件分離,追求同類數據壓縮率的最大化。將數據壓縮并節省所占用的空間,以滿足現代綜合監控系統對保存的歷史數據的時間長度越來越久的要求,并將誤差保持在一定的誤差精度范圍內。[0065]本發明中的“四點三段”(或“三點兩段”)分段線性擬合的方法采用遞歸分解問題的辦法,無論是在算法思想上還是算法結構上都還要簡單,代碼實現的難度更小,效率上與旋轉門算法相比在總體上看處于相當水平。[0066]以上僅為本發明的優選實施例,并非因此限制本發明的專利范圍,凡是利用本發明說明書及附圖內容所作的等效結構或者等效流程變換,或者直接或間接運用在其他相關的
技術領域:
,均同理包括在本發明的專利保護范圍內。【主權項】1.一種歷史數據庫的壓縮方法,其特征在于,包括如下步驟:步驟1、將行式數據庫轉化為列式數據庫,具體為:Ia)分表:將原有包含若干個測點數據的一個數據庫表,分成若干個數據庫表,其中,每個數據庫表中僅含有單個測點的數據,且數據項是按照原有時間順序排列;Ib)拼裝:假設分表后獲得M行數據,每行數據具有W個字段,則將M行數據按照次序整合為一行,其中,先按照次序存儲M行數據的第一個字段,最后按照次序存儲M行數據的第W個字段,獲得列式數據庫;步驟2、進行分段線性擬合有損壓縮;步驟3、整理數據文件保持各個列式數據文件的一致性;步驟4、進行數據文件的無損壓縮并整理索引,組成完整的兩級壓縮后的列式數據庫。2.根據權利要求1所述的一種歷史數據庫的壓縮方法,其特征在于,步驟2中,設時間片為下?,對應的數據片為?1少2"中11,數據片的起止兩點為?1和?11,誤差上限為3,則分段線性擬合的過程是采用四點三段或三點兩段分割法來分割并擬合Pl,P2…Pn組成數據片段PS,具體為:Ia)四點三段分割法:將數據片的起止兩點Pl與Pn連接成線段L后,L左右兩側的誤差最大點分別為Pj,Pk兩點,如果Pj和Pk到L的距離誤差ΔPj和ΔPk中至少有一個超過誤差上限δ,則根據Pl,Pj,Pk,Pn四點將數據分割成==數據片段;如果Pj和Pk到L的距離誤差均未超過誤差上限δ,則線段L為Pl...Ρη的擬合線段;Ib)若所有數據點均在L的一側,則為三點兩段分割法:將數據片的起止兩點Pl與Pn連接成線段L后,所有數據點均在L的一側且誤差最大點為Pj點,若Pj到L的距離誤差ΔPj超過誤差上限δ,則根據Pl,Pj,Ρη三點將數據分割成PSl=ΡΙ..Ρ」,Ρ32=Ρ」...Ρη兩個子數據片段;如果Pj到L的距離誤差未超過誤差上限δ,則線段L為Pl...Ρη的擬合線段;2)將分割好的子數據片段PSl,PS2,PS3,按照步驟Ia)或Ib)的方法遞歸繼續分割并作線段擬合,直至各個子數據片段均完成線段擬合;3)將時間片Tp按上述分割方法分割的各級子數據片段完成的擬合線段按時間順序拼接成擬合折線,與下一個時間片Tp’用同樣方法擬合的折線按照時間順序拼接,依次類推,實現單測點數據的全時域的分段線性壓縮。3.根據權利要求1所述的一種歷史數據庫的壓縮方法,其特征在于,步驟3中,將經過分段線性擬合壓縮的數據按照長字串的形式存入數據庫的同一條記錄的相應字段中,如果字段的數據類型為整型或浮點型數值類型,則將該字段拆分為對應的基準值、偏移值步長與偏移值文件三個字段,其中:基準值字段設定為原分表中一個初始值或者一個計算平均值的標準值;偏移值步長字段中保存數據的要求的精度并使得計算出的偏移值均為整型;該文件的文件名在字段偏移值文件中保存。4.根據權利要求1所述的一種歷史數據庫的壓縮方法,其特征在于,步驟4中,對整理完成的各個數據文件進行無損壓縮,其中,索引表的字段增加“開始時間”與“結束時間”兩個字段。5.根據權利要求4所述的一種歷史數據庫的壓縮方法,其特征在于,無損壓縮采用LZ系列字典編碼算法。6.根據權利要求4所述的一種歷史數據庫的壓縮方法,其特征在于,無損壓縮采用Huffmann編碼算法或行程編碼算法。【文檔編號】G06F17/30GK106021579SQ201610382696【公開日】2016年10月12日【申請日】2016年6月1日【發明人】張迎,金舒,薛亮,周金國,董勝剛,戴宏斌,白忠賀,楊榮昌【申請人】南京國電南自美卓控制系統有限公司