新聞中心
在去年的軟件開發(fā)2.0技術(shù)大會上,我講了一個支持動態(tài)負(fù)載均衡的多核查找設(shè)計方法?;舅枷胧遣捎脭?shù)據(jù)結(jié)構(gòu)分拆的方法,使用了多級的數(shù)據(jù)結(jié)構(gòu)設(shè)計。下面先簡要介紹一下這種多級數(shù)據(jù)結(jié)構(gòu)的設(shè)計思路,然后給出一個采用數(shù)組順序查找作為查找表實現(xiàn)的多級數(shù)據(jù)結(jié)構(gòu)類CDHashArray。

創(chuàng)新互聯(lián)為您提適合企業(yè)的網(wǎng)站設(shè)計?讓您的網(wǎng)站在搜索引擎具有高度排名,讓您的網(wǎng)站具備超強的網(wǎng)絡(luò)競爭力!結(jié)合企業(yè)自身,進行網(wǎng)站設(shè)計及把握,最后結(jié)合企業(yè)文化和具體宗旨等,才能創(chuàng)作出一份性化解決方案。從網(wǎng)站策劃到網(wǎng)站設(shè)計、成都網(wǎng)站建設(shè), 我們的網(wǎng)頁設(shè)計師為您提供的解決方案。
在CDHashArray中,對數(shù)組的插入和刪除都是順序化的操作,查找也是近似于順序化的操作,看起來似乎會很慢。實際上對于小數(shù)組,比如只有幾個或十來個數(shù)組,其效率并不慢,這使得以前在單核時代無法用于大型查找的數(shù)組順序查找,在多核時代卻可以得到很好應(yīng)用前景。
二級查找結(jié)構(gòu)基本思想
要了解多級數(shù)據(jù)結(jié)構(gòu)設(shè)計,首先得知道基本的二級查找數(shù)據(jù)結(jié)構(gòu)設(shè)計思想。
二級查找結(jié)構(gòu)就是在第1級查找時找到二級子表的位置,然后在找到的二級子表中進行第二次查找來找到對應(yīng)的目標(biāo)數(shù)據(jù)。
典型的二級查找結(jié)構(gòu)示意圖如下:
圖 16.2.1: 二級查找結(jié)構(gòu)示意圖
二級查找結(jié)構(gòu)由一級查找表和二級子表構(gòu)成,一個查找表中的每個節(jié)點指向一個二級查找子表。查找時,先將關(guān)鍵詞映射成一級查找表的位置,然后將對應(yīng)位置的二級子表取出,在子表中找到對應(yīng)的查找目標(biāo)數(shù)據(jù)。
Intel Threading Building Blocks(TBB)開源項目中,其中的concurrent_hash_map使用的就是一種最簡單的二級查找結(jié)構(gòu)。它使用了哈希表式的數(shù)據(jù)結(jié)構(gòu),并給哈希表的每個桶設(shè)一把鎖。
對于普通的查找,這種簡單的二級查找結(jié)構(gòu)也許夠用了,但是對于一些大型的查找,這種簡單的二級查找結(jié)構(gòu)并不能滿足。首先的問題是如果子表數(shù)量過多,則鎖的數(shù)量也非常多,鎖本身需要占用大量的內(nèi)存開銷。
如 果子表數(shù)量過少,那么又會引起另外一個重要的問題,那就是負(fù)載平衡問題。因為這種情況中有可能各個二級子表中的數(shù)據(jù)數(shù)量相差非常大,這將導(dǎo)致某些子表的訪 問量很少,而某些子表的訪問量很大。這些訪問量大的表很容易發(fā)生多個線程同時訪問的情況,從而導(dǎo)致集中式鎖競爭情況的發(fā)生。
為了解決二級查找結(jié)構(gòu)中的不足,下面來看看多級查找結(jié)構(gòu)的設(shè)計思想。
多級查找結(jié)構(gòu)設(shè)計思想
多級查找結(jié)構(gòu)是在二級查找結(jié)構(gòu)的基礎(chǔ)上設(shè)計的,當(dāng)某個子表中數(shù)據(jù)個數(shù)過多時,可以將其拆分成兩個或更多個子表,同時新建一個索引表來指向這幾個拆分候的子表,指向原來子表的指針指向新建的索引表。
如果拆分后的子表內(nèi)插入的數(shù)據(jù)過多時,可以繼續(xù)將其分拆,這樣一直分拆下去,將形成一個多級的查找數(shù)據(jù)結(jié)構(gòu),下圖就是一個多級查找結(jié)構(gòu)示意圖。
分享題目:多核查找-順序查找也瘋狂
分享地址:http://www.5511xx.com/article/ccecedi.html


咨詢
建站咨詢
