專利名稱:一種支持關(guān)系數(shù)據(jù)并行處理的內(nèi)存存儲結(jié)構(gòu)及實(shí)現(xiàn)方法
技術(shù)領(lǐng)域:
本發(fā)明涉及內(nèi)存存儲結(jié)構(gòu)技術(shù)領(lǐng)域,特別涉及一種支持關(guān)系數(shù)據(jù)并行處理的內(nèi)存存儲結(jié)構(gòu)及實(shí)現(xiàn)方法。
背景技術(shù):
隨著制造工藝的快速發(fā)展,微處理器頻率不斷提升。但到了 2005年,當(dāng)主頻接近4GHz時,英特爾公司和AMD (超微半導(dǎo)體公司)發(fā)現(xiàn),速度也會遇到自己的極限:那就是單純的主頻提升,已經(jīng)無法明顯提升系統(tǒng)整體性能。主頻提升造成功率增大,散熱問題也越來越成為一個無法逾越的障礙。于是微處理器開始向多核方面發(fā)展,即在一枚處理器中集成多個完整的計算內(nèi)核。如今,采用多核微處理的電腦隨處可見,很多手機(jī)也都采用雙核甚至四核。隨之也推動了并行計算技術(shù)的發(fā)展,以充分利用多核資源提高處理速度。很多編程語言都增加了對并行計算的支持,對原有的簡單數(shù)據(jù)結(jié)構(gòu)進(jìn)行了增強(qiáng)。但對于關(guān)系型結(jié)構(gòu),通常支持不好,導(dǎo)致很多問題:
1、存儲結(jié)構(gòu)并沒有針對并 行處理設(shè)計;
2、數(shù)據(jù)加載沒有采用并行,數(shù)據(jù)操作性能不夠理想;
3、修改數(shù)據(jù)時加排他鎖,導(dǎo)致并發(fā)性能問題。本發(fā)明針對以上問題提出了一種有效的解決辦法。
發(fā)明內(nèi)容
為了解決現(xiàn)有技術(shù)的問題,本發(fā)明提供了一種支持關(guān)系數(shù)據(jù)并行處理的內(nèi)存存儲結(jié)構(gòu)及實(shí)現(xiàn)方法,在數(shù)據(jù)加載、讀寫訪問、排序、投影、聯(lián)接等數(shù)據(jù)操作上具有良好的性能,尤其適用于在多處理器或多核計算機(jī)上進(jìn)行并行計算。本發(fā)明所采用的技術(shù)方案如下:
一種支持關(guān)系數(shù)據(jù)并行處理的內(nèi)存存儲結(jié)構(gòu),其結(jié)構(gòu)采用列存儲方式,一個存儲結(jié)構(gòu)由多個列組成,每個存儲結(jié)構(gòu)中包含一列隱含列,數(shù)據(jù)類型為32位整數(shù),記錄所在行的數(shù)據(jù)版本,用于樂觀并發(fā)控制。本發(fā)明從以下三個方面對本存儲結(jié)構(gòu)進(jìn)行說明:
1、結(jié)構(gòu)組成。本存儲采用列存儲方式,數(shù)據(jù)存儲在列(CoIumn )中。一個存儲結(jié)構(gòu)由多個列組成,也稱為表(Table)。每個存儲結(jié)構(gòu)中均包含一列名稱為Version的隱含列,數(shù)據(jù)類型為32位整數(shù),記錄所在行的數(shù)據(jù)版本,用于樂觀并發(fā)控制。對于關(guān)系型數(shù)據(jù),同一列中的數(shù)據(jù)具有相同的數(shù)據(jù)類型,采用數(shù)組方式存放。相對于傳統(tǒng)的將數(shù)據(jù)存儲在行上的方式,列存儲在修改存儲結(jié)構(gòu),如增加、刪除列時非常容易快速?;诹械谋姸嗖僮?,如聯(lián)接和投影,也具有良好的性能。在此基礎(chǔ)上,優(yōu)選的使用泛型列來支持各種數(shù)據(jù)類型。眾所周知,值類型和引用類型之間的相互轉(zhuǎn)換經(jīng)常會出現(xiàn)裝箱拆箱的性能問題。使用泛型列,列在初始化時進(jìn)行數(shù)據(jù)類型指定,每個列的數(shù)據(jù)類型是固定的,對于列的所有操作都不會產(chǎn)生裝箱拆箱的性能問題。本存儲結(jié)構(gòu)也包含行(Row)的概念,使用并行輔助線程技術(shù)預(yù)先準(zhǔn)備數(shù)據(jù),為每個列增加一個行號索引列,以加快行遍歷速度。消除列訪問數(shù)據(jù)的劣勢,達(dá)到類似行數(shù)據(jù)訪問的效果。因此,開發(fā)人員可通過行獲取和修改數(shù)據(jù)。開發(fā)人員獲取的行數(shù)據(jù)是一份快照,操作后可調(diào)用行的Save方法將修改保存至列存儲結(jié)構(gòu)。2、訪問接口。本存儲結(jié)構(gòu)對外提供以下訪問接口:
數(shù)據(jù)加載:從數(shù)據(jù)源加載數(shù)據(jù);
表結(jié)構(gòu)修改:增加列、刪除列;
數(shù)據(jù)讀寫:按行讀寫、按列讀寫。3、并行支持。本發(fā)明中的列存儲結(jié)構(gòu)在多個操作中采用了并行處理以提高性能。首先,數(shù)據(jù)加載時,列存儲結(jié)構(gòu)會自動為每個列開啟一個線程,一個線程只負(fù)責(zé)一個列的數(shù)據(jù)加載。從數(shù)據(jù)源加載的數(shù)據(jù)通常是行數(shù)據(jù),還需要開啟一個線程將行數(shù)據(jù)按列拆分,拆分后的數(shù)據(jù)交給列數(shù)據(jù)加載線程異步載入各列。數(shù)據(jù)源加載數(shù)據(jù)、行數(shù)據(jù)拆分及列數(shù)據(jù)加載是流水并行的,能最大程度減少數(shù)據(jù)加載時間。由于多線程并行執(zhí)行,能有效減少數(shù)據(jù)加載時間,尤其是大數(shù)據(jù)量加載時。數(shù)據(jù)加載時間縮短,也減少了對各種數(shù)據(jù)庫、線程、內(nèi)存等資源的長時間占用,可有效提高整體性能
其次,對于關(guān)系型數(shù)據(jù),按行訪問比較普遍。因此列存儲結(jié)構(gòu)需要從各列取數(shù),組合成行,供外部使用。這通常會增加操作耗時,對整表遍歷這種操作影響較大。在按行遍歷時,存儲結(jié)構(gòu)自動開啟一個線程,預(yù)先將后續(xù)的數(shù)據(jù)組合成行,這樣可以有效的提高效率。再次,本存儲結(jié)構(gòu)采用樂觀鎖的方式處理并發(fā),保證并行修改時的數(shù)據(jù)一致性。開發(fā)人員獲取的行快照數(shù)據(jù),包含了隱藏列Version的值,即當(dāng)前數(shù)據(jù)的版本號。開發(fā)人員調(diào)用行的GetItem和SetItem獲取和修改行快照中的數(shù)據(jù),完成后調(diào)用Save方法保存。列存儲結(jié)構(gòu)會判斷行快照中Version列值是否與結(jié)構(gòu)中同一行的Version是否相等,如果相等,將將快照中修改的數(shù)據(jù)合并至列存儲結(jié)構(gòu),并將該行Version列值加I ;若不同,則認(rèn)為已被其它線程修改,將拋出StaleDataException??蛻舫绦虿东@此異常后,應(yīng)重新讀取數(shù)據(jù)再次處理。使用樂觀鎖代替代悲觀鎖,能有效解決性能、死鎖等問題。綜上所述,本發(fā)明的存儲結(jié)構(gòu)采用列存儲方式,內(nèi)部封裝了并行算法,提供了樂觀鎖并發(fā)處理機(jī)制,同時對外提供簡單易用的訪問接口。本發(fā)明的一種支持關(guān)系數(shù)據(jù)并行處理的內(nèi)存存儲結(jié)構(gòu)及實(shí)現(xiàn)方法,其數(shù)據(jù)存儲在列上,而不是存儲在行上,這種方式在修改表結(jié)構(gòu)時具有先天的優(yōu)勢,操作非常快速:增加列和移除列不涉及對數(shù)據(jù)的修改,假設(shè)數(shù)據(jù)存儲在行上,增加一個列,行上的每條數(shù)據(jù)需要以此進(jìn)行修改。另外,對于整列數(shù)據(jù)的讀取,只需讀取出整個列存儲的數(shù)組數(shù)據(jù)即可,完全避免了行存儲逐行讀取數(shù)據(jù)的問題。同時,基于列存儲的眾多操作,如聯(lián)接和投影,也具有良好的性能。使用泛 型列來支持各種數(shù)據(jù)類型。眾所周知,值類型和引用類型之間的相互轉(zhuǎn)換經(jīng)常會出現(xiàn)裝箱拆箱的性能問題。使用泛型列,列在初始化時進(jìn)行數(shù)據(jù)類型指定,每個列的數(shù)據(jù)類型是固定的,對于列的所有操作都不會產(chǎn)生裝箱拆箱的性能問題。規(guī)避了.NET DataTable只能按行遍歷、無法并發(fā)操作的弊端,在設(shè)計數(shù)據(jù)的加載、計算、關(guān)聯(lián)、排序、投影、分組等常用操作的算法時,采用并行計算的設(shè)計思路,充分發(fā)揮硬件的多核優(yōu)勢和性能。另外,在內(nèi)部將數(shù)據(jù)和并行操作封裝在一起,既符合面向?qū)ο蟮拈_發(fā)要求,又達(dá)到了高內(nèi)聚低耦合目的。使用并行輔助線程技術(shù)預(yù)先準(zhǔn)備數(shù)據(jù),為每個列增加一個行號索引列,以加快行遍歷速度??紤]到基于行的訪問數(shù)據(jù)方式,對列存儲結(jié)構(gòu)來講是一種劣勢,因此使用并行輔助線程預(yù)先準(zhǔn)備好數(shù)據(jù),增加一個行索引列來標(biāo)識各列,以期將這種劣勢消除,達(dá)到類似行數(shù)據(jù)訪問的效果。使用基于整形數(shù)據(jù)版本列(Version列)的樂觀鎖處理機(jī)制,即:每一行的數(shù)據(jù)都存在一個整形的版本,數(shù)據(jù)訪問時基于拿到的當(dāng)前版本進(jìn)行處理,這種方式有效避免了數(shù)據(jù)操作時施加的排他鎖造成的并發(fā)問題。本發(fā)明提供的技術(shù)方案帶來的有益效果是:
關(guān)系型數(shù)據(jù)以數(shù)組的形式存儲在列上,整張表由多個列組成;內(nèi)部使用泛型列來支持各種數(shù)據(jù)類型,以減少裝箱拆箱帶來的性能消耗;規(guī)避了.NET DataTable只能按行遍歷、無法并發(fā)操作的弊端。在本數(shù)據(jù)結(jié)構(gòu)內(nèi)部,對數(shù)據(jù)的加載、計算、關(guān)聯(lián)、排序、投影、分組等操作,在算法上基于并行計算方式,以期獲得最佳的性能;使用并行輔助線程技術(shù)預(yù)先準(zhǔn)備行數(shù)據(jù),以加快按行遍歷的速度;基于樂觀鎖機(jī)制處理并發(fā)訪問沖突,保證數(shù)據(jù)一致性。
圖1為本發(fā)明的一種支持關(guān)系數(shù)據(jù)并行處理的內(nèi)存存儲結(jié)構(gòu)及實(shí)現(xiàn)方法的UML類 圖2為本發(fā)明的一種支持關(guān)系數(shù)據(jù)并行處理的內(nèi)存存儲結(jié)構(gòu)及實(shí)現(xiàn)方法的實(shí)施例1的員工數(shù)據(jù)列存儲示意圖。
具體實(shí)施例方式為使本發(fā)明的目的、技術(shù)方案和優(yōu)點(diǎn)更加清楚,下面將結(jié)合附圖對本發(fā)明實(shí)施方式作進(jìn)一步地詳細(xì)描述。實(shí)施例一
如附圖1所示,一種支持關(guān)系數(shù)據(jù)并行處理的內(nèi)存存儲結(jié)構(gòu),其結(jié)構(gòu)采用列存儲方式,一個存儲結(jié)構(gòu)由多個列組成,每個存儲結(jié)構(gòu)中包含一列隱含列,數(shù)據(jù)類型為32位整數(shù),記錄所在行的數(shù)據(jù)版本,用于樂觀并發(fā)控制。本實(shí)施例中,使用泛型列來支持各種數(shù)據(jù)類型。本實(shí)施例中,存儲結(jié)構(gòu)也包含行的概念,使用并行輔助線程技術(shù)預(yù)先準(zhǔn)備數(shù)據(jù),為每個列增加一個行號索引列。本實(shí)施例的存儲結(jié)構(gòu)對外提供以下訪問接口:
數(shù)據(jù)加載:用于從數(shù)據(jù)源加載數(shù)據(jù);表結(jié)構(gòu)修改:用于增加列、刪除列;
數(shù)據(jù)讀寫:用于按行讀寫、按列讀寫。如附圖2所示,使用本發(fā)明中的關(guān)系存儲結(jié)構(gòu)作為載體,一個典型的應(yīng)用如下: 開發(fā)人編寫代碼執(zhí)行數(shù)據(jù)查詢,獲取到員工表Employee的DbDataReader,開發(fā)人員將 此DbDataReader傳給本關(guān)系存儲結(jié)構(gòu)的實(shí)例的Load方法。調(diào)用代碼如下:
權(quán)利要求
1.一種支持關(guān)系數(shù)據(jù)并行處理的內(nèi)存存儲結(jié)構(gòu),其結(jié)構(gòu)采用列存儲方式,一個存儲結(jié)構(gòu)由多個列組成,每個存儲結(jié)構(gòu)中包含一列隱含列,數(shù)據(jù)類型為32位整數(shù),記錄所在行的數(shù)據(jù)版本,用于樂觀并發(fā)控制。
2.根據(jù)權(quán)利要求1所述的一種支持關(guān)系數(shù)據(jù)并行處理的內(nèi)存存儲結(jié)構(gòu),其特征在于,使用泛型列來支持各種數(shù)據(jù)類型。
3.根據(jù)權(quán)利要求2所述的一種支持關(guān)系數(shù)據(jù)并行處理的內(nèi)存存儲結(jié)構(gòu),其特征在于,所述的存儲結(jié)構(gòu)也包含行的概念,使用并行輔助線程技術(shù)預(yù)先準(zhǔn)備數(shù)據(jù),為每個列增加一個行號索引列。
4.根據(jù)權(quán)利要求1-3中任意一項(xiàng)所述的一種支持關(guān)系數(shù)據(jù)并行處理的內(nèi)存存儲結(jié)構(gòu),其特征在于,所述的存儲結(jié)構(gòu)對外提供以下訪問接口: 數(shù)據(jù)加載:用于從數(shù)據(jù)源加載數(shù)據(jù); 表結(jié)構(gòu)修改:用于增加列、刪除列; 數(shù)據(jù)讀寫:用于按行讀寫、按列讀寫。
5.一種支持關(guān)系數(shù)據(jù)并 行處理的內(nèi)存存儲結(jié)構(gòu)的實(shí)現(xiàn)方法,包括以下步驟: 數(shù)據(jù)加載時,列存儲結(jié)構(gòu)會自動為每個列開啟一個線程,一個線程只負(fù)責(zé)一個列的數(shù)據(jù)加載,如果從數(shù)據(jù)源加載的數(shù)據(jù)是行數(shù)據(jù),還需要開啟一個線程將行數(shù)據(jù)按列拆分,拆分后的數(shù)據(jù)交給列數(shù)據(jù)加載線程異步載入各列。
6.根據(jù)權(quán)利要求5所述的一種支持關(guān)系數(shù)據(jù)并行處理的內(nèi)存存儲結(jié)構(gòu)的實(shí)現(xiàn)方法,其特征在于,對于關(guān)系型數(shù)據(jù),在按行遍歷時,存儲結(jié)構(gòu)自動開啟一個線程,預(yù)先將后續(xù)的數(shù)據(jù)組合成行。
7.根據(jù)權(quán)利要求5所述的一種支持關(guān)系數(shù)據(jù)并行處理的內(nèi)存存儲結(jié)構(gòu)的實(shí)現(xiàn)方法,其特征在于,所述存儲結(jié)構(gòu)采用樂觀鎖的方式處理并發(fā),保證并行修改時的數(shù)據(jù)一致性。
8.根據(jù)權(quán)利要求7所述的一種支持關(guān)系數(shù)據(jù)并行處理的內(nèi)存存儲結(jié)構(gòu)的實(shí)現(xiàn)方法,其特征在于,所述采用樂觀鎖的方式處理并發(fā)具體包括以下步驟: A、獲取行快照數(shù)據(jù),所述的行快照數(shù)據(jù)包含了隱藏列的值,即當(dāng)前數(shù)據(jù)的版本號; B、調(diào)用行的GetItem和SetItem獲取和修改行快照中的數(shù)據(jù),完成后調(diào)用Save方法保存; C、列存儲結(jié)構(gòu)判斷行快照中隱藏列的值是否與結(jié)構(gòu)中同一行的隱藏列的值相等,如果相等,將快照中修改的數(shù)據(jù)合并至列存儲結(jié)構(gòu),并將該行隱藏列的值加I ;若不同,則認(rèn)為已被其它線程修改,將拋出StaleDataException,客戶程序捕獲此異常后,重新讀取數(shù)據(jù)再次處理。
全文摘要
本發(fā)明涉及內(nèi)存存儲結(jié)構(gòu)技術(shù)領(lǐng)域,特別涉及一種支持關(guān)系數(shù)據(jù)并行處理的內(nèi)存存儲結(jié)構(gòu)及實(shí)現(xiàn)方法。其存儲結(jié)構(gòu)采用列存儲方式,一個存儲結(jié)構(gòu)由多個列組成,每個存儲結(jié)構(gòu)中包含一列隱含列,數(shù)據(jù)類型為32位整數(shù),記錄所在行的數(shù)據(jù)版本,用于樂觀并發(fā)控制。本發(fā)明的一種支持關(guān)系數(shù)據(jù)并行處理的內(nèi)存存儲結(jié)構(gòu)及實(shí)現(xiàn)方法,在數(shù)據(jù)加載、讀寫訪問、排序、投影、聯(lián)接等數(shù)據(jù)操作上具有良好的性能,尤其適用于在多處理器或多核計算機(jī)上進(jìn)行并行計算。
文檔編號G06F9/38GK103246498SQ20131017424
公開日2013年8月14日 申請日期2013年5月13日 優(yōu)先權(quán)日2013年5月13日
發(fā)明者陸大鵬, 孫立新 申請人:浪潮集團(tuán)山東通用軟件有限公司