摘 要:目前,隨著計(jì)算機(jī)在各個(gè)產(chǎn)業(yè)部門的逐漸普及、計(jì)算機(jī)運(yùn)算能力的逐步提高以及各種新型需求的誕生,對(duì)文件存儲(chǔ)以及訪問(wèn)的需求也隨之升高,人們已經(jīng)不能滿足于基于兆級(jí)的數(shù)據(jù)文件的訪問(wèn),更大的數(shù)據(jù)文件的訪問(wèn)和支持能力對(duì)開(kāi)發(fā)人員提出了更高的要求,但是,受計(jì)算機(jī)硬件條件、系統(tǒng)軟件的版本以及軟件開(kāi)發(fā)版本的約束,我們并不能大刀闊斧的對(duì)軟件進(jìn)行徹底修改,否則會(huì)對(duì)軟件的兼容性造成非常嚴(yán)重的危害,因此我們需要針對(duì)不同情況來(lái)分別對(duì)各種大型數(shù)據(jù)進(jìn)行遍歷,從而保證軟件在不同配置的計(jì)算機(jī)上能夠順利運(yùn)行。
關(guān)鍵詞:新型需求 徹底修改 遍歷
中圖分類號(hào):TP3 文獻(xiàn)標(biāo)識(shí)碼:A 文章編號(hào):1672-3791(2013)01(b)-0024-01
在石油及礦產(chǎn)勘探領(lǐng)域,經(jīng)常使用不同方式對(duì)地層進(jìn)行探測(cè),隨著探測(cè)手段日益增強(qiáng),衍生出的數(shù)據(jù)量也越來(lái)越大,從早期的幾十兆到現(xiàn)在的幾個(gè)G的級(jí)別,不僅對(duì)計(jì)算機(jī)的要求日益提高,同時(shí)對(duì)軟件開(kāi)發(fā)人員也提出了更高的要求:開(kāi)發(fā)人員要花費(fèi)大量精力來(lái)優(yōu)化內(nèi)存以及CPU的使用,并且還要針對(duì)一些數(shù)據(jù)結(jié)構(gòu)不能操作大型數(shù)據(jù)進(jìn)行擴(kuò)展。本文針對(duì)某油田測(cè)井?dāng)?shù)據(jù)格式的大數(shù)據(jù)量文件的操作,分別闡述了幾種不同情況的處理方法。
本程序是基于VC6.0開(kāi)發(fā)的,其運(yùn)行環(huán)境為32位Windows系統(tǒng)。
1 修改數(shù)據(jù)描述格式
首先,我們需要面對(duì)的是數(shù)據(jù)格式不能滿足需求的問(wèn)題,對(duì)所有標(biāo)識(shí)文件數(shù)據(jù)塊大小的字段進(jìn)行類型的修改,原有的代碼中沒(méi)有考慮到大數(shù)據(jù)量的可能性,對(duì)數(shù)據(jù)塊大小的描述都是采用的整型int型或長(zhǎng)整型long格式,由于采用的是有符號(hào)整型,所以其只能標(biāo)識(shí)-2147483648~2147483648的文件塊大小,這對(duì)于一般的線性數(shù)據(jù)塊大小是足夠的,但是對(duì)于大范圍的波列數(shù)據(jù)以及矩陣類型數(shù)據(jù)的描述就捉襟見(jiàn)肘了。本程序采用了一種叫做ULONGLONG的據(jù)格式,該格式為無(wú)符號(hào)64位數(shù)據(jù)格式,理論上可以達(dá)到0~18446744073709551616的存儲(chǔ)長(zhǎng)度,這樣的話對(duì)于任意可能存在的數(shù)據(jù)長(zhǎng)度,該格式都是足夠描述的。
2 采用內(nèi)存映射
其次,我們采用了內(nèi)存映射方式來(lái)克服大塊內(nèi)存的分配問(wèn)題:對(duì)于內(nèi)存分配,我們的數(shù)據(jù)格式是連續(xù)存儲(chǔ)的,對(duì)于每塊特定的數(shù)據(jù)內(nèi)容,其讀取和寫(xiě)入也必須是連續(xù)的,因此在處理大數(shù)據(jù)量的數(shù)據(jù)操作時(shí),常常會(huì)遇到需要分配巨大內(nèi)存空間的問(wèn)題,而對(duì)于32位操作系統(tǒng),系統(tǒng)本身可識(shí)別的內(nèi)存僅為4G,除掉其他程序耗費(fèi)掉的內(nèi)存,系統(tǒng)在分配大內(nèi)存空間上就顯得力不從心,即使能夠分配成功,其程序的執(zhí)行效率也會(huì)變得極低。除此之外,在多次處理大數(shù)據(jù)量的數(shù)據(jù)過(guò)程中,還發(fā)現(xiàn)了一個(gè)特殊的現(xiàn)象,即Windows系統(tǒng)中的內(nèi)存碎片是影響內(nèi)存分配的,我們?cè)诜峙浯髷?shù)據(jù)量的內(nèi)存前,如果已經(jīng)有一些進(jìn)程運(yùn)行,那么可能會(huì)把整個(gè)的內(nèi)存空間打破,如果這些破碎的內(nèi)存任何一塊不足以分配我們所需的內(nèi)存空間,則系統(tǒng)無(wú)法分配內(nèi)存,從而導(dǎo)致內(nèi)存分配失敗,為此我們采用了內(nèi)存映射的手段來(lái)克服大數(shù)據(jù)量數(shù)據(jù)的操作難題,過(guò)程如下。
(1)首先我們把需要操作的數(shù)據(jù)文件File1進(jìn)行一個(gè)復(fù)制操作,生成一個(gè)新的臨時(shí)文件File1Copy。
(2)然后聲明一個(gè)內(nèi)存映射對(duì)象CMem MapFile mmf。
(3)聲明一個(gè)指針,用來(lái)指示共享內(nèi)存中的文件位置LPVOID pDataVoid。
(4)用CMemMapFile對(duì)象打開(kāi)臨時(shí)文件if(mmf.MapFile(tempName,TRUE,F(xiàn)ILE_SHARE_READ))
{pDataVoid=mmf.Open();}
(5)使用pDataVoid指針可以任意讀取數(shù)據(jù),并且可以把難以分配的大塊數(shù)據(jù)空間進(jìn)行分割操作,從而獲得較好的運(yùn)行效率。
(6)數(shù)據(jù)操作完畢,刪除臨時(shí)文件,釋放mmf.UnMap()。
通過(guò)使用內(nèi)存映射,我們有效的規(guī)避的大塊內(nèi)存分配的瓶頸,同時(shí)可以使得讀取和寫(xiě)入文件更加靈活。
3 采用CFile64遍歷文件
目前巨大文件越來(lái)越多,對(duì)于本軟件所需要操作的數(shù)據(jù)文件,由于大量的波列和矩陣數(shù)據(jù)的加入,突破G的文件也是越來(lái)越多,甚至有很多已經(jīng)達(dá)到了MFC中CFile類可操作數(shù)據(jù)的上限4GB,原因是CFile類中使用了32位整型來(lái)處理文件,從而導(dǎo)致了最大處理能力僅為4GB,為了能夠處理這種巨大的文件,我們采用了一種CFile64的文件讀取類,該類繼承于CFile,對(duì)其中的整型數(shù)據(jù)int轉(zhuǎn)換為ULONGLONG格式,并且對(duì)其中的Seek、Read、Write函數(shù)進(jìn)行了重載,從而使得CFile64理論上能夠支持18000000000GB的文件操作,這顯然完全能夠勝任我們的需求,對(duì)于CFile64類的使用與原有的MFC中的標(biāo)準(zhǔn)CFile類有些不同,主要集中在數(shù)據(jù)的遍歷以及讀取寫(xiě)入函數(shù)上。CFile64打開(kāi)及讀取數(shù)據(jù)代碼如下:
CFile64 m_file;
m_file.Open(fileName,GENERIC_WRITE|GENERIC_READ, FILE_SHARE_READ|FILE_SHARE_WRITE, OPEN_EXISTING)
POSITION pos;
m_file.Seek(pos,CFile64::begin,1);
m_file.Read(&pos,sizeof(long));
4 結(jié)論
通過(guò)使用ULONGLONG格式,我們首先解決了在編程過(guò)程中整形變量無(wú)法對(duì)巨大數(shù)據(jù)塊大小描述的問(wèn)題;其次我們通過(guò)內(nèi)存映射,有效的解決了非連續(xù)內(nèi)存塊無(wú)法分配的問(wèn)題和大內(nèi)存耗用情況下程序運(yùn)行效率的問(wèn)題;使用CFile64類,解決了原有CFile類不能操作4GB以上文件的弊端,至此,我們對(duì)VC6.0環(huán)境下基于32位系統(tǒng)操作大文件的能力進(jìn)行了有效的擴(kuò)充,開(kāi)發(fā)出的程序不僅能夠處理4GB以上的大文件,同時(shí)對(duì)內(nèi)存分配的瓶頸也進(jìn)行了有效的規(guī)避。
參考文獻(xiàn)
[1]姚全珠.C++面向?qū)ο蟪绦蛟O(shè)計(jì)教程[M].電子工業(yè)出版社,2010.
[2]Mastering MFC Development Abbas Jamalipoura and Pascal Lorenz Release Date:July,2003.
[3]鄭秋生.C/C++程序設(shè)計(jì)教程—— 面向?qū)ο蠓謨?cè)[M].電子工業(yè)出版社,2008.
[4]申德榮,于戈.分布式數(shù)據(jù)庫(kù)系統(tǒng)原理與應(yīng)用[M].機(jī)械工業(yè)出版社,2010.
[5]張乃孝,宗艷.數(shù)據(jù)結(jié)構(gòu)—C++與面向?qū)ο蟮耐緩剑ㄐ抻啺妫M].高等教育出版社,2005.