專利名稱:實時海量數(shù)據(jù)索引建立方法及系統(tǒng)的制作方法
技術領域:
本發(fā)明涉及數(shù)據(jù)處理技術,具體涉及一種實時海量數(shù)據(jù)索引建立方法及系統(tǒng)。
背景技術:
在信息時代,數(shù)據(jù)的處理在很多時候都需要按照指定的關鍵字查找出相關內容, 例如,通過搜索引擎,只要輸入關鍵字,即可查詢得到與該關鍵字相關的內容。再例如,對數(shù)據(jù)庫進行查詢,可以按照某個字段查詢得到該字段的全部數(shù)據(jù)。傳統(tǒng)數(shù)據(jù)庫的查詢是通過在數(shù)據(jù)庫中建立的索引來完成的。
在某些應用環(huán)境下,需要記錄的數(shù)據(jù)量是實時變化的,針對這種情況,通常的做法是建立不同粒度的索引,比如,每分鐘建立一次“分鐘索引數(shù)據(jù)”,每小時將所有“分鐘索引數(shù)據(jù)”重新處理,建立“小時索引數(shù)據(jù)”,每天將“小時索引數(shù)據(jù)”重新處理,建立“天索引數(shù)據(jù)”,每周將“天索引數(shù)據(jù)”重新處理,建立“周索引數(shù)據(jù)”,每月將“周索引數(shù)據(jù)”重新處理,建立“月索引數(shù)據(jù)”。在上述每種索引數(shù)據(jù)中,均包括兩種數(shù)據(jù)數(shù)據(jù)文件和索引記錄。其中, “月索引數(shù)據(jù)”作為最終的索引數(shù)據(jù)。數(shù)據(jù)文件為實時記錄的數(shù)據(jù),通常為磁盤上的文件,而索引記錄則是放在數(shù)據(jù)庫中。在進行數(shù)據(jù)查詢時,需要從索引記錄中讀取每個要查詢的關鍵字(比如手機號)在上述各粒度的數(shù)據(jù)文件中的位置信息,根據(jù)該位置信息打開多個數(shù)據(jù)文件,定位到每個數(shù)據(jù)文件的開始位置,讀取該數(shù)據(jù)文件,并對讀取的數(shù)據(jù)解壓縮后匹配得到與該查詢關鍵字相關的所有記錄。
上述這種方案中,對于每一條記錄,建立到最終的“月索引數(shù)據(jù)”都需要進行多次的處理,不僅效率低,而且,每一次處理都需要先將數(shù)據(jù)從小粒度的數(shù)據(jù)文件中讀出,然后再將其寫入大粒度的數(shù)據(jù)文件中,這無疑會消耗過多的CPU使用時間并增加了磁盤的負荷。另外,在查詢時,需要讀取多個文件,讀取的數(shù)據(jù)量大,導致解壓縮很慢,不能滿足快速查詢的需求。
發(fā)明內容
本發(fā)明實施例一方面提供一種實時海量數(shù)據(jù)索引建立方法及系統(tǒng),以實現(xiàn)快速、 高效地建立索引,滿足快速查詢的需求。
為此,本發(fā)明實施例提供如下技術方案 —種實時海量數(shù)據(jù)索引建立方法,包括 將實時產(chǎn)生的數(shù)據(jù)記錄以追加方式寫入到第一內存中; 定時將所述第一內存中存儲的數(shù)據(jù)寫入到歷史數(shù)據(jù)文件中,并在第二內存中建立所述歷史數(shù)據(jù)文件的索引。
一種實時海量數(shù)據(jù)索引建立系統(tǒng),包括 記錄單元,用于將實時產(chǎn)生的數(shù)據(jù)記錄以追加方式寫入到第一內存中; 文件寫入單元,用于定時將所述第一內存中存儲的數(shù)據(jù)寫入到歷史數(shù)據(jù)文件中; 索引建立單元,用于在第二內存中建立所述歷史數(shù)據(jù)文件的索引。
本發(fā)明實施例實時海量數(shù)據(jù)索引建立方法及系統(tǒng),將實時產(chǎn)生的數(shù)據(jù)記錄以追加方式寫入到第一內存中;定時將所述第一內存中存儲的數(shù)據(jù)以追加方式寫入到歷史數(shù)據(jù)文件中,并在第二內存中建立與寫入到歷史數(shù)據(jù)文件中的數(shù)據(jù)相對應的索引,也就是說,通過對第一內存中的數(shù)據(jù)進行一次處理(即兩次壓縮、一次解壓縮)即可生成最終的索引數(shù)據(jù), 完成建立索引的整個過程,因此速度快、效率高;而且,由于減少了對數(shù)據(jù)文件的讀寫操作, 因此大大降低了對CPU資源的消耗及磁盤的負荷。
為了更清楚地說明本申請實施例或現(xiàn)有技術中的技術方案,下面將對實施例或現(xiàn)有技術描述中所需要使用的附圖作簡單地介紹,顯而易見地,下面描述中的附圖僅僅是本申請中記載的一些實施例,對于本領域普通技術人員來講,還可以根據(jù)這些附圖獲得其他的附圖。
圖1是本發(fā)明實施例實時海量數(shù)據(jù)索引建立方法的流程圖; 圖2是本發(fā)明實施例中第一內存中緩沖區(qū)的一種數(shù)組結構示意圖; 圖3是本發(fā)明實施例中第二內存的中的索引與歷史數(shù)據(jù)文件的關系; 圖4是本發(fā)明實施例中進行數(shù)據(jù)查詢的流程圖; 圖5是本發(fā)明實施例實時海量數(shù)據(jù)索引建立系統(tǒng)的一種結構示意圖; 圖6是本發(fā)明實施例實時海量數(shù)據(jù)索引建立系統(tǒng)的另一種結構示意圖。
具體實施例方式為了使本技術領域的人員更好地理解本發(fā)明方案,下面結合附圖和實施方式對本發(fā)明實施例作進一步的詳細說明。
本發(fā)明實施例實時海量數(shù)據(jù)索引建立方法及系統(tǒng),將實時產(chǎn)生的數(shù)據(jù)記錄以追加方式寫入到第一內存中;定時將所述第一內存中存儲的數(shù)據(jù)以追加方式寫入到歷史數(shù)據(jù)文件中,并在第二內存中建立與寫入到歷史數(shù)據(jù)文件中的數(shù)據(jù)相對應的索引。
如圖1所示,是本發(fā)明實施例實時海量數(shù)據(jù)索引建立方法的流程圖,包括 步驟101,將實時產(chǎn)生的數(shù)據(jù)記錄以追加方式寫入到第一內存中。
上述數(shù)據(jù)記錄可以是文件形式的記錄,每個文件包括至少一條記錄,每條記錄的長度為不定長。
上述第一內存可以包括多個緩沖區(qū),比如設為37個緩沖區(qū)。
為了方便后續(xù)對第一內存中數(shù)據(jù)的處理,可以將各緩沖區(qū)設為數(shù)組結構,并且各緩沖區(qū)的數(shù)組結構相同。
在實際應用中,各緩沖區(qū)的數(shù)組結構可以根據(jù)實際的數(shù)據(jù)記錄的需要來設計,比如,上述緩沖區(qū)的一種數(shù)組結構可以設計為如圖2所示,包括頭部(Head)、HaSh字段、和擴展字段(記為Data段)。其中,Hash字段包括多個子塊= 1,2,. . .),Data段中也包括多個子塊DiG = 1,2,...)。Hash字段中的各子塊大小相同,Data段中的各子塊大小相同,但Hash字段中子塊的大小與Data段中子塊的大小可以相同,也可以不同。
需要說明的是,上述Data段是對Hash字段的擴展,在Hash字段中的某個子塊如 H3寫滿后,可以選擇Data段中的一個空閑子塊如D2與H3連接,實現(xiàn)對H3的存儲空間進行擴展,滿足存儲實時產(chǎn)生的數(shù)據(jù)記錄的空間需求。當然,上述Data段不是必須的,如果Hash 字段的存儲空間足夠,也可以不用設置上述Data段。
上述頭部可以包括以下信息 a.數(shù)據(jù)段中使用的Data段個數(shù),記為usecLtotal,初始值為0 ; b.釋放掉的Data段的個數(shù),記為deletejsed,初始值為0 ; c.釋放掉的Data段的下標,為數(shù)組結構,記為deletejndex []; d.該緩沖區(qū)在第一內存中的下標,記為memjndex。
當然,上述圖2的結構僅是一種示例,在實際應用中,還可以采用其他形式的數(shù)組結構,對此本發(fā)明實施例不做限定。
在將實時產(chǎn)生的數(shù)據(jù)記錄以追加方式寫入到第一內存中時,需要遍歷所述數(shù)據(jù)記錄中的每一條記錄,對每一條記錄進行以下處理 (1)根據(jù)記錄中的關鍵字確定該記錄需要寫入的緩沖區(qū)的序號以及在該緩沖區(qū)中 Hash字段的子塊序號; (2)將該記錄寫入確定的緩沖區(qū)中Hash字段的子塊中,并更新頭部信息。
下面以圖2所示形式的緩沖區(qū)結構為例,進一步詳細說明將實時產(chǎn)生的數(shù)據(jù)記錄以追加方式寫入到第一內存中的過程。
假設上述數(shù)據(jù)記錄是文件,Hash字段包含的子塊個數(shù)為H,Data段包含的子塊個數(shù)為D。
每一個Ri和Di的結構為 [mem_block_head] [M1] [M2] [· · · ] [Mi]; 其中,mem_bl0Ck_head為氏或Di的頭部,包括以下信息 (1)已經(jīng)使用的內存大小,記為usejen ; (2)與氏相連的Di的信息,記為next_di。
每一個Mi的結構為 [mem_sub_block_head] [S1] [S2] [· . . ] [Si]; 其中,mem_sub_block_head為Mi的頭部,包括以下信息 (1)是否為壓縮,記為mi_z_f lag ; (2)所在的Mi塊大小或長度,記為mi_len ; (3)關鍵字(即key)的標志,記為mi_key_flag ; 其中,Mi中的Si為壓縮或未壓縮的數(shù)據(jù)。
每一個 Si 由 mem_sub_block_record_head 力口上一條記錄組成,mem_sub_block_ record_head包括以下信息 (1)關鍵字在記錄中的開始位置; (2)關鍵字在記錄中的長度; (3)記錄長度; (4)年月,即該記錄屬于哪個月。
對于上述數(shù)據(jù)記錄文件,需要遍歷文件中的每一條記錄,為了描述方便,將該記錄記為(key,value),對每一條記錄進行以下處理 1.計算r_crc32(key),對n(n為第一內存中緩沖區(qū)的個數(shù))取余,得到χ = r_crc32 (key) % η,則將這條記錄放到第χ塊緩沖區(qū)中; 2.對于第χ塊緩沖區(qū),取y = crc32 (key) % H,放到Hash字段中的第y個子塊中, 即放到Ry中; 3.如果Ry已經(jīng)寫滿,則將Ry中的數(shù)據(jù)壓縮后繼續(xù)寫;如果Ry已經(jīng)無法壓縮,則在 Data段中選擇一個空閑的子塊Dj,將Ry與Dj相連,然后將記錄寫到Dj中。
剛開始時,Ry中沒有數(shù)據(jù),因此,直接增加一個mem_bl0Ck_head和一個Mi (即M1) 即可,并且M1中只有S1,當記錄增加到很多時,Ry已經(jīng)寫滿的情況下,將禮中的Si全部壓縮, 并修改mem_Sub_bl0Ck_head中的標志和大小,然后再創(chuàng)建一個M2,將記錄存放到M2中,直到Ry再次寫滿。Ry再次寫滿后,將M2中的Si全部壓縮,然后再創(chuàng)建一個M3??梢姡恳粭l記錄放到內存中,只需要壓縮一次即可。假如Ry已經(jīng)寫滿并且Ry中的數(shù)據(jù)已無法再壓縮, 也就是說,Ry中的所有虬中都已經(jīng)是壓縮后的數(shù)據(jù),那么從Data段獲取一個空閑的Dj,將 Ry與Dj相連,然后將記錄寫到Dj中。
需要說明的是,將記錄寫到Dj的方式及過程與將記錄寫到Ry的方式及過程相同, 在此不再贅述。
可以按照以下方式獲取一個新的Dj 如果memjiead中的deletejsed大于0,則j =delete_index[delete_used_l],同時 delete_used 減 1 ;否則,j = used_total,并且將 used_total 本身力口 1。
當連續(xù)獲取的空閑Dj超過一定數(shù)量(比如10個)時,則將Ry及這些Dj輸出到文件系統(tǒng),清空Ry并釋放掉這些Dj。
在清空民時,可以采用將mem_block_head中的use_len改為0的方式。在釋放Dj 時,可以采用將j賦給delete_index[delete_used],并且delete_used本身加1的方式。
在上述示例中,根據(jù)記錄中的關鍵字確定該記錄需要寫入的緩沖區(qū)的序號以及在該緩沖區(qū)中Hash字段的子塊序號時分別采用了 r_crc32算法和crc32算法。其中,crc32 算法是一個數(shù)學函數(shù),輸入是一個字符串,輸出是一個整數(shù),該函數(shù)的特點是經(jīng)過了數(shù)學的嚴格計算,對于少量輸入的不同字符串來說,輸出的整數(shù)都不一樣。r_crc32可以稱之為反 crc32算法,輸入是一個字符串,輸出是一個正整數(shù),方法是將輸入的字符串展開成二進制序列L,將L中的每個比特取反,即0變成1,1變成0,得到新的串 L,然后再由crc32計算得到一個正整數(shù),即r_crc32 (L) = crc32 ( L)。
需要說明的是,在實際應用中,還可以采用其他算法,比如直接將key對n、H取余, 即χ = key% n,y = key% H,對此本發(fā)明實施例不做限定。
另外,本發(fā)明實施例中在Data段選擇空閑子塊的方式也不僅限于上述示例中描述的算法,還可以采用其他算法,在此不再一一舉例。
步驟102,定時將所述第一內存中存儲的數(shù)據(jù)寫入到歷史數(shù)據(jù)文件中,并在第二內存中建立所述歷史數(shù)據(jù)文件的索引。
由于內存為有限資源,當存儲的數(shù)據(jù)達到一定量的時候,需要將這些數(shù)據(jù)一次性地寫入到歷史數(shù)據(jù)文件中,以減少對內存資源的占用。
在本發(fā)明實施例中,可以根據(jù)實時產(chǎn)生的數(shù)據(jù)記錄的多少來設定上述第一內存的大小,比如可以將其設為存放一天的數(shù)據(jù)量。
相應地,可以每天將第一內存中存儲的數(shù)據(jù)一次性地寫入到歷史數(shù)據(jù)文件中,并在第二內存中建立所述歷史數(shù)據(jù)文件的索引。另外,為了避免意外故障使第二內存中緩存的索引丟失,還可以定時將所述歷史數(shù)據(jù)文件的索引備份到歷史索引文件中。
上述歷史數(shù)據(jù)文件可以是一個包含多個文件的文件夾,比如將該文件夾命名為 mem_index0由于每塊內存中的數(shù)據(jù)均可能為不同月份的記錄,因此輸出時將其按月份輸出到相應的月份文件中,比如,輸出的文件名的格式為yyyymm. mem_index. flag,其中,yyyymm 表示年月,mem_index為0 n_l的數(shù)字,flag為“data”或“ index”,其中,“data”表示數(shù)據(jù)文件,“ index”表示索引文件。
假設第一內存中包括η個緩沖區(qū),則可以利用多個進程將第一內存中存儲的數(shù)據(jù)寫入到歷史數(shù)據(jù)文件中。具體地,可以將每個緩沖區(qū)中存儲的數(shù)據(jù)寫入到一個或多個對應編號的文件中。例如,將第0個緩沖區(qū)中的數(shù)據(jù)輸出到某個月的第0個數(shù)據(jù)文件中,具體是哪個月,要看第0個緩沖區(qū)中的數(shù)據(jù)而定,該緩沖區(qū)中包括了哪些月份的數(shù)據(jù)就會輸出到哪些月份的第0個文件中。比如,第0個緩沖區(qū)中的數(shù)據(jù)分別包含了 2011年5月份的數(shù)據(jù)和2011年4月份的數(shù)據(jù),則將2011年5月份的數(shù)據(jù)追加寫到文件201105. data. 0中,將 2011年4月份的數(shù)據(jù)追加寫到文件201104. data. 0中。這樣,文件數(shù)量大大減少,每個月只有n(比如取η < 100)個文件,因此,即使對于一年記錄的數(shù)據(jù)來說,整個系統(tǒng)也只有數(shù)百計的文件數(shù),比起現(xiàn)有技術方案中的以千萬計的文件數(shù),少了 5個數(shù)量級(十萬分之一),因此大大降低了文件I/O操作,提高系統(tǒng)性能及效率。
對于每一個緩沖區(qū)的具體處理過程如下 遍歷該緩沖區(qū)中Hash字段中的每個子塊氏,處理每一個氏及該氏中next_di指向的所有Di ; 對每一個氏的處理方法是 (1)全部解壓縮氏及該氏中neXt_di指向的所有Di,將解壓縮后的數(shù)據(jù)記為T ; (2)將T按預設索引粒度(比如按照月份)分為多份,記為T(j),其中j = 1, (3)將每份數(shù)據(jù)T (j)作為一個獨立的數(shù)據(jù)塊寫入到相應的歷史數(shù)據(jù)文件中,并在第二內存中生成對應每份數(shù)據(jù)的索引。
具體地,可以首先對每一個T (j)進行壓縮,記為Z (j),并生成對應的history, index結構,記為HI (j),并且該HI (j)包括以下信息 (1)文件的位置,記為filejndex ; (2)原數(shù)據(jù)大小,記為old_siZe,方便實施時動態(tài)分配內存進行處理; (3)壓縮后的大小,記為out_len。
然后,將Z(j)直接寫到相應的歷史數(shù)據(jù)文件中,并將HI (j)添加到第二內存中。
需要說明的是,在解壓縮Ri和Di時,由于Ri和Di中的每個Mi是單獨壓縮的,因此, 在解壓時也需要對氏和Di中的每個Mi單獨解壓縮。
另外,在將每份數(shù)據(jù)作為一個獨立的數(shù)據(jù)塊寫入到相應的歷史數(shù)據(jù)文件中時,可以先對每份數(shù)據(jù)進行壓縮,然后再將其寫入到所述歷史數(shù)據(jù)文件中。
在實際應用中,考慮到數(shù)據(jù)記錄中關鍵字(key)分布的不均勻性,還可以對上述 T(J)做進一步的處理,具體處理如下 將T(j)包含的數(shù)據(jù)按預設規(guī)則分成F份,比如,取F = 5。本發(fā)明實施例并不限定F的取值,只是后面將以F = 5為例進行描述。每個T(j)對應一個historyjndex結構,該 history_index結構包括以下信息 (1)文件的位置,記為filejndex ; (2)原數(shù)據(jù)大小,記為old_siZe[Fi],F(xiàn)i = 0. .4,方便實施時動態(tài)分配內存進行處理; (3)壓縮后的大小,記為 out_len[Fi],F(xiàn)i = 0. . 4 ; (4)填寫規(guī)則,記為rule ; (5)標志,記為hi_flag[Fi],F(xiàn)i = 0. . 4。該標志是一個無符號的32位整數(shù),用于存放一個crc32值,或是存放多個標志,由于是32位整數(shù),因此可存放32個標志。
對于每一個T (j),均生成一個historyjndex結構,該結構如何填寫由上述填寫規(guī)則rule決定,比如,上述填寫規(guī)則如下表1所示。
表 1
權利要求
1.一種實時海量數(shù)據(jù)索引建立方法,其特征在于,包括 將實時產(chǎn)生的數(shù)據(jù)記錄以追加方式寫入到第一內存中;定時將所述第一內存中存儲的數(shù)據(jù)寫入到歷史數(shù)據(jù)文件中,并在第二內存中建立所述歷史數(shù)據(jù)文件的索引。
2.根據(jù)權利要求1所述的方法,其特征在于,所述數(shù)據(jù)記錄為文件形式,所述文件包括至少一條記錄,每條記錄的長度為不定長。
3.根據(jù)權利要求1所述的方法,其特征在于,所述第一內存包括多個緩沖區(qū),所述緩沖區(qū)為數(shù)組結構,并且各緩沖區(qū)的數(shù)組結構相同;所述緩沖區(qū)包括頭部和Hash字段,所述 Hash字段包括大小相同的多個子塊;所述將實時產(chǎn)生的數(shù)據(jù)記錄以追加方式寫入到第一內存中包括 遍歷所述數(shù)據(jù)記錄中的每一條記錄,對每一條記錄進行以下處理 根據(jù)所述記錄中的關鍵字確定所述記錄需要寫入的緩沖區(qū)的序號以及在該緩沖區(qū)中 Hash字段的子塊序號;將所述記錄寫入確定的緩沖區(qū)中Hash字段的子塊中,并更新頭部信息。
4.根據(jù)權利要求3所述的方法,其特征在于,所述緩沖區(qū)還包括擴展字段,所述擴展字段包括多個大小相同的子塊;所述方法還包括在將所述記錄寫入Hash字段中的子塊時,如果所述子塊已寫滿,則先將所述子塊中的數(shù)據(jù)壓縮,然后再將所述記錄寫入所述子塊;如果所述子塊中的數(shù)據(jù)已經(jīng)無法壓縮,則在所述擴展字段中選擇一個空閑子塊,并將所述Hash字段中的子塊與所述擴展字段中的空閑子塊相連,然后將所述記錄寫入選擇的空閑子塊中。
5.根據(jù)權利要求4所述的方法,其特征在于,所述方法還包括如果與所述Hash字段中的子塊相連的擴展字段中子塊的數(shù)量超過設定值,則將所述 Hash字段中的子塊及與其相連的擴展字段中的子塊輸出到所述歷史數(shù)據(jù)文件中,并在第二內存中建立所述歷史數(shù)據(jù)文件的索引;然后,清空所述Hash字段中的子塊并釋放掉與其相連的擴展字段中的子塊。
6.根據(jù)權利要求4或5所述的方法,其特征在于,所述定時將所述第一內存中存儲的數(shù)據(jù)寫入到歷史數(shù)據(jù)文件中,并在第二內存中建立所述歷史數(shù)據(jù)文件的索引包括對所述第一內存中的每一個緩沖區(qū)進行如下處理 遍歷所述緩沖區(qū)中Hash字段中的每個子塊;解壓縮所述Hash字段中的子塊及與該子塊相連的擴展字段中的子塊; 將解壓縮后的數(shù)據(jù)按預設索引粒度劃分為多份,每份數(shù)據(jù)作為一個獨立的文件寫入到所述歷史數(shù)據(jù)文件中,并在所述第二內存中生成對應每份數(shù)據(jù)的索引。
7.根據(jù)權利要求1所述的方法,其特征在于,所述方法還包括 定時將所述歷史數(shù)據(jù)文件的索引備份到歷史索引文件中。
8.根據(jù)權利要求4所述的方法,其特征在于,還包括當需要查詢時,根據(jù)查詢關鍵字確定需要查詢的數(shù)據(jù)在所述第一內存中所在的緩沖區(qū)及所述緩沖區(qū)中Hash字段的子塊;根據(jù)所述緩沖區(qū)中Hash字段的子塊中的信息,確定與該子塊相連的擴展字段中的子塊;遍歷所述緩沖區(qū)中Hash字段的子塊及與該子塊相連的擴展字段中的子塊,得到這些子塊中與所述關鍵字相對應的記錄;根據(jù)所述需要查詢的數(shù)據(jù)在所述第一內存中所在的緩沖區(qū)的序號,查找第二內存,從所述第二內存中獲取與所述關鍵字相關的所有歷史索引;根據(jù)所述所有歷史索引查找所述歷史數(shù)據(jù)文件,獲得與所述關鍵字相對應的記錄。
9.一種實時海量數(shù)據(jù)索引建立系統(tǒng),其特征在于,包括記錄單元,用于將實時產(chǎn)生的數(shù)據(jù)記錄以追加方式寫入到第一內存中; 文件寫入單元,用于定時將所述第一內存中存儲的數(shù)據(jù)寫入到歷史數(shù)據(jù)文件中; 索引建立單元,用于在第二內存中建立所述歷史數(shù)據(jù)文件的索引。
10.根據(jù)權利要求9所述的系統(tǒng),其特征在于,所述第一內存包括多個緩沖區(qū),所述緩沖區(qū)為數(shù)組結構,并且各緩沖區(qū)的數(shù)組結構相同;所述緩沖區(qū)包括頭部和Hash字段,所述 Hash字段包括大小相同的多個子塊;所述記錄單元包括第一遍歷子單元,用于遍歷所述數(shù)據(jù)記錄中的每一條記錄;子塊確定子單元,用于對所述第一遍歷子單元遍歷到的每一條記錄,根據(jù)所述記錄中的關鍵字確定所述記錄需要寫入的緩沖區(qū)的序號以及在該緩沖區(qū)中Hash字段的子塊序號;子塊寫入子單元,用于將所述記錄寫入確定的緩沖區(qū)中Hash字段的子塊中,并更新頭 R^f η 息。
11.根據(jù)權利要求10所述的系統(tǒng),其特征在于,所述緩沖區(qū)還包括擴展字段,所述擴展字段包括多個大小相同的子塊;所述記錄單元還包括壓縮子單元,用于在所述Hash字段中的子塊已寫滿時,將所述子塊中的數(shù)據(jù)壓縮 ’然后通知所述子塊寫入子單元將所述記錄寫入所述子塊;選擇子單元,用于在所述Hash字段中的子塊中的數(shù)據(jù)已經(jīng)無法壓縮時,在所述擴展字段中選擇一個空閑子塊,并將所述Hash字段中的子塊與所述擴展字段中的空閑子塊相連; 所述子塊寫入子單元,還用于將所述記錄寫入所述選擇子單元選擇的空閑子塊中。
12.根據(jù)權利要求11所述的系統(tǒng),其特征在于,所述系統(tǒng)還包括刷新單元,用于在與所述Hash字段中的子塊相連的擴展字段中子塊的數(shù)量超過設定值時,將所述Hash字段中的子塊及與其相連的擴展字段中的子塊輸出到所述歷史數(shù)據(jù)文件中,并在第二內存中建立所述歷史數(shù)據(jù)文件的索引,然后,清空所述Hash字段中的子塊并釋放掉與其相連的擴展字段中的子塊。
13.根據(jù)權利要求11或12所述的系統(tǒng),其特征在于, 所述文件寫入單元包括第二遍歷子單元,用于對所述第一內存中的每一個緩沖區(qū),遍歷所述緩沖區(qū)中Hash字段中的每個子塊;解壓縮子單元,用于解壓縮所述第二遍歷子單元遍歷到的Hash字段中的子塊及與該子塊相連的擴展字段中的子塊;劃分子單元,用于將解壓縮后的數(shù)據(jù)按預設索引粒度劃分為多份; 文件寫入子單元,用于將所述劃分子單元劃分出的每份數(shù)據(jù)作為一個獨立的文件寫入到所述歷史數(shù)據(jù)文件中;所述索引建立單元,具體用于在所述第二內存中生成對應每份數(shù)據(jù)的索引。
14.根據(jù)權利要求9所述的系統(tǒng),其特征在于,所述系統(tǒng)還包括備份單元,用于定時將所述歷史數(shù)據(jù)文件的索引備份到歷史索引文件中。
15.根據(jù)權利要求11所述的系統(tǒng),其特征在于,所述系統(tǒng)還包括 關鍵字輸入單元,用于輸入查詢關鍵字;緩沖區(qū)確定單元,用于根據(jù)查詢關鍵字確定需要查詢的數(shù)據(jù)在所述第一內存中所在的緩沖區(qū)及所述緩沖區(qū)中Hash字段的子塊;第一查詢單元,用于根據(jù)所述緩沖區(qū)中Hash字段的子塊中的信息,確定與該子塊相連的擴展字段中的子塊;遍歷所述緩沖區(qū)中Hash字段的子塊及與該子塊相連的擴展字段中的子塊,得到這些子塊中與所述關鍵字相對應的記錄;第二查詢單元,用于根據(jù)所述緩沖區(qū)確定單元確定的緩沖區(qū)的序號,查找第二內存,從所述第二內存中獲取與所述關鍵字相關的所有歷史索引;根據(jù)所述所有歷史索引查找所述歷史數(shù)據(jù)文件,獲得與所述關鍵字相對應的記錄。
全文摘要
本發(fā)明涉及數(shù)據(jù)處理技術,公開了一種實時海量數(shù)據(jù)索引建立方法及系統(tǒng)。該方法包括將實時產(chǎn)生的數(shù)據(jù)記錄以追加方式寫入到第一內存中;定時將所述第一內存中存儲的數(shù)據(jù)寫入到歷史數(shù)據(jù)文件中,并在第二內存中建立所述歷史數(shù)據(jù)文件的索引。利用本發(fā)明,可以實現(xiàn)快速、高效地建立索引,滿足快速查詢的需求。
文檔編號G06F17/30GK102207964SQ20111014480
公開日2011年10月5日 申請日期2011年5月31日 優(yōu)先權日2011年5月31日
發(fā)明者錢善海, 溫文全 申請人:廣州從興電子開發(fā)有限公司