一、hdf5數(shù)據(jù)庫的并行讀寫是怎么回事
關(guān)鍵點(diǎn)在于告知數(shù)據(jù)位置(hyperslab)。比如說我要把我100*100的矩陣分成10*10的block,我需要告訴代碼我的分配規(guī)則。比如說,rank0 寫在名列前茅行名列前茅列,rank1寫在名列前茅行第二列,我就可以寫col=rank%10,row=rank/10,(從0計數(shù)),寫的時候每個processor會告知,mydata,myrank,myposition,然后并行的時候每個核的數(shù)據(jù)就會被寫在相應(yīng)的位置。
給個fortran的例子,
CALL h5sselect_hyperslab_f (filespace, H5S_SELECT_SET_F, offset, count, error, stride,block_size)
這里filespace 告知在文件里開辟的內(nèi)存id,第二個內(nèi)置參數(shù),告訴怎樣寫,后面offset,count,stride,block什么的全都用于描述位置,你可以橫著寫,數(shù)著寫,跳著寫,轉(zhuǎn)著圈寫。。。一般我只用兩個參數(shù)就能描述清楚了,因?yàn)槲腋愕氖墙Y(jié)構(gòu)網(wǎng)格,一開始還不理解為什么那么多種寫數(shù)據(jù)的花型。直到后面寫作業(yè)用到非結(jié)構(gòu)網(wǎng)格,這個時候描述數(shù)據(jù)位置就尤其重要了,因?yàn)槟阈枰屜噜弍rocessor處理的數(shù)據(jù)物理空間也盡量靠近,這樣才能減少block之間的信息交互,然后提高計算速度。
延伸閱讀:
二、并發(fā)鎖
在一定條件下,MyISAM也支持查詢和操作的并發(fā)進(jìn)行。
MyISAM存儲引擎有一個系統(tǒng)變量concurrent_insert,專門用以控制其并發(fā)插入的行為,其值分別可以為0、1或2。
當(dāng)concurrent_insert設(shè)置為0時,不允許并發(fā)插入。
當(dāng)concurrent_insert設(shè)置為1時,如果MyISAM允許在一個讀表的同時,另一個進(jìn)程從表尾插入記錄。這也是MySQL的默認(rèn)設(shè)置。
當(dāng)concurrent_insert設(shè)置為2時,無論MyISAM表中有沒有空洞,都允許在表尾插入記錄,都允許在表尾并發(fā)插入記錄。
可以利用MyISAM存儲引擎的并發(fā)插入特性,來解決應(yīng)用中對同一表查詢和插入鎖爭用。例如,將concurrent_insert系統(tǒng)變量為2,總是允許并發(fā)插入;同時,通過定期在系統(tǒng)空閑時段執(zhí)行OPTIONMIZE TABLE語句來整理空間碎片,收到因刪除記錄而產(chǎn)生的中間空洞。