两个人的电影免费视频_国产精品久久久久久久久成人_97视频在线观看播放_久久这里只有精品777_亚洲熟女少妇二三区_4438x8成人网亚洲av_内谢国产内射夫妻免费视频_人妻精品久久久久中国字幕

一種記錄型數(shù)據(jù)存儲(chǔ)空間的優(yōu)化與恢復(fù)方法

文檔序號(hào):9550911閱讀:521來源:國(guó)知局
一種記錄型數(shù)據(jù)存儲(chǔ)空間的優(yōu)化與恢復(fù)方法
【技術(shù)領(lǐng)域】
[0001] 本發(fā)明涉及一種記錄型數(shù)據(jù)存儲(chǔ)空間的優(yōu)化與恢復(fù)方法。
【背景技術(shù)】
[0002] 隨著大數(shù)據(jù)時(shí)代的來臨,數(shù)據(jù)以爆炸式的方式急速增長(zhǎng),這給數(shù)據(jù)存儲(chǔ)體系帶來 了極大的挑戰(zhàn)。在數(shù)據(jù)格式上,傳統(tǒng)的記錄型數(shù)據(jù)仍然是主要的信息數(shù)據(jù)組織格式,典型代 表有嚴(yán)格數(shù)據(jù)模式的關(guān)系型數(shù)據(jù)庫數(shù)據(jù),還有半結(jié)構(gòu)化的JS0N數(shù)據(jù)格式和XML格式。他們 的特點(diǎn)如下:
[0003] 1)對(duì)于經(jīng)典的關(guān)系型數(shù)據(jù)庫數(shù)據(jù),其數(shù)據(jù)模式規(guī)范在海量數(shù)據(jù)存儲(chǔ)時(shí),其嚴(yán)格的 數(shù)據(jù)存儲(chǔ)要求會(huì)嚴(yán)重降低數(shù)據(jù)庫性能,造成非常大的數(shù)據(jù)響應(yīng)延時(shí)。
[0004] 2)對(duì)于JS0N以及XML時(shí)現(xiàn)在流行的數(shù)據(jù)格式,以其半結(jié)構(gòu)化的存儲(chǔ)格式,可以靈 活表示數(shù)據(jù)。但一條這類數(shù)據(jù)只記錄一條信息,當(dāng)有多條信息是相似的時(shí)候,也需要多條數(shù) 據(jù)來存儲(chǔ),浪費(fèi)了存儲(chǔ)空間。
[0005] 數(shù)據(jù)編碼也是壓縮數(shù)據(jù)存儲(chǔ)空間的重要方法,傳統(tǒng)的數(shù)值數(shù)據(jù)編碼方法有游程編 碼和變成無符號(hào)整數(shù)編碼varint編碼。
[0006] 1)游程編碼主要用于有序數(shù)據(jù)集合中,數(shù)據(jù)重復(fù)出現(xiàn)的壓縮存儲(chǔ)優(yōu)化。傳統(tǒng)游程 碼的原理為將連續(xù)重復(fù)出現(xiàn)的數(shù)據(jù)只存儲(chǔ)一個(gè),緊跟其后的是該數(shù)據(jù)的重復(fù)次數(shù)。如有以 下一維數(shù)據(jù)集合:
[0007]
[0008] 采用傳統(tǒng)游程編碼后為:
[0009]
[0010] 可以看到數(shù)據(jù)存儲(chǔ)總量確實(shí)有所減少,這在集合中數(shù)據(jù)大量連續(xù)重復(fù)時(shí)是有空間 節(jié)約的。但當(dāng)集合中數(shù)據(jù)重復(fù)并不大量時(shí),可能會(huì)增加存儲(chǔ)空間,如以下一維集合:
[0011]
[0012] 編碼后為:
[0013]
[0014] 存儲(chǔ)空間并未節(jié)約,為了解決這種情況,就提出了優(yōu)化的游程編碼,其并不是對(duì)每 個(gè)數(shù)據(jù)做游程編碼,而是在重復(fù)次數(shù)大于1的數(shù)據(jù)前加一個(gè)標(biāo)志數(shù)據(jù),在讀一個(gè)數(shù)據(jù)時(shí),如 果遇到了標(biāo)志數(shù)據(jù),表明其后的數(shù)據(jù)進(jìn)行了游程編碼,否則就是沒進(jìn)行編碼的數(shù)據(jù),其只出 現(xiàn)一次。設(shè)標(biāo)志為S,則上面的一維集合編碼后為:
[0015]
[0016] 可以看到,數(shù)據(jù)被節(jié)約存儲(chǔ),但標(biāo)志的引入也是帶來了額外的存儲(chǔ)開銷。
[0017] 2)varint編碼是將一個(gè)字節(jié)分成兩個(gè)部分,高位的1個(gè)bit為標(biāo)志位,表示下一個(gè) 字節(jié)是否屬于當(dāng)前數(shù)值,后7個(gè)bit為數(shù)值內(nèi)容,如前文中無符號(hào)int值300,其編碼如下:
[0018]
[0019] 這里高位的1個(gè)bit標(biāo)志位,為0時(shí)表示后面一個(gè)字節(jié)屬于當(dāng)前數(shù)值;為1時(shí)表 示,本字節(jié)就是當(dāng)前數(shù)值的最后一個(gè)字節(jié)。而每個(gè)屬于該數(shù)字的字節(jié)的后7個(gè)bit為數(shù)值, 通過位操作可以輕松得與對(duì)應(yīng)數(shù)值相互轉(zhuǎn)換。varint是針對(duì)單個(gè)數(shù)值編碼的,其空間利用 率高。但當(dāng)出現(xiàn)整數(shù)數(shù)組且數(shù)值中有連續(xù)重復(fù)出現(xiàn)的數(shù)值時(shí),這種方法就不能用有像游程 編碼一樣的壓縮效果了。
[0020] 這里采用內(nèi)存的小端表示法,即數(shù)值的低位放在內(nèi)存的低地址處,數(shù)值的高位放 在內(nèi)存的高地址處;從左到右,內(nèi)存地址從小到大;一個(gè)字節(jié)內(nèi)部為位7~位0。

【發(fā)明內(nèi)容】

[0021] 針對(duì)傳統(tǒng)的記錄型數(shù)據(jù)存儲(chǔ)方式以及傳統(tǒng)數(shù)值編碼方式的不足,本發(fā)明提供一種 記錄型數(shù)據(jù)存儲(chǔ)空間的優(yōu)化與恢復(fù)方法。
[0022] 為此,本發(fā)明采用如下技術(shù)方案:
[0023] -種記錄型數(shù)據(jù)存儲(chǔ)空間的優(yōu)化方法,通過對(duì)記錄型數(shù)據(jù)的去重和編碼來實(shí)現(xiàn)存 儲(chǔ)空間的優(yōu)化,所述優(yōu)化方法包括如下步驟:
[0024] (1)數(shù)據(jù)預(yù)處理
[0025] 所述數(shù)據(jù)預(yù)處理包括字段分組和格式轉(zhuǎn)換,所述字段分組為將記錄型數(shù)據(jù)的字段 進(jìn)行分組,所述格式轉(zhuǎn)換為將字段組轉(zhuǎn)化為系統(tǒng)所需的預(yù)處理格式;
[0026] (2)數(shù)據(jù)去重與字典壓縮
[0027] 將預(yù)處理后的數(shù)據(jù)再次分組,每一個(gè)組為一個(gè)處理組,每個(gè)處理組內(nèi)使用歸并與 哈希的方法,在每個(gè)處理組中將產(chǎn)生多棵記錄樹,記錄樹的節(jié)點(diǎn)為字段組,記錄樹的節(jié)點(diǎn)為 字符表示的無符號(hào)整數(shù),使用字典編碼將每個(gè)字段轉(zhuǎn)化成一個(gè)字典;
[0028] (3)記錄樹編碼
[0029] 在記錄樹中,使用優(yōu)化的無符號(hào)整數(shù)編碼方法對(duì)每個(gè)記錄樹的節(jié)點(diǎn)進(jìn)行編碼;
[0030] (4)記錄樹集合與字典包的保存
[0031] 將字典集合中的字典和編碼后的記錄樹集合中的記錄樹逐個(gè)寫入數(shù)據(jù)塊的數(shù)據(jù) 緩存中,將數(shù)據(jù)緩存寫入文件流中,同時(shí)在每個(gè)塊后寫入同步標(biāo)記。
[0032] 優(yōu)選地,步驟(1)中的格式轉(zhuǎn)換包括字段組內(nèi)和字段組間使用預(yù)定義分隔符分 隔,經(jīng)過格式轉(zhuǎn)換后的數(shù)據(jù)成為預(yù)處理記錄,類型為字符串。
[0033] 優(yōu)選地,字段組內(nèi)使用的預(yù)定義分隔符為",";字段組間使用的預(yù)定義分隔符為 "r,。
[0034] 優(yōu)選地,步驟(2)中歸并后的記錄樹以深度優(yōu)先順序存放各個(gè)節(jié)點(diǎn)。
[0035] 優(yōu)選地,步驟(3)中優(yōu)化的無符號(hào)整數(shù)編碼方法包括如下步驟:
[0036] (301)獲取一個(gè)字段組;
[0037] (302)將字段組轉(zhuǎn)換為一個(gè)整數(shù)數(shù)組;
[0038] (303)存儲(chǔ)整數(shù)數(shù)組中元素個(gè)數(shù);
[0039] (304)保存當(dāng)前位置為待編碼值,從整數(shù)數(shù)組當(dāng)前位置遍歷數(shù)組,統(tǒng)計(jì)當(dāng)前數(shù)值的 連續(xù)重復(fù)次數(shù);
[0040] (305)將當(dāng)前數(shù)值的二進(jìn)制后6位存入編碼第一個(gè)字節(jié)的后六位,當(dāng)前數(shù)值右移6 位,如果移位后結(jié)果為〇,則修改編碼第一字節(jié)的位7為1 ;如果移位后結(jié)果大于0,則修改 第一字節(jié)的位7為0,移位結(jié)果進(jìn)行varint編碼,編碼結(jié)果緊跟在第一字節(jié)后面;
[0041] (306)對(duì)重復(fù)次數(shù)值進(jìn)行游程碼編碼,如果該數(shù)值連續(xù)出現(xiàn)次數(shù)小于2,則修改第 一字節(jié)的位6為1 ;否則,則修改第一字節(jié)的位6為0,用varint編碼重復(fù)次數(shù)值,緊跟在當(dāng) 前數(shù)值編碼結(jié)果后面;
[0042] (307)如果數(shù)組中還有元素,則設(shè)置下一個(gè)值的位置為當(dāng)前位置,回到(304);否 貝1J,數(shù)組編碼結(jié)束,返回結(jié)果。
[0043] 優(yōu)化的無符號(hào)整數(shù)編碼方式,其第一個(gè)編碼字節(jié)有兩個(gè)標(biāo)志位,位7為是否下一 字節(jié)為當(dāng)前數(shù)值標(biāo)記,位6為當(dāng)前數(shù)值是否采用游程編碼標(biāo)志。而數(shù)值編碼的第二字節(jié)起 (如果數(shù)值超過2的6次方),則數(shù)值右移6為后的部分使用varint編碼。如果使用游程 編碼,則重復(fù)次數(shù)數(shù)值使用varint編碼,并緊跟在當(dāng)前數(shù)值編碼的后面。第一個(gè)編碼字節(jié) 的標(biāo)志位規(guī)則如下:
[0044]
[0045] 如對(duì)于無符號(hào)整數(shù)序列[300, 300, 300, 50, 5000, 5000, 60, 60, 130],
[0046] 使用傳統(tǒng)的varint編碼需要15字節(jié),而使用本編碼方法僅需要11字節(jié),其結(jié)果 為:
[0047]
[0048] -種用于記錄型存儲(chǔ)空間優(yōu)化后的數(shù)據(jù)恢復(fù)方法,所述恢復(fù)方法包括如下步驟:
[0049] 0-)數(shù)據(jù)塊的獲取
[0050] 在文件流中中定位數(shù)據(jù)塊同步標(biāo)記,取出數(shù)據(jù)塊;
[0051] (2')記錄樹的解碼
[0052] 將編碼后的記錄樹恢復(fù)為無符號(hào)整數(shù)數(shù)組,再轉(zhuǎn)換為字典碼字段組;
[0053] (3')記錄樹的恢復(fù)
[0054] 采用深度優(yōu)先遍歷記錄樹的方法來恢復(fù)數(shù)據(jù)。
[0055] 優(yōu)選地,步驟(2')中記錄樹的解碼包括如下步驟:
[0056] (20Γ)讀入數(shù)據(jù)塊中整數(shù)數(shù)組中元素個(gè)數(shù);
[0057] (202')生成一個(gè)整數(shù)集合,用于存放解碼數(shù)值;
[0058] (203')保存當(dāng)前字節(jié)為編碼首字節(jié);
[0059] (204')將首字節(jié)的后6位保存在當(dāng)前數(shù)值解碼結(jié)果中;
[0060] (205')判斷首字節(jié)的位7,如果位7為"0",則下一個(gè)字節(jié)屬于當(dāng)前數(shù)值,從下一 個(gè)字節(jié)起使用varint解碼,其中首字節(jié)中的后6位為當(dāng)前數(shù)值解碼結(jié)果的低6位,解碼結(jié) 束后,并將掃描位置移到下一個(gè)字節(jié);如果位7為" 1",則首字節(jié)的后6位即為當(dāng)前數(shù)值解 碼結(jié)果;
[0061] (206')判斷首字節(jié)的位6,如果位6為"0",則數(shù)值編碼的后面緊跟著的是當(dāng)前數(shù) 值的重復(fù)次數(shù)的編碼,使用varint解碼,即得重復(fù)次數(shù)值;如果位6為"1",則當(dāng)前數(shù)值的 重復(fù)次數(shù)為〇,即重復(fù)次數(shù)值為1 ;
[0062] (207')將數(shù)值按照重復(fù)出現(xiàn)的次數(shù)填充入整數(shù)集合中,并將重復(fù)次數(shù)累加到已解 碼數(shù)組元素的計(jì)數(shù)器中;
[0063] (208')如果已解碼數(shù)組元素的計(jì)數(shù)器小于數(shù)值元素個(gè)數(shù),則處理字節(jié)移動(dòng)到下一 個(gè)字節(jié),跳到(203');否則數(shù)組解碼結(jié)束,得到整數(shù)解碼集合;
[0064] (209')將整數(shù)解碼集合中的數(shù)值依次轉(zhuǎn)換為字符數(shù)字形式,在字符數(shù)字形式數(shù)值 的兩邊添加分割符,并寫入記錄樹中,添加字段組開始與結(jié)束標(biāo)志。
[0065] 優(yōu)選地,步驟(209')中的分隔符為"("或")"。
[0066] 優(yōu)選地,步驟(3 ')中記錄樹的恢復(fù)包括如下步驟:
[0067] (30Γ)生成一個(gè)棧,用于存放記錄樹的節(jié)點(diǎn);
[0068] (302')識(shí)別記錄樹的節(jié)點(diǎn),并放入棧中;
[0069] (303')如果下一個(gè)字符為為字段組分隔符,則棧中的節(jié)點(diǎn)已經(jīng)構(gòu)成一條記錄,依 次取出節(jié)點(diǎn)組成一條記錄,然后將棧的節(jié)點(diǎn)彈出;
[0070] (304')如果該字符為子樹開始標(biāo)記,則移動(dòng)到下一個(gè)字符;
[0071] (305')如果該字符為子樹結(jié)束標(biāo)記,則棧中的節(jié)點(diǎn)已經(jīng)構(gòu)成一條記錄,依次取出 節(jié)點(diǎn)組成一條記錄,繼續(xù)移動(dòng)到下一個(gè),直到下一個(gè)字符不為子樹結(jié)束標(biāo)記,其中,每移動(dòng) 一次,棧就彈出一個(gè)節(jié)點(diǎn),如果掃描到記錄樹結(jié)尾,則恢復(fù)結(jié)束。
[0072] 本發(fā)明提供一種記錄型數(shù)據(jù)存儲(chǔ)空間的優(yōu)化方法和與其相對(duì)應(yīng)的恢復(fù)方法,所述 記錄型數(shù)據(jù)存儲(chǔ)空間的優(yōu)化方法通過歸并與哈希的方法,實(shí)現(xiàn)記錄數(shù)據(jù)的去重與字典壓 縮,通過優(yōu)化的無符號(hào)整數(shù)編碼方法來提高了無符號(hào)整數(shù)序列的存儲(chǔ)效率,從而優(yōu)化了記 錄型數(shù)據(jù)存儲(chǔ)空間;通過與優(yōu)化的無符號(hào)整數(shù)編碼方法相對(duì)應(yīng)的優(yōu)化的無符號(hào)整數(shù)解碼方 法來恢復(fù)記錄型數(shù)據(jù)
當(dāng)前第1頁1 2 
網(wǎng)友詢問留言 已有0條留言
  • 還沒有人留言評(píng)論。精彩留言會(huì)獲得點(diǎn)贊!
1
商南县| 张家川| 沅陵县| 历史| 元朗区| 九江县| 佳木斯市| 长葛市| 银川市| 东乌| 饶平县| 黔西| 田林县| 博乐市| 安化县| 华宁县| 休宁县| 尖扎县| 尉氏县| 遵义市| 二连浩特市| 河南省| 城口县| 望都县| 政和县| 柯坪县| 吉林市| 绿春县| 山西省| 金门县| 甘洛县| 湖南省| 安泽县| 扬中市| 承德县| 漳州市| 武鸣县| 新邵县| 邳州市| 永安市| 波密县|