專利名稱:一種內(nèi)存話單剔重方法
技術(shù)領(lǐng)域:
本發(fā)明涉及一種話單記錄的剔重方式,特別是在電信系統(tǒng)內(nèi)部解決海量級文件的內(nèi)存級排重的方法。
背景技術(shù):
隨著電信運營商不斷的發(fā)展,業(yè)務(wù)擴展越來越廣,各種新業(yè)務(wù)層出不窮;隨著資費的越來越便宜,用戶不斷的增長,同時用戶的通話量也逐年遞增,用戶的詳單量越來越大。 原有的剔重針越來越海量的數(shù)據(jù)話單,壓力越來越大,系統(tǒng)升級勢在必行。當前大多的電信運營商都采用以下幾種方式數(shù)據(jù)庫方式、內(nèi)存方式和文件系統(tǒng)方式,現(xiàn)有這些方法實現(xiàn)的剔重產(chǎn)品,在海量數(shù)據(jù)處理進或多或少在性能和IO方面有缺陷。數(shù)據(jù)庫方式數(shù)據(jù)庫剔重一般做法就是建一系列表,使用唯一索引或者主鍵進行唯一性的判定。這種策略最大的優(yōu)點就是開發(fā)比較容易,因為很多工作交給數(shù)據(jù)庫做了 ;缺點非常明顯,浪費空間,效率低下。因為數(shù)據(jù)庫中表數(shù)據(jù)和索引數(shù)據(jù)要占用雙份空間,就算表數(shù)據(jù)只有關(guān)鍵字段,也要浪費一倍的空間,因為寫雙份數(shù)據(jù),因此效率也就要低一倍。傳統(tǒng)文件系統(tǒng)方式在話單預(yù)處理過程中,每天建立一個重單檢查比較文件。對每條經(jīng)過預(yù)處理后生成的標準話單,取出字段(字符串),根據(jù)條件打開相應(yīng)的重單檢查文件, 利用HASH算法和匹配函數(shù)在重單檢查文件中進行快速查找,如果匹配成功,該話單屬于重單,則進行相應(yīng)的重單處理。如果匹配不成功,該活單不是重單,該話單中上述三個字符率添加到對應(yīng)的重單檢查文件中,用于對后續(xù)話單的重單檢查。為了減少HASH算法的匹配查找的時間,重單檢查文件也應(yīng)該越小越好。這種方法要在全文件中查找和性能和文件的大小相關(guān),話單量不大性能還可能,量大了 IO操作會加大對性能會有影響。純內(nèi)存方式將重單檢查文件放在內(nèi)存中運行,該方法不依賴數(shù)據(jù)庫所提供的功能,處理速度快,但是重單檢查文件數(shù)量較多,除了要占用一部分硬盤存儲資源以外,還需要系統(tǒng)有較大的內(nèi)存資源,在處理海量話單對主機內(nèi)存有比較嚴格要求。
發(fā)明內(nèi)容
本發(fā)明所要解決的技術(shù)問題是提供一種新的話單剔重方法,實現(xiàn)使用相對較小的內(nèi)存空間較快的進行話單剔重處理,并使得話單的剔重處理性能與話單的數(shù)據(jù)量無關(guān)。本發(fā)明解決上述技術(shù)問題的技術(shù)方案如下一種內(nèi)存話單剔重方法,包括如下步驟
步驟1 將話單文件讀入內(nèi)存;
步驟2 從所述話單文件中讀取一條話單記錄;
步驟3:根據(jù)所述話單記錄中的關(guān)鍵信息,找到內(nèi)存中與所述話單記錄相對應(yīng)的索引
表;
步驟4:對所述話單記錄中的字段內(nèi)容拼成一個字符串,并求MD5值作為該話單記錄的索引;步驟5 將所述MD5值插入到所述索引表中,若插入成功,則將所述話單記錄寫入正常話單文件中,若插入失敗,則將所述話單記錄寫入重單文件;
步驟6 重復(fù)步驟2至步驟5,直到遍歷完所述話單文件中的所有話單記錄。本發(fā)明的有益效果是在內(nèi)存中利用索引表并采用MD5值進行剔重,相比于傳統(tǒng)的數(shù)據(jù)庫方式和文件系統(tǒng)方式,本發(fā)明的速度更快;相比于傳統(tǒng)的純內(nèi)存方式,由于本發(fā)明采用了 MD5值的方式,無需對話單記錄中的每個字段內(nèi)容進行比較排重,節(jié)省了時間;采用直接將MD5值插入索引表中的方式進行剔重,比查詢比較的速度更快;本發(fā)明的方法,僅需要在內(nèi)存中與所述話單記錄相對應(yīng)的索引表進行操作,因此不必將所有的索引表全部載入內(nèi)存,對內(nèi)存的需求也比傳統(tǒng)的方式更低;本發(fā)明實現(xiàn)了使用相對較小的內(nèi)存空間較快的進行話單剔重處理,并使得話單的剔重處理性能與話單的數(shù)據(jù)量無關(guān)。在上述技術(shù)方案的基礎(chǔ)上,本發(fā)明還可以做如下改進。進一步,所述索引表采用T-tree索引。采用上述進一步方案的有益效果是,遍歷查找的速度快,該T-tree索引也是內(nèi)存數(shù)據(jù)庫中最主要的一種索引方式。進一步,所述話單記錄中的關(guān)鍵信息為號段和/或日期。采用上述進一步方案的有益效果是,采用號段和/或日期作為關(guān)鍵信息,可以對話單進行較好的分類,比如將某個號段的所有話單在某天的某個小時所有記錄放在一張表中,每天這個號段就有M張表,對應(yīng)的索引表也有M張,這樣將便于對記錄的管理、查找和
剔重等。進一步,所述索引表中僅有一個char (3 型字段,記錄有話單文件中的所有非重單記錄的MD5值。采用上述進一步方案的有益效果是,使得索引表的占用空間小,查詢速度快,加載卸載速度快,操作靈活。進一步,步驟3中,若內(nèi)存中不存在與所述話單記錄相對應(yīng)的索引表,則將所述索引表從其所保存的存儲器中加載到內(nèi)存中;若所述內(nèi)存和存儲器中均不存在與所述話單記錄相對應(yīng)的索引表,則在內(nèi)存中新建索引表作為與所述話單記錄相對應(yīng)的索引表。采用上述進一步方案的有益效果是,根據(jù)需要加載索引表,實現(xiàn)了對內(nèi)存占用的更好的控制,不必同時加載全部的索引表進行剔重,避免不必要的內(nèi)存空間的浪費。進一步,所述方法設(shè)有關(guān)于話單記錄處理條數(shù)或者話單記錄時間的限定值,當處理的話單記錄達到所述限定值時,對內(nèi)存中不常用的索引表進行卸載,并保存在指定的存儲器中。采用上述進一步方案的有益效果是,當處理了一批話單記錄之后,相應(yīng)會加載到內(nèi)存中一定數(shù)量的索引表,根據(jù)預(yù)設(shè)的條件進行定期的卸載,將不再使用或者使用很少的索引表進行卸載,僅保留熱數(shù)據(jù)的索引表(常用的索引表),卸載之后的索引表待需要時再加載到內(nèi)存中,保證了內(nèi)存使用的持續(xù)性,和使用的靈活性。
圖1為本發(fā)明的內(nèi)存話單剔重方法中索引表的管理方式示意框圖; 圖2為本發(fā)明內(nèi)存話單剔重方法的一種具體實施方式
流程圖;圖3為圖2所示流程采用的系統(tǒng)圖。
具體實施例方式以下結(jié)合附圖對本發(fā)明的原理和特征進行描述,所舉實例只用于解釋本發(fā)明,并非用于限定本發(fā)明的范圍。本發(fā)明的內(nèi)存話單剔重方法,包括如下步驟 步驟1 將話單文件讀入內(nèi)存;
步驟2 從所述話單文件中讀取一條話單記錄;
步驟3 根據(jù)所述話單記錄中的關(guān)鍵信息,找到內(nèi)存中與所述話單記錄相對應(yīng)的索引
表;
步驟4:對所述話單記錄中的字段內(nèi)容拼成一個字符串,并求MD5值作為該話單記錄的索引;
步驟5:將所述MD5值插入到所述索引表中,若插入成功,則將所述話單記錄寫入正常話單文件中,若插入失敗,則將所述話單記錄寫入重單文件;
步驟6 重復(fù)步驟2至步驟5,直到遍歷完所述話單文件中的所有話單記錄。其中的索引表采用T-tree索引,索引表中僅有一個char (3 型字段,記錄有話單文件中的所有非重單記錄的MD5值。話單記錄中的關(guān)鍵信息可以采用號段、日期相結(jié)合的方式,將不同的號段不同日期、時間產(chǎn)生的話單進行分類,以便于查找,當然根據(jù)需要也可以采用其他的話單內(nèi)容作為關(guān)鍵信息進行分類。本發(fā)明的內(nèi)存話單剔重方法設(shè)有關(guān)于話單記錄處理條數(shù)或者話單記錄時間的限定值,當處理的話單記錄達到所述限定值時,對內(nèi)存中不常用的索引表進行卸載,并保存在指定的存儲器中。在步驟3中,若內(nèi)存中不存在與所述話單記錄相對應(yīng)的索引表,則將所述索引表從其所保存的存儲器中加載到內(nèi)存中;若所述內(nèi)存和存儲器中均不存在與所述話單記錄相對應(yīng)的索引表,則在內(nèi)存中新建索引表作為與所述話單記錄相對應(yīng)的索引表。根據(jù)如上所述,本發(fā)明中對于索引表的管理采用如圖1的方式。圖1中,在內(nèi)存中設(shè)置加載區(qū),在其他存儲器上,如硬盤等,設(shè)置卸載區(qū),不使用的索引表放置于卸載區(qū)中, 當需要使用時,將所要使用的索引表加載到內(nèi)存中的加載區(qū)中進行使用。因為索引表采用下-廿擾索引,其中僅有一個保存1 5值的(^虹(3幻字段,并且根據(jù)號段以及日期進行了分類,因此每個索引表占用的空間都很小,這樣便于對索引表的加載和卸載,僅將與當前話單記錄相應(yīng)的索引表加載到內(nèi)存的加載區(qū)中,其他不使用的都在內(nèi)存中進行了卸載并保存在存儲器的卸載區(qū)中,從而保證了索引表對內(nèi)存的較少的占用,節(jié)約了內(nèi)存資源。如圖2所示,為使用本發(fā)明方法的一個具體流程,圖3為圖2所示流程采用的系統(tǒng)圖。該流程包括
1、程序從話單文件和數(shù)據(jù)庫中加載剔重配置信息。2、當1完成后確認是否有上次沒有處理完的話單文件(處理一半的話單文件), 即斷點文件,如果有從斷點文件中取得處理的文件名和處理的行數(shù),從記錄的處理行數(shù)開始處理;如果沒有斷點文件,直接往下走,到后繼流程。3、從程序入口得到話單文件,通過配置信息得到文件剔重類型 (1)追加索引(只往索引表中加索引信息,不生成出口)(2)不剔重(直接從程序入口移到程序出口,不在索引表中記錄索引)
(3)正常剔重文件,取話單文件中的每一條話單記錄,按配置信息生成索引表名如按號段和日期找到索引表(如果表不存在則從磁盤將表加載到內(nèi)存中),如果在插入時出現(xiàn)內(nèi)存不夠的情況,程序會運用LRU算法,將沒用的索引表卸載到磁盤,同時在卸載時寫斷點文件。4、將話單記錄所有的字段拼成一個長字符串,進行MD5值的計算,并插入到內(nèi)存索引表中,如果成功則表示此話單記錄不是重單,如果失敗并報重復(fù),則表示此記錄是重單,不是重單的話單輸出到出口,重單輸出到重單文件。5、處理完一個文件后寫處理日志,記錄這個文件所有記錄的處理的情況,如果有異常,則寫運行日志報詳細的錯誤信息。6、每到一個批次,即指定的時間,則將臨時目錄下的日志輸出到正式目錄,同時將內(nèi)存中沒用的索引表卸載。上述過程,按號段、日期(具體如何劃分是可配置的)在索引管理中創(chuàng)建若干張索引表(可能是1至2千張),采用T-Tree索引,每張索引表只有一個字段,為char (3 ,將話單的索引值的MD5字符串保留為表中的一條記錄。根據(jù)配置信息中配的剔重字段集合讀取話單中的剔重索引字段,拼成一個字符串后,求MD5值,然后插入相應(yīng)的內(nèi)存索引表,如果成功,則為正常話單,如果主鍵約束,則是重單。圖2所示的流程中,也保留追加索引功能和跳過不剔重功能,并且支持一個程序處理多個目錄的功能,支持處理異常時斷點恢復(fù)功能, 索引字段定制索引、索引條件定制,也支持多種格式話單剔重(ascii\ 二進制\split),采用快速內(nèi)存置換算法卸載一些內(nèi)存動態(tài)索引表,保留熱數(shù)據(jù)的內(nèi)存動態(tài)索引表。關(guān)于內(nèi)存控制問題
(1)為了避免使用過大內(nèi)存,需要動態(tài)控制內(nèi)存中表的數(shù)量,一般只將當天的數(shù)據(jù)加載到內(nèi)存即可,如果發(fā)現(xiàn)新來話單對應(yīng)的表不在內(nèi)存中,則將對應(yīng)表加載到內(nèi)存;如果發(fā)現(xiàn)內(nèi)存中的表數(shù)量已達到最大值,則卸載某些使用率較小的表。(2)由于實際生產(chǎn)中話單是時間連續(xù)的,所以加載表、卸載表頻繁發(fā)生的幾率不大,不會對效率產(chǎn)生大的影響。(3)內(nèi)存數(shù)據(jù)庫需要配合改造,增加“加載表”和“卸載表”的兩個功能。卸載表類似drop,區(qū)別是不刪除對應(yīng)目錄下的全量文件;
加載表在創(chuàng)建表的基礎(chǔ)上,將對應(yīng)目錄下的全量文件加載到內(nèi)存,并重建T-Tree索引。例如以四川一號主機20091011號一天的話單為例共有1240個號段,其中1038 個號段有記錄,單個號段最大記錄數(shù)為觀1519,最小記錄數(shù)為1,話單總數(shù)為1億,預(yù)計占用存儲為5. 5G,預(yù)計占用內(nèi)存為8G。關(guān)于效率問題
(1)內(nèi)存數(shù)據(jù)庫為剔重提供一個專用的insert函數(shù),繞開SQL解析,直接插入內(nèi)存,另外,事務(wù)采用不寫日志模式,(整文件)插入效率(含生成MD5碼)約為30000至50000條/ 秒。(2)需要優(yōu)化內(nèi)存表“加載卸載”切換策略,確保切換幾率不大。關(guān)于數(shù)據(jù)安全問題由于插入時,事務(wù)處于不寫日志模式,一旦內(nèi)存數(shù)據(jù)庫異?;蛘咧鳈C異常,重啟后,數(shù)據(jù)將丟失,因此需要安全性保障
(1)剔重每處理一個文件后,輸出正式話單,提交事務(wù),入口話單移入A目錄;
(2)剔重每隔一個批次(或者處理一批文件),執(zhí)行exp命令,將內(nèi)存數(shù)據(jù)完全落地到磁盤,并將磁盤上A目錄的話單文件移入B目錄;
(3)剔重重啟后,如果發(fā)現(xiàn)A目錄有文件,則將A目錄文件重新插入到內(nèi)存管理中,但不輸出任何文件,處理完后移入B目錄,目的是主加索引記錄;
(4)當一個文件處理到未完時,由于內(nèi)存不夠,發(fā)生索引表卸載時生成斷點文件,記錄斷點處理的行數(shù)、目錄、有效記錄數(shù)、錯單記錄數(shù)、重單記錄數(shù),重新啟動時處理此文件,直接跳到斷點記錄行處理,原有錯單和重單都保留。(5)多個進程都可能訪問到同一個索引表,內(nèi)存管理為此做了互斥操作,數(shù)據(jù)訪問安全,比較人性,能觀察到索引表的情況。本發(fā)明基于md5、內(nèi)存共享、動態(tài)T-tree索引表和快速內(nèi)存置換算法的內(nèi)存話單剔重,達到數(shù)據(jù)存儲使用空間和處理效率的雙贏結(jié)果,采用內(nèi)存動態(tài)表算法剔重,并通過快速內(nèi)存置換算法卸載一些內(nèi)存動態(tài)索引表,保留熱數(shù)據(jù)內(nèi)存動態(tài)表。本方法采用md5、內(nèi)存共享、動態(tài)T-tree索引表和快速內(nèi)存置換算法,具有高性能的處理能力,實現(xiàn)了處理性能與數(shù)據(jù)量無關(guān)。剔重信息在內(nèi)存中的存儲結(jié)構(gòu),具備共享和并發(fā)、時間窗等特征。剔重索引的實施方式借用數(shù)據(jù)庫中的概率,可以按手機號碼的前7位加上通話時間的年月日和小時來創(chuàng)建內(nèi)存表,同時用通話時間的小時來進行類似數(shù)據(jù)庫的表空間分區(qū),達到數(shù)據(jù)負載平衡。如表名為T_VC_1355227_2010072001表示手機號段為1355227的所有話單在2010-7-20,1點時所有話單放到此表中,同時將此表放在表空間為01的文件系統(tǒng)表空間上。這樣如果有1000個號段就會將這1000個號段分成M份,平分到M個設(shè)置的文件系統(tǒng)。剔重的過程為
(1)讀取一個話單文件;
(2)從該話單文件中讀取一條話單記錄;
(3)根據(jù)該記錄的手機號碼和時間定位到內(nèi)存管理中的索引表;
(4)如果該索引表不存在,則自動從卸載區(qū)加載所需索引表,如果卸載區(qū)也沒有索引表則新建索引表;
(5)將MD5完的索引插入,如果成功表示這條話單不是重單,如果不成功,則表示這條話單是重單,將該話單寫入重單文件;
(6)當處理的記錄數(shù)到達設(shè)置的上限值時,如1百萬條記錄,程序?qū)λ饕砀鶕?jù)最優(yōu)算法進行卸載操作;或到達指定的時間,將自動進行卸載操作,保留熱數(shù)據(jù)在內(nèi)存中。以下為采用本發(fā)明方法的配置文件信息,本文件配置的是進程運行時使用的基本信息,采用INI文件格式。[SYS_INF0] #日志目錄
LOGDIR=/tpt/mmdb/work/zhuoch/wbin/data/log [CONFIG]
IDXCTRL = /tpt/mmdb/work/zhuoch/wbin/cfg/IndexFields. cfg#### {可選項},當需要處理fedx話單時使用。即makefile中加入_D—USE_FEDX. #FEDX配置文件
FEDXCTRL = ${FEDX_CONFIG_PATH}/config. xml [CONTROL]
#{可選項}程序運行標識,默認weecLdup CTRLFLAG = weed_dup
#{可選項}程序啟停控制表,默認SyS_pr0C CNTTAB = sys_proc #{可選項}剔重表前綴。默認t_dup TABPRE = t_billl
#{可選項}內(nèi)存數(shù)據(jù)庫中表同時存在最大數(shù),默認1000 MAXTAB = 300
#{可選項}當達到表最大數(shù),每次卸載表數(shù),默認200 DELTAB = 50
#{可選項}日志批次(秒),默認900秒 L0GBATCH = 900
#{可選項} 一個目錄下一次處理文件數(shù).默認100,始終處理一個目錄值為0
FILEC0UNT = 0
#內(nèi)存數(shù)據(jù)庫加密文件
LOGIN = ${DCI_H0ME}/cfg/login. db
#內(nèi)存數(shù)據(jù)庫實例名
SERVER = imdb
#DIR開始只能從01開始,如果出現(xiàn)重復(fù)默認取排在前面的 [DIR01]
#入口文件格式
INDIR = /tpt/mmdb/work/zhuoch/wbin/data/in/A*, chk #出口文件格式
OUTDIR = /tpt/mmdb/work/zhuoch/wbin/data/out/P%s #出口臨時目錄
OUTTMP =/tpt/mmdb/work/zhuoch/wbin/data/outtmp #備份目錄
BAKDIR = /tpt/mmdb/work/zhuoch/wb in/data/bak #備份臨時目錄
BAKTMP = /tpt/mmdb/work/zhuoch/wb in/data/baktmp ##定變長分割點 CHANGEDATE = 20090701
#{可選項},入口不剔重,直接寫出口文件格式,默認*.nodUp IGNOREFILE = y.?? ·nodup#{可選項},入口不剔重,且不寫出口,只追加索引文件格式,默認*.addidx ADDIDXFILE = y. .addidx
#{可選項},入口不剔重,且不寫出口,只刪表中索引索引文件格式,默認*.delidx DELIDXFILE = y. .delidx
#{可選項},記錄分隔符(只在處理分隔符記錄時有效)。空格用丨代替,丨油用代替,默認空格 SPLIT =
#split分隔符格式ascii定長格式fedx FEDX格式
#RECTYPE中分號前的以當前系統(tǒng)時時對比CHANGEDATE,比CHANGEDATE大用new,小用 old(原則前新后舊)。 #下面[VC/VC2]表示使用文件級剔重,即一個文件是一種格式,如果沒有[...]的表示記錄級剔重。在對應(yīng)索引配置中根據(jù)某一字段條件來判斷 RECTYPE = new:ascii[Α];old:split
以下是索引條件文件,索引文件分別可用兩種不同的類型文件表示都可以,在實際中兩者取其一
(1)xml模式
(2)cfg模式
注意其中如果要使用xml模式,應(yīng)該在makefile中加上宏-D—USE_XML—,同時必須有Iibxml解析庫。配置文件中[CONFIG]中IDXCTRL改為對應(yīng)xml文件以下是ml模式文件和cfg模式文件 XML文件
<DUP><! —剔重配置一> <REC_CFG>< !— 一個剔重配置一> <REC_FIELD> [A] </REC_FIELD>< !—文件級剔重配置一> <FILE_HEAD>y, a</FILE_HEAD>< !—文件名頭配置一> <C0N_FIELD>[ substr(svcName, 1,2) = 00 ] | [ svcName = 01 ]</C0N_ FIELDX !—剔重記錄條件配置一>
<MDB_FIELD><!—剔重內(nèi)存數(shù)據(jù)庫配置一>
<TABLE〉substr (msisdn, 1,7),substr (start_datetime, 1,8)</ TABLEX !—剔重表配置一>
<TABLESPACE>substr (start_datetime, 7,2)〈/TABLESPACEX !—剔重表空
間配置一>
</MDB_FIELD>
<IND_FIELD>svcName, msisdn, other_party, start_datetime</IND_FIELD> <!-剔重索引字段配置一>
<KEY_FIELD>< !—剔重字段配置一>
<FIELD seq=' 0' fieldName=' svcName'startPos=' 0' length=' 2'
type=' 0' desc='子系統(tǒng)代碼,/>
〈FIELD seq=' 1' fieldName=' msisdn'startPos='40'length=' 15,type=' 0' desc=,子系統(tǒng)代碼,/>
<FIELD seq='2' fieldName=' start_datetime' startPos='55' length=' 14,type=' 0' desc='子系統(tǒng)代碼,/>
〈FIELD seq='3' fieldName=' other_party'startPos=' 117'
length=' 24,type=' 0' desc='子系統(tǒng)代碼,/> </KEY_FIELD> </REC_CFG>
<REC_CFG>< !—又一剔重配置一>
</REC_CFG> </DUP> CFG文件
##所有substr中第二個參數(shù)啟始位置從1開始
##[KEY_FIELD]中所有字段的啟始位置從0開始,split中分隔開始第一個字段也從0
開始
##優(yōu)化配置提高剔重配置查詢速度
##1、多個REC_FIELD中有相同情況下,C0N_FIELD條件越復(fù)雜的剔重配置,請盡量配在
后面
#記錄級剔重時按以下配置;如果文件級剔重改為[REC_FIELD] [VC] [REC_FIELD] [A] #{可選項}
#[FILE_HEAD] y, a
#{可選項}
#[C0N_FIELD] [ substr(billing_type, 1, 2) = 00 ] | [ billing_type = 01 ] #根據(jù)字段拼寫表名{TABPRE}_{$1}_{$2},表空間必須是表名中字段的一部分,substr (從1開始),或者表空間不配,取默認表空間 TABLE:substr (msisdn, 1, 7), substr(start_datetime, 1,8) TABLESPACEsubstr(start_datetime, 7,2) #字段格式 svcName, msisdn, other_party, start_datetime [KEY_FIELD]
#字段名,分隔符格式中字段位置(從0開始),字段開始位置(從0開始),字段長度,字段類型(0:ascii l:int 2:float),備注
#注意fedx中字段開始位置是沒用的.所以要取字段值中中間部分內(nèi)容,只能先取出值來后,再substr
0svcName0201msisdn401502start_datetime551403other_party117240以上所述僅為本發(fā)明的較佳實施例,并不用以限制本發(fā)明,凡在本發(fā)明的精神和原則之內(nèi),所作的任何修改、等同替換、改進等,均應(yīng)包含在本發(fā)明的保護范圍之內(nèi)。
權(quán)利要求
1.一種內(nèi)存話單剔重方法,包括 步驟1 將話單文件讀入內(nèi)存;步驟2 從所述話單文件中讀取一條話單記錄;步驟3 根據(jù)所述話單記錄中的關(guān)鍵信息,找到內(nèi)存中與所述話單記錄相對應(yīng)的索引表;步驟4:對所述話單記錄中的字段內(nèi)容拼成一個字符串,并求MD5值作為該話單記錄的索引;步驟5:將所述MD5值插入到所述索引表中,若插入成功,則將所述話單記錄寫入正常話單文件中,若插入失敗,則將所述話單記錄寫入重單文件;步驟6 重復(fù)步驟2至步驟5,直到遍歷完所述話單文件中的所有話單記錄。
2.根據(jù)權(quán)利要求1所述的內(nèi)存話單剔重方法,其特征在于所述索引表采用T-tree索引。
3.根據(jù)權(quán)利要求1所述的內(nèi)存話單剔重方法,其特征在于所述話單記錄中的關(guān)鍵信息為號段和/或日期。
4.根據(jù)權(quán)利要求1所述的內(nèi)存話單剔重方法,其特征在于所述索引表中僅有一個 char (32)型字段,記錄有話單文件中的所有非重單記錄的MD5值。
5.根據(jù)權(quán)利要求1所述的內(nèi)存話單剔重方法,其特征在于步驟3中,若內(nèi)存中不存在與所述話單記錄相對應(yīng)的索引表,則將所述索引表從其所保存的存儲器中加載到內(nèi)存中; 若所述內(nèi)存和存儲器中均不存在與所述話單記錄相對應(yīng)的索引表,則在內(nèi)存中新建索引表作為與所述話單記錄相對應(yīng)的索引表。
6.根據(jù)權(quán)利要求1至5任一項所述的內(nèi)存話單剔重方法,其特征在于所述方法設(shè)有關(guān)于話單記錄處理條數(shù)或者話單記錄時間的限定值,當處理的話單記錄達到所述限定值時,對內(nèi)存中不常用的索引表進行卸載,并保存在指定的存儲器中。
全文摘要
本發(fā)明涉及一種內(nèi)存話單剔重方法,包括步驟1將話單文件讀入內(nèi)存;步驟2從所述話單文件中讀取一條話單記錄;步驟3根據(jù)所述話單記錄中的關(guān)鍵信息,找到內(nèi)存中與所述話單記錄相對應(yīng)的索引表;步驟4對所述話單記錄中的字段內(nèi)容拼成一個字符串,并求MD5值作為該話單記錄的索引;步驟5將所述MD5值插入到所述索引表中,若插入成功,則將所述話單記錄寫入正常話單文件中,若插入失敗,則將所述話單記錄寫入重單文件;步驟6重復(fù)步驟2至步驟5,直到遍歷完所述話單文件中的所有話單記錄。本發(fā)明的方法利用內(nèi)存索引表并采用MD5值進行剔重,實現(xiàn)了利用較小的內(nèi)存空間進行較快的話單剔重處理,使得話單的剔重處理性能與話單的數(shù)據(jù)量無關(guān)。
文檔編號G06F17/30GK102156744SQ20111009735
公開日2011年8月17日 申請日期2011年4月18日 優(yōu)先權(quán)日2011年4月18日
發(fā)明者卓才華 申請人:北京神州數(shù)碼思特奇信息技術(shù)股份有限公司