專利名稱:一種讀取海量數(shù)據(jù)的方法及裝置的制作方法
技術(shù)領(lǐng)域:
本發(fā)明涉及數(shù)據(jù)處理領(lǐng)域,尤其是涉及一種讀取海量數(shù)據(jù)的方法及裝置。
背景技術(shù):
在生產(chǎn)生活中,經(jīng)常需要制作各種報表。在生成、顯示報表時,不可避免的會遇到海量數(shù)據(jù)的讀取以及顯示問題,換句話說,報表中所涉及的數(shù)據(jù)少則幾萬條,多則幾十萬甚至上百萬條,如何將這么多的數(shù)據(jù)正確地讀取到內(nèi)存進而顯示在界面上,是每個報表產(chǎn)品所面臨的挑戰(zhàn)。報表所涉及的海量數(shù)據(jù)一般都是存儲在數(shù)據(jù)庫里。在現(xiàn)有技術(shù)中,生成報表時通常是對數(shù)據(jù)庫數(shù)據(jù)進行分段(或稱分批)讀取,每次讀取數(shù)據(jù)庫中固定數(shù)量的數(shù)據(jù),比如數(shù)據(jù)庫中待讀取的數(shù)據(jù)是10萬條,每次讀取5000條并顯示,則一共讀取20次可將所有數(shù)據(jù)讀取完畢。使用這種分段讀取的方式可以避免一次性讀取全部數(shù)據(jù)而導(dǎo)致的內(nèi)存溢出的問題。發(fā)明人在實現(xiàn)本發(fā)明的過程中,發(fā)現(xiàn)現(xiàn)有技術(shù)至少存在如下缺點當(dāng)某些數(shù)據(jù)存在關(guān)聯(lián)時,這種按固定數(shù)量分段讀取的方式可能會將這些有關(guān)聯(lián)的數(shù)據(jù)分割開來,使得數(shù)據(jù)的完整性被破壞,從而導(dǎo)致在統(tǒng)計、匯總等處理時出現(xiàn)錯誤。例如,數(shù)據(jù)庫中存儲有多條城市記錄,同時對各條記錄按照所屬地區(qū)進行了分組,如表1所示表 權(quán)利要求
1.一種讀取海量數(shù)據(jù)的方法,其特征在于,包括以下步驟i)獲取待讀取的海量數(shù)據(jù),所述海量數(shù)據(jù)包含多條記錄,每條所述記錄包含若干字段; )獲取所述海量數(shù)據(jù)中指定字段的名稱,并將所述海量數(shù)據(jù)中的所有記錄按所述指定字段進行排序,以使所述指定字段值相同的記錄相鄰;iii)獲取從所述海量數(shù)據(jù)中讀取數(shù)據(jù)時的起始位置及要預(yù)讀取的記錄的數(shù)量;iv)從所述海量數(shù)據(jù)中的所述起始位置預(yù)讀取所述數(shù)量的記錄作為當(dāng)前數(shù)據(jù)段;ν)在所述當(dāng)前數(shù)據(jù)段中,按從后向前的順序?qū)Ω鳁l記錄的所述指定字段的值進行遍歷,以獲取結(jié)尾位置,所述結(jié)尾位置為所述指定字段的值發(fā)生改變的記錄的位置;Vi)將所述起始位置與所述結(jié)尾位置之間的記錄作為一段數(shù)據(jù)進行正式讀取,并將所述結(jié)尾位置處的記錄的下一條記錄的位置作為新的起始位置,進入步驟iii)。
2.根據(jù)權(quán)利要求1所述的方法,其特征在于,步驟ν)具體包括a、將所述當(dāng)前數(shù)據(jù)段的最后一條記錄作為當(dāng)前記錄;b、判斷當(dāng)前記錄及其上一條記錄的所述指定字段的值是否相同,若相同,則將所述當(dāng)前記錄的上一條記錄作為新的當(dāng)前記錄,重復(fù)步驟b ;若不同,則獲取所述當(dāng)前記錄的上一條記錄的位置作為結(jié)尾位置。
3.根據(jù)權(quán)利要求1所述的方法,其特征在于,步驟iv)之后還包括以下步驟 判斷所述當(dāng)前數(shù)據(jù)段之后是否還有后續(xù)數(shù)據(jù),若有則繼續(xù)執(zhí)行,若沒有,則將當(dāng)前數(shù)據(jù)段作為一段數(shù)據(jù)進行正式讀取并退出。
4.根據(jù)權(quán)利要求3所述的方法,其特征在于,判斷所述當(dāng)前數(shù)據(jù)段之后是否還有后續(xù)數(shù)據(jù)的步驟,具體包括A、讀取所述當(dāng)前數(shù)據(jù)段之后的若干條記錄作為冗余記錄;B、判斷所述冗余記錄的第一條記錄是否為空,若是,則判斷沒有后續(xù)記錄,若否,則判斷有后續(xù)記錄。
5.根據(jù)權(quán)利要求4所述的方法,其特征在于,步驟A中所述若干條具體為一條。
6.一種讀取海量數(shù)據(jù)的裝置,其特征在于,包括數(shù)據(jù)準(zhǔn)備單元,用于獲取待讀取的海量數(shù)據(jù),所述海量數(shù)據(jù)包含多條記錄,每條所述記錄包含若干字段;預(yù)處理單元,用于獲取所述海量數(shù)據(jù)中指定字段的名稱,并將所述海量數(shù)據(jù)中的所有記錄按所述指定字段進行排序,以使所述指定字段值相同的記錄相鄰;起點獲取單元,用于獲取從所述海量數(shù)據(jù)中讀取數(shù)據(jù)時的起始位置及要預(yù)讀取的記錄的數(shù)量;預(yù)讀單元,用于從所述海量數(shù)據(jù)中的所述起始位置預(yù)讀取所述數(shù)量的記錄作為當(dāng)前數(shù)據(jù)段;結(jié)尾獲取單元,用于在所述當(dāng)前數(shù)據(jù)段中,按從后向前的順序?qū)Ω鳁l記錄的所述指定字段的值進行遍歷,以獲取結(jié)尾位置,所述結(jié)尾位置為所述指定字段的值發(fā)生改變的記錄的位置;正式讀取單元,用于將所述起始位置與所述結(jié)尾位置之間的記錄作為一段數(shù)據(jù)進行正式讀取,并將所述結(jié)尾位置處的記錄的下一條記錄的位置作為新的起始位置。
7.根據(jù)權(quán)利要求6所述的裝置,其特征在于,所述結(jié)尾獲取單元具體包括 初始化子單元用于將所述當(dāng)前數(shù)據(jù)段的最后一條記錄作為當(dāng)前記錄;循環(huán)判斷子單元用于判斷當(dāng)前記錄及其上一條記錄的所述指定字段的值是否相同; 若相同,則將所述當(dāng)前記錄的上一條記錄作為新的當(dāng)前記錄,繼續(xù)判斷當(dāng)前記錄及其上一條記錄的所述指定字段的值是否相同;若不同,則獲取所述當(dāng)前記錄的上一條記錄的位置作為結(jié)尾位置。
8.根據(jù)權(quán)利要求6所述的裝置,其特征在于,還包括后續(xù)數(shù)據(jù)判斷單元,用于判斷所述當(dāng)前數(shù)據(jù)段之后是否還有后續(xù)數(shù)據(jù),若沒有則調(diào)用結(jié)束單元;所述結(jié)束單元,用于將當(dāng)前數(shù)據(jù)段作為一段數(shù)據(jù)進行正式讀取并退出。
9.根據(jù)權(quán)利要求8所述的裝置,其特征在于,所述后續(xù)數(shù)據(jù)判斷單元具體包括 后續(xù)數(shù)據(jù)讀取子單元,用于讀取所述當(dāng)前數(shù)據(jù)段之后的若干條記錄作為冗余記錄; 后續(xù)數(shù)據(jù)判斷子單元,用于判斷所述冗余記錄的第一條記錄是否為空,若否,則調(diào)用結(jié)束單元。
10.根據(jù)權(quán)利要求9所述的裝置,其特征在于所述若干條具體為一條。
全文摘要
本發(fā)明實施例公開了一種讀取海量數(shù)據(jù)的方法及裝置,所述方法包括i)獲取待讀取的海量數(shù)據(jù);ii)獲取指定字段的名稱并將所有記錄按指定字段進行排序;iii)獲取起始位置及要預(yù)讀取的記錄的數(shù)量;iv)從起始位置預(yù)讀取所述數(shù)量的記錄作為當(dāng)前數(shù)據(jù)段;v)在當(dāng)前數(shù)據(jù)段中,按從后向前的順序?qū)Ω鳁l記錄的指定字段的值進行遍歷,以獲取結(jié)尾位置,即指定字段的值發(fā)生改變的記錄的位置;vi)將起始位置與結(jié)尾位置之間的記錄作為一段數(shù)據(jù)進行正式讀取,并將結(jié)尾位置處的記錄的下一條記錄的位置作為新的起始位置,進入步驟iii)。本發(fā)明在分段讀取海量數(shù)據(jù)時可動態(tài)調(diào)整每段數(shù)據(jù)的起始位置和結(jié)尾位置,從而保證了每段數(shù)據(jù)的完整性。
文檔編號G06F17/30GK102567528SQ20111045315
公開日2012年7月11日 申請日期2011年12月29日 優(yōu)先權(quán)日2011年12月29日
發(fā)明者張霞, 房軼臣, 邢鐵軍, 馬帥 申請人:東軟集團股份有限公司