自拍偷在线精品自拍偷,亚洲欧美中文日韩v在线观看不卡

第39期:數(shù)據(jù)分段討論

企業(yè)動態(tài)
現(xiàn)代計算機(jī)一般都有多CPU核,而日益廣泛應(yīng)用的固態(tài)硬盤也有較強(qiáng)的并發(fā)能力,這些硬件資源都為并行計算提供了有力的保證。

【數(shù)據(jù)蔣堂】第39期:數(shù)據(jù)分段討論

現(xiàn)代計算機(jī)一般都有多CPU核,而日益廣泛應(yīng)用的固態(tài)硬盤也有較強(qiáng)的并發(fā)能力,這些硬件資源都為并行計算提供了有力的保證。不過,要實(shí)現(xiàn)并行計算還需要有較好的數(shù)據(jù)分段技術(shù),也就是能方便地把待計算的數(shù)據(jù)拆分成若干部分,讓每個線程(或進(jìn)程,這里以多線程為例討論,多進(jìn)程情況是類似的)分別處理。

設(shè)計數(shù)據(jù)分段方案時,有這么幾個目標(biāo):

1. 每段的數(shù)據(jù)量基本相同

并行任務(wù)的最終耗時是以那個最慢的線程為準(zhǔn)的,而同一機(jī)器中各線程的處理能力基本相當(dāng),因此數(shù)據(jù)分段要能做到盡量平均,使各線程的計算時間基本相同。

2. 分段數(shù)可靈活動態(tài)指定

在數(shù)據(jù)準(zhǔn)備階段經(jīng)常并不清楚實(shí)際計算用機(jī)器的CPU數(shù),而且即使知道,線程數(shù)也不能簡單地按機(jī)器CPU核數(shù)去算,因?yàn)橛脖P的并發(fā)能力常常小于CPU;并且,在有并發(fā)計算時,能有多少CPU核用到本計算任務(wù)也不能事先預(yù)知。實(shí)際計算用的線程數(shù)***是根據(jù)當(dāng)時場景動態(tài)決定,范圍從幾個到幾十個都有可能,這要求能夠按隨意的數(shù)量將數(shù)據(jù)分段。

3. 每個分段是連續(xù)緊湊存儲的

因?yàn)橛脖P不適合頻繁隨機(jī)訪問(即使固態(tài)硬盤也不適合頻繁小量的隨機(jī)訪問),為了保證遍歷性能,我們希望每個線程要處理的數(shù)據(jù)在硬盤上要盡量連續(xù)存儲,而不是頻繁跳躍。

4. 允許數(shù)據(jù)追加

數(shù)據(jù)并不是固定不變的,會隨著時間不斷增長,我們當(dāng)然希望每次追加數(shù)據(jù)時不必重新整理所有數(shù)據(jù),只需要把追加的數(shù)據(jù)補(bǔ)上即可。

使用文本文件存儲數(shù)據(jù)時,可以同時保證這4個目標(biāo)。只要簡單地按總字節(jié)數(shù)把文件分成多段,每個線程讀取其中一段即可。

文本中用回車作為記錄(行)的分隔符,文本記錄的數(shù)據(jù)本身中不可能出現(xiàn)回車字符,所以用它用為記錄的分隔符不會產(chǎn)生歧義。按文件字節(jié)數(shù)分段時,分段點(diǎn)可能會落到某一行的中間,這時使用去頭補(bǔ)尾的方法進(jìn)行調(diào)整,即就是每個分段從分段點(diǎn)繼續(xù)讀到一個回車符才開始,而越過下一個分段點(diǎn)繼續(xù)讀到一個回車符時才結(jié)束,這樣就可以保證每個分段都只包含完整的記錄(行),這也是HADOOP常用的方法。

但是,文本本身的解析實(shí)在太慢了,我們還是要考慮二進(jìn)制的存儲方案。

二進(jìn)制數(shù)據(jù)中沒有回車這種可用于分隔記錄的字符,任何字節(jié)數(shù)值都可能是數(shù)據(jù)本身,這時就無法識別出記錄何時結(jié)束。如果一定要人為制造一個分隔符,那就要足夠長才能避免和數(shù)據(jù)本身重復(fù)的可能性,每條記錄上都增加這么一段字節(jié),會增加大量無意義的數(shù)據(jù)量,降低性能。而且,這也只能降低出錯率而不能徹底杜絕。

改進(jìn)的方法是使用區(qū)塊,把數(shù)據(jù)存入若干相同大小的區(qū)塊,分段時以區(qū)塊為單位,只要總區(qū)塊數(shù)量足夠多,每個線程分配到的區(qū)塊數(shù)量也就相對比較平均,也就能滿足目標(biāo)1和目標(biāo)2了。不過目標(biāo)3卻有些問題,區(qū)塊大小是存儲數(shù)據(jù)之前就確定的,不大可能正好和記錄長度匹配,如果要求每個區(qū)塊中都存儲完整的記錄,就可能造成區(qū)塊中的空間浪費(fèi)(剩余空間存不下一條完整記錄時只能作廢)。在區(qū)塊較小且記錄字段較多時這個浪費(fèi)會很嚴(yán)重,影響目標(biāo)3希望的緊湊性。如果允許一條記錄被拆分到兩個區(qū)塊,那又不能按區(qū)塊為單位來分段了,否則可能造成某個分段將只處理半條記錄的情況。

這時候可以借鑒文本的去頭補(bǔ)尾方案,允許同一記錄拆分到兩個區(qū)塊,在讀取分段的***個區(qū)塊時跳過***條(可能是半條)記錄,而讀取***一個區(qū)塊時再繼續(xù)讀下一個區(qū)塊把當(dāng)前區(qū)塊中***的記錄讀完整,這樣可以保證數(shù)據(jù)的緊湊性了。這種方法要求在區(qū)塊中有個標(biāo)記表明本區(qū)塊中***條記錄是否是上一區(qū)塊記錄的延續(xù)以及***一條記錄是否完整,空間成本不算高,但在遍歷數(shù)據(jù)時總要被這些標(biāo)記打斷,處理起來麻煩不少,會影響性能。

數(shù)據(jù)庫一般也使用區(qū)塊方案,但由于數(shù)據(jù)庫將所有表的數(shù)據(jù)存儲在一起,它的區(qū)塊分配算法不會去保證同表數(shù)據(jù)所占用的區(qū)塊之間的連續(xù)性。而為提高數(shù)據(jù)的連續(xù)性,就要讓區(qū)塊更大,這和區(qū)塊多又有點(diǎn)矛盾。如果再考慮到數(shù)據(jù)的可追加性,則還需要一個不斷變大的索引表來管理這些區(qū)塊,在區(qū)塊數(shù)量很多時,這個索引表本身的連續(xù)性也不容易得到保證(它的長度事先不知道,在數(shù)據(jù)追加過程中動態(tài)增長)。

責(zé)任編輯:趙寧寧 來源: 51CTO專欄
相關(guān)推薦

2018-01-24 07:45:51

數(shù)據(jù)倍增分段列存

2009-12-01 10:20:16

2012-06-13 13:24:01

Between豌豆莢設(shè)計獎

2018-09-14 14:22:17

SAP智慧企業(yè)

2012-11-20 17:29:20

技術(shù)周刊

2017-06-14 23:08:29

報表數(shù)據(jù)計算層

2019-04-16 13:37:15

架構(gòu)技術(shù)棧微信半月刊

2016-10-11 13:46:01

信息化流程再造

2013-01-21 13:41:59

IBMdW

2017-10-09 22:33:56

SQL等值分組有序分組

2018-03-14 07:47:41

大數(shù)據(jù)語法SQL

2017-08-09 16:13:48

SQL大數(shù)據(jù)語法

2020-12-24 18:00:45

MySQL元數(shù)據(jù)鎖數(shù)據(jù)庫

2017-10-18 22:34:33

SQL等值分組有序分組

2017-09-05 22:34:24

遍歷SQL運(yùn)算

2017-11-08 06:18:43

JOINSQL運(yùn)算

2017-09-13 08:45:33

遍歷SQL運(yùn)算

2017-05-23 22:16:16

IT數(shù)據(jù)

2018-03-14 17:43:36

大數(shù)據(jù)集群運(yùn)算

2011-12-08 15:57:50

網(wǎng)絡(luò)安全技術(shù)周刊
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號