一種快速統(tǒng)計(jì)頻數(shù)的方法及系統(tǒng)的制作方法
【技術(shù)領(lǐng)域】
[0001]本發(fā)明屬于數(shù)據(jù)統(tǒng)計(jì)領(lǐng)域,特別是涉及一種快速統(tǒng)計(jì)頻數(shù)的方法及系統(tǒng)。
【背景技術(shù)】
[0002]在目前的大數(shù)據(jù)時(shí)代,越來越多的需要對(duì)數(shù)據(jù)流進(jìn)行進(jìn)一步的加工處理,以獲取更加有用的信息。對(duì)數(shù)據(jù)流進(jìn)行頻數(shù)統(tǒng)計(jì)是其中一項(xiàng)重要的處理方式,在多個(gè)領(lǐng)域中均存在相應(yīng)的應(yīng)用。例如,對(duì)IP地址點(diǎn)擊頻次的統(tǒng)計(jì),對(duì)視頻中廣告播放次數(shù)的統(tǒng)計(jì)等等。在流計(jì)數(shù)領(lǐng)域,已經(jīng)有一些統(tǒng)計(jì)頻數(shù)的方法被應(yīng)用到各種頻數(shù)統(tǒng)計(jì)系統(tǒng)中。這些方法都力求用相對(duì)較少的內(nèi)存,獲得較高的準(zhǔn)確率和召回率,同時(shí)保證統(tǒng)計(jì)系統(tǒng)能夠處理盡可能高速的數(shù)據(jù)流。
[0003]然而,隨著網(wǎng)絡(luò)不斷提速,現(xiàn)有的頻數(shù)統(tǒng)計(jì)方法已經(jīng)很難滿足現(xiàn)在的高速流計(jì)數(shù)任務(wù)。僅僅依靠提高處理器性能來提升效率的方法,已經(jīng)不能及時(shí)應(yīng)對(duì)當(dāng)下的高速數(shù)據(jù)問題。雖然有一些技術(shù)利用CHJ多核來提升處理的效率,用并行的辦法來進(jìn)一步提升統(tǒng)計(jì)頻數(shù)的速度。但是,這種方法仍然沒有打破硬件設(shè)備的限制,其統(tǒng)計(jì)能力仍然受到硬件性能的限制。
[0004]對(duì)于串行頻數(shù)統(tǒng)計(jì)系統(tǒng)來說,其僅僅依靠算法的設(shè)計(jì)和硬件性能來提升系統(tǒng)的吞吐量,所以即便是最好的串行頻數(shù)統(tǒng)計(jì)系統(tǒng)也不能夠應(yīng)對(duì)日益增長(zhǎng)的網(wǎng)絡(luò)流量。
[0005]對(duì)于并行系統(tǒng)來說,高速流進(jìn)行計(jì)數(shù)統(tǒng)計(jì)的并行系統(tǒng)采用的方法主要分為兩類:一是共享結(jié)構(gòu)型的統(tǒng)計(jì)系統(tǒng):即維持一個(gè)全局結(jié)構(gòu),所有并行的子方法通過訪問這個(gè)全局結(jié)構(gòu)來更新數(shù)據(jù);二是獨(dú)立結(jié)構(gòu)型的統(tǒng)計(jì)系統(tǒng):無需維持任何全局結(jié)構(gòu),各個(gè)并行子方法各自維持自己獨(dú)立的數(shù)據(jù)結(jié)構(gòu),而當(dāng)要進(jìn)行數(shù)據(jù)查詢時(shí),把各個(gè)子方法的數(shù)據(jù)再進(jìn)行匯總得到一個(gè)全局結(jié)果。
[0006]對(duì)于并行頻數(shù)統(tǒng)計(jì)系統(tǒng)的兩類方法都有各自的缺點(diǎn):
[0007]共享結(jié)構(gòu)型:因?yàn)橐3謹(jǐn)?shù)據(jù)的一致性,子方法必須互斥地訪問一個(gè)全局結(jié)構(gòu),導(dǎo)致各個(gè)子方法競(jìng)爭(zhēng)開銷太大;
[0008]獨(dú)立結(jié)構(gòu)型:查詢統(tǒng)計(jì)結(jié)果時(shí),需要匯總所有子方法的結(jié)果,因此該并行方法的效率和查詢的間隔有關(guān)。當(dāng)查詢過于頻繁時(shí),該系統(tǒng)吞吐量會(huì)嚴(yán)重惡化。
[0009]而其他一些方法,例如基于過濾方法的頻數(shù)統(tǒng)計(jì)系統(tǒng),其很難再進(jìn)行進(jìn)一步的并行,所以該類系統(tǒng)的吞吐量受CPU處理能力限制;而差分發(fā)送的并行系統(tǒng),能夠比較有效的對(duì)原有串行方法并行,但是該方法并沒有完全保持原串行頻數(shù)統(tǒng)計(jì)方法的一些好的特性。
[0010]綜上,已有的頻數(shù)統(tǒng)計(jì)系統(tǒng)中,其最終的吞吐量都受到了硬件性能的限制。
【發(fā)明內(nèi)容】
[0011]有鑒于現(xiàn)有技術(shù)的上述缺陷,本發(fā)明所要解決的技術(shù)問題是提供一種并行度更大、擴(kuò)展性更高,能夠在很大程度上提高總的吞吐量的頻數(shù)統(tǒng)計(jì)方法。
[0012]為實(shí)現(xiàn)上述目的,本發(fā)明提供了一種快速統(tǒng)計(jì)頻數(shù)的方法,包括數(shù)據(jù)處理子單元進(jìn)行頻數(shù)統(tǒng)計(jì)的步驟和數(shù)據(jù)匯總單元統(tǒng)計(jì)增量的步驟;
[0013]所述數(shù)據(jù)處理子單元進(jìn)行頻數(shù)統(tǒng)計(jì)按以下步驟進(jìn)行:
[0014]Al、所述數(shù)據(jù)處理子單元收到一個(gè)元素e;
[0015]A2、所述數(shù)據(jù)處理子單元檢查是否有計(jì)數(shù)器對(duì)e進(jìn)行計(jì)數(shù);
[0016]如果e有對(duì)應(yīng)的計(jì)數(shù)器對(duì)其進(jìn)行計(jì)數(shù),那么就增加對(duì)應(yīng)計(jì)數(shù)器的delta變量和計(jì)數(shù)值,然后執(zhí)彳丁步驟A3;
[0017]如果e沒有對(duì)應(yīng)的計(jì)數(shù)器對(duì)其進(jìn)行計(jì)數(shù),判斷系統(tǒng)中所有的計(jì)數(shù)器個(gè)數(shù)是否達(dá)到上限;
[0018]如果系統(tǒng)中所有的計(jì)數(shù)器個(gè)數(shù)沒有達(dá)到上限,則初始化一個(gè)新的計(jì)數(shù)器來對(duì)這個(gè)元素計(jì)數(shù),然后執(zhí)行步驟A3;
[0019]如果系統(tǒng)中所有的計(jì)數(shù)器個(gè)數(shù)達(dá)到上限,則找到系統(tǒng)中計(jì)數(shù)值最小的計(jì)數(shù)器,然后用元素e把系統(tǒng)中計(jì)數(shù)值最小的計(jì)數(shù)器中的元素替換掉,接著把計(jì)數(shù)誤差的值設(shè)置為當(dāng)前的計(jì)數(shù)值;設(shè)置該計(jì)數(shù)器中的delta_err0r變量等于該計(jì)數(shù)器中的delta,最后增加對(duì)應(yīng)計(jì)數(shù)器的delta變量和計(jì)數(shù)值;然后執(zhí)行步驟A3;
[°02°] A3、更新計(jì)數(shù)器鏈表結(jié)構(gòu),判斷delta是否達(dá)到發(fā)送閾值threshold,如果達(dá)到則向數(shù)據(jù)匯總單元發(fā)送該計(jì)數(shù)器的元素e、delta和del ta_error的值,然后把delta和del ta_error變量清零;否則在接收到新的元素后返回執(zhí)行步驟A2;
[0021 ]所述數(shù)據(jù)匯總單元統(tǒng)計(jì)增量按以下步驟執(zhí)行:
[0022]B1、所述數(shù)據(jù)匯總單元收到元素e、delta和delta_error;
[0023]B2、所述數(shù)據(jù)匯總單元判斷元素e是否有計(jì)數(shù)器對(duì)其進(jìn)行計(jì)數(shù);
[0024]如果元素e有計(jì)數(shù)器對(duì)其進(jìn)行計(jì)數(shù),就增加對(duì)應(yīng)元素e的計(jì)數(shù)器的計(jì)數(shù)值和誤差值,然后執(zhí)彳丁步驟B3;
[0025]如果元素e沒有計(jì)數(shù)器對(duì)其進(jìn)行計(jì)數(shù),判斷系統(tǒng)中所有的計(jì)數(shù)器個(gè)數(shù)是否達(dá)到上限;
[0026]如果系統(tǒng)中所有的計(jì)數(shù)器個(gè)數(shù)沒有達(dá)到上限,初始化一個(gè)新的計(jì)數(shù)器來對(duì)元素e進(jìn)行計(jì)數(shù),然后執(zhí)行步驟B3;
[0027]如果系統(tǒng)中所有的計(jì)數(shù)器個(gè)數(shù)達(dá)到上限,就找到系統(tǒng)中計(jì)數(shù)值最小的計(jì)數(shù)器,然后用元素e把這個(gè)計(jì)數(shù)器中的元素替換掉,接著把計(jì)數(shù)誤差的值設(shè)置為當(dāng)前的計(jì)數(shù)值,最后根據(jù)del ta值增加計(jì)數(shù)值;然后執(zhí)行步驟B3;
[0028]B3、更新計(jì)數(shù)器鏈表結(jié)構(gòu),并判斷是否達(dá)到輸出結(jié)果條件,如果達(dá)到條件則輸出所有計(jì)數(shù)器的結(jié)果,否則在接收到新的元素后返回執(zhí)行步驟BI。
[0029]較佳的,所述更新計(jì)數(shù)器鏈表結(jié)構(gòu)按以下步驟進(jìn)行:
[0030]Cl、當(dāng)計(jì)數(shù)器的計(jì)數(shù)值增加時(shí),首先把該計(jì)數(shù)器從該桶指向的計(jì)數(shù)器鏈表中分離出來;
[0031]C2、判斷該桶下是否還有計(jì)數(shù)器;如果沒有計(jì)數(shù)器了,把該桶從桶列表中分離出來,然后刪除,然后執(zhí)行步驟C3;如果還有計(jì)數(shù)器,則直接執(zhí)行步驟C3;
[0032]C3、查找有沒有桶號(hào)等于該計(jì)數(shù)器增加后的計(jì)數(shù)值的桶:如果有,則把這個(gè)計(jì)數(shù)器插入到這個(gè)桶指向的計(jì)數(shù)器鏈表中,操作結(jié)束;如果沒有,則為該計(jì)數(shù)器新建一個(gè)桶號(hào)等于其計(jì)數(shù)值的桶,然后把這個(gè)計(jì)數(shù)器加入到這個(gè)桶指向的計(jì)數(shù)器鏈表中,然后執(zhí)行步驟C4;
[0033]C4、按照桶號(hào)確定該桶要插入的位置,插入到桶鏈表中;
[0034]所述桶為計(jì)數(shù)值,所述桶號(hào)為計(jì)數(shù)值的大小。
[0035]較佳的,還包括數(shù)據(jù)合并單元匯總數(shù)據(jù)處理子單元數(shù)據(jù)的步驟:
[0036]Dl、所述數(shù)據(jù)合并單元收到來自數(shù)據(jù)處理子單元的消息,包含元素e、delta和delta_error的值;
[0037]D2、所述數(shù)據(jù)合并單元判斷元素e是否有計(jì)數(shù)器對(duì)其進(jìn)行計(jì)數(shù);
[0038]如果元素e有計(jì)數(shù)器對(duì)其進(jìn)行計(jì)數(shù),就增加對(duì)應(yīng)元素e的計(jì)數(shù)器的計(jì)數(shù)值、誤差值和delta變量,然后執(zhí)行步驟D3;
[0039]如果元素e沒有計(jì)數(shù)器對(duì)其進(jìn)行計(jì)數(shù),判斷系統(tǒng)中所有的計(jì)數(shù)器個(gè)數(shù)是否達(dá)到上限;
[0040]如果系統(tǒng)中所有的計(jì)數(shù)器個(gè)數(shù)沒有達(dá)到上限,初始化一個(gè)新的計(jì)數(shù)器來對(duì)元素e進(jìn)行計(jì)數(shù),然后執(zhí)行步驟D3;
[0041]如果系統(tǒng)中所有的計(jì)數(shù)器個(gè)數(shù)達(dá)到上限,就找到系統(tǒng)中計(jì)數(shù)值最小的計(jì)數(shù)器,然后用元素e把這個(gè)計(jì)數(shù)器中的元素替換掉,接著把計(jì)數(shù)誤差的值設(shè)置為當(dāng)前的計(jì)數(shù)值,設(shè)置該計(jì)數(shù)器中的del ta_error變量等于該計(jì)數(shù)器中的delta,然后增加對(duì)應(yīng)計(jì)數(shù)器的delta變量和計(jì)數(shù)值,然后執(zhí)行步驟D3;
[0042]D3、更新計(jì)數(shù)器鏈表結(jié)構(gòu),判斷delta是否達(dá)到發(fā)送閾值threshold,如果達(dá)到則向數(shù)據(jù)匯總單元發(fā)送該計(jì)數(shù)器的元素e、delta和del ta_error的值,然后把delta和del ta_error變量清零;否則在接收到新的元素后返回執(zhí)行步驟Dl。
[0043]較佳的,所述數(shù)據(jù)處理子單元通過哈希表結(jié)構(gòu)數(shù)據(jù)處理子單元檢查是否有計(jì)數(shù)器對(duì)e進(jìn)行計(jì)數(shù);所述數(shù)據(jù)匯總單元通過哈希表結(jié)構(gòu)判斷元素e是否有計(jì)數(shù)器對(duì)其進(jìn)行計(jì)數(shù);所述數(shù)據(jù)合并單元通過哈希表結(jié)構(gòu)判斷元素e是否有計(jì)數(shù)器對(duì)其進(jìn)行計(jì)數(shù)。
[0044]本發(fā)明所要解決的另一技術(shù)問題是提供一種并行度更大、擴(kuò)展性更高,能夠在很大程度上提高總的吞吐量的頻數(shù)統(tǒng)計(jì)系統(tǒng)。
[0045]為實(shí)現(xiàn)上述目的,本發(fā)明提供了一種快速統(tǒng)計(jì)頻數(shù)的系統(tǒng),包括2個(gè)以上并行的數(shù)據(jù)處理子單元和數(shù)據(jù)匯總單元;
[0046]所述數(shù)據(jù)處理子單元用于并行地進(jìn)行頻數(shù)統(tǒng)計(jì);
[0047]所述數(shù)據(jù)匯總單元用于統(tǒng)計(jì)數(shù)據(jù)處理子單元發(fā)來的增量;
[0048]并行的數(shù)據(jù)流輸入各數(shù)據(jù)處理子單元,經(jīng)過數(shù)據(jù)處理子單元處理后將處理結(jié)果發(fā)送給數(shù)據(jù)匯總單元,由數(shù)據(jù)匯總單元統(tǒng)計(jì)各數(shù)據(jù)處理子單元發(fā)來的增量并輸出結(jié)果。
[0049]較佳的,還包括數(shù)據(jù)合并單元;
[0050]所述數(shù)據(jù)合并單元用于匯總數(shù)據(jù)處理子單元的數(shù)據(jù)并將其輸出給所述數(shù)據(jù)匯總單元。
[0051]較佳的,所述數(shù)據(jù)處理子單元包括一個(gè)以上計(jì)數(shù)器;計(jì)數(shù)器按計(jì)數(shù)值從大到小的鏈表方式排列。
[0052]較佳的,所述數(shù)據(jù)處理子單元收到元素e后通過哈希表結(jié)構(gòu)檢查是否有計(jì)數(shù)器對(duì)e進(jìn)行計(jì)數(shù);
[0053]如果e有對(duì)應(yīng)的計(jì)數(shù)器對(duì)其進(jìn)行計(jì)數(shù),那么就增加對(duì)應(yīng)計(jì)數(shù)器的delta變量和計(jì)數(shù)值,然后更新計(jì)數(shù)器鏈表結(jié)構(gòu),當(dāng)delta達(dá)到發(fā)送閾值threshold時(shí)向數(shù)據(jù)匯總單元發(fā)送該計(jì)數(shù)器的元素e、delta和del ta_error的值,然后把de I ta和de I ta_error變量清零;
[0054]如果e沒有對(duì)應(yīng)的計(jì)數(shù)器對(duì)其進(jìn)行計(jì)數(shù),判斷系統(tǒng)中所有的計(jì)數(shù)器個(gè)數(shù)是否達(dá)到上限;
[0055]如果系統(tǒng)中所有的計(jì)數(shù)器個(gè)數(shù)沒有達(dá)到上限,則初始化一個(gè)新的計(jì)數(shù)器來對(duì)這個(gè)元素計(jì)數(shù),然后更新計(jì)數(shù)器鏈表結(jié)構(gòu),當(dāng)de I ta達(dá)到發(fā)送閾值thr e sho I d時(shí)向數(shù)據(jù)匯總單元發(fā)送該計(jì)數(shù)器的元素e、delta和delta_error的值,然后把delta