(1.鄭州大學 水利與環境學院,鄭州 450001;2.華北水利水電學院 巖土工程系, 鄭州 450011)
摘 要:應用內存映射文件技術將分割后的大場景流域模型(包括DEM地形、地形影像、地物模型、地物模型影像、元數據)在內存儲器中建立了多進程共享的內存地址空間。在此基礎上首先探討了應用內存映射文件技術所用到的函數及其功能;接著分析了調用、存儲大場景流域模型(大小約4 GB)所應用到的函數及其使用方法原理,并結合相關程序代碼對具體的實現過程進行了詳細的剖析;最后得出結論,應用內存映射文件技術不僅可以讀取大場景流域模型數據文件(大小約4 GB),而且可以充分利用計算機的有效資源加快大場景模型的繪制效率,實現實時交互繪制。
關鍵詞:模型;映射文件;進程;實時繪制
中圖分類號:TP391 文獻標志碼:A
文章編號:10013695(2009)02052702
Based on memory mapping file technique tovisualize large scene watershed model quickly
LI Xiaogen1,2,WANG Zongmin1,HUANG Zhiquan2
(1.School of Environment Water Conservancy, Zhengzhou University,Zhengzhou 450001, China;2.Dept. ofGeotechnical Engineering,North China Institute of Water Conservancy Hydroelectric Power, Zhengzhou 450011, China)
Abstract:Processessharing memory address space was created on the base of divided largescene watershed model (including DEM terrain,terrain image,surface features model, object model image,metadata) by using memory mapping file technolog(MMFT)in the memory.Firstly, this paper discussed the function and its functions that the MMFT would apply.Secondly,analyzed the function and its principles which transferring and storing largescene watershed model(size is about 4 GB),and analyzed achievement courses detailedly concerned with relative procedure codes. Finally, the conclusion is that using MMFT can not only read largescene watershed model data documents(size is about 4 GB),but also make full use of the computer valid resources to quicken the drawing efficiency of largescene model to accomplish the justintime interactive drawing.
Key words:model; mapping file; processing; justintime drawing
0 引言
在對文件進行讀寫操作時,Win32 API和MFC都提供了支持文件操作的函數和類,常用的有Win32 API的CreateFile()、WriteFile()、ReadFile()和MFC提供的CFile類等[1]。一般來說,以上這些函數可以滿足大多數場合的要求,即這些函數文件讀取的數據量不得大于(231-1)Byte,因為在Win 32系統中,232大小約為4 GB,用戶占用約2 GB,中央處理器占用約2 GB。但是對于某些特殊應用領域,如幾百平方公里的大場景流域模型(包括DEM地形數據、遙感影像數據、地物模型數據、地物模型影像數據、元數據)達到幾十、幾百GB,乃至幾TB的海量存儲,如果以上述類和函數的文件處理方法進行文件的處理顯然是不行的,因為目前的計算機硬件配置的性能遠遠低于這種要求。對于這種特殊的操作如果應用內存映射文件技術來進行處理則迎刃而解。
由于內存映射文件技術的主要函數都提供了兩個DWORD型參數來分別表示偏移量的低32 bit和高32 bit,這兩個參數加起來共64 bit,如果應用這種方法來讀取數據文件,數據量可以達到(264-1)Byte,幾乎可以對任何海量數據進行處理[2]。另外,應用內存映射文件技術可以大大提高中央處理器讀取數據文件的速度。內存映射文件與邏輯內存相似,通過內存映射文件可以保留一個地址空間的區域,同時將物理存儲器提交給此區域,只是內存文件映射的物理存儲器來自一個已經存在于磁盤上的文件,而非系統的頁文件,而且在對該文件進行操作之前必須首先對文件進行映射,就如同將整個文件從磁盤加載到內存。
由上述可見,使用內存映射文件處理存儲于磁盤上的文件時,將不必再對文件執行I/O操作。這意味著在對文件進行處理時將不必再為文件申請并分配緩存,所有的文件緩存操作均由系統直接管理。由于取消了將文件數據加載到內存、數據從內存到文件的回寫以及釋放內存塊等步驟,可以大大提高計算機的運行速度[3]。
1 內存映射文件相關函數
HANDLE CreateFile(LPCTSTR IpFileName
/*創建或打開一個文件內核對象,這個對象標志了磁盤上將要用做內存映射文件的文件,并將其句柄返回*/
DWORD dwDesiredAccess,
DWORD dwShareMode,
LPSECURITY_ATTRIBUTES IpSecurityAttributes,
DWORD dwCreationDisposition,
DWORD dwFlagsAndAttributes,
HANDLE hTemplateFile);
HANDLE CreateFileMapping(HANDLE hFile,
/*創建一個文件映射內核對象,通過參數hFile指定待映射到進程地址空間的文件句柄(該句柄由CreateFile()函數的返回值獲?。?/
LPSECURITY_ATTRIBUTES IpFileMappingAttributes,
DWORD flProtect,DWORD dwMaximumSizeHigh,
/*文件大小的高32 bit
DWORD dwMaximumSizeLow,
/*文件大小的低32 bit和dwMaximumSizeHigh組成64 bit值,表示文件的長度*/
LPCTSTR lpName;
/*文件映射對象的名字
LPVOID MapViewOfFile(HANDLE hFileMappingObject,
/*負責通過系統的管理將文件映射對象的全部或部分映射到進程地址空間,參數hFileMappingObject為CreateFileMapping()返回的文件映像對象句柄*/
DWORD dwDesiredAccess,
/*指定了對文件數據的訪問方式,而且同樣要與CreateFileMapping()函數所設置的保護屬性相匹配*/
DWORD dwFileOffsetHigh,
/*映射開始位置的高32 bit
DWORD dwFileOffsetLow,
/*映射開始位置的低32 bit,和dwFileOffsetHigh組成64 bit,表示文件的偏移地址*/
DWORD dwNumberOfBytesToMap)
/*映射進程的地址空間中分配的字節數[4]
2 內存映射文件技術處理大場景流域模型算法實現
通過具體實例(大場景流域模型大小約4 GB)來詳細分析內存映射文件技術的使用方法。在下列例子中從端口接收數據,并實時將其存放于磁盤。
下面給出此線程處理函數的具體實現過程:
……
// 創建文件內核對象,其句柄保存于hFile
HANDLE hFile = CreateFile(\"shayinghe.zip\",
GENERIC_WRITE | GENERIC_READ,FILE_SHARE_READ,
NULL,
CREATE_ALWAYS,
FILE_FLAG_SEQUENTIAL_SCAN,
NULL);
// 創建文件映射內核對象,句柄保存于hFileMapping
HANDLE hFileMapping = CreateFileMapping(hFile,NULL,PAGE_READWRITE,0, 0x4000000, NULL);
// 釋放文件內核對象
CloseHandle(hFile);
// 設定大小、偏移量等參數
__int64 qwFileSize = 0x4000000;
__int64 qwFileOffset = 0;
__int64 T = 600 * sinf.dwAllocationGranularity;
DWORD dwBytesInBlock = 1000 * sinf.dwAllocationGranularity;
// 將文件數據映射到進程的地址空間
PBYTE pbFile = (PBYTE)MapViewOfFile(hFileMapping,
FILE_MAP_ALL_ACCESS,
(DWORD)(qwFileOffset>>32),
(DWORD)(qwFileOffset0xFFFFFFFF),
dwBytesInBlock);
while(bLoop)
{
……
另外,為了加快讀取數據的效率,可以應用緩存技術將調用頻率最高的場景區域數據(主要局部場景及對應的影像、主要地物模型及對應的影像)直接調入到緩存中,充分利用計算機中央處理器的資源,加快大場景流域模型的繪制[5]。
具體算法實現:應用Getdata()函數判斷調用頻率最高的數據文件是否在緩存中,如果沒有則先把該數據調入到緩存中,然后再讀取數據進行繪制[6]。
3 結束語
經過實際運行和測試,在計算機硬件配置CPU為P43.0 GHz,內存為256 MB的PC機上運行打開大小約4 GB(共12幅圖)的大場景流域模型所需要的時間約為25 s。而其他的專業地形和影像處理軟件(ERDAS IMAGE 8.5和ArcGIS 9.0)只能打開模型文件前2 GB的數據文件,2 GB后的數據文件打不開。
圖1為打開模型文件大小約4 GB文件和大小約2 GB文件的界面。其中在ArcGIS 9.0中打開12幅圖中的第7幅圖時會出現死機現象,最多打開6幅圖。
內存映射文件在處理大規模模型文件時表現出了快速讀取文件的優越性能,比使用CFile類、ReadFile()和WriteFile()等函數的文件處理具有明顯的優勢和效率。 參考文獻:
[1]
HAND D,MANNILA H,SMYTH P.數據挖掘原理[M].張銀奎,廖麗,宋俊,譯.北京:機械工業出版社,2003.
[2]LEVOY M,PULLI K,CURLESS B,et al.The digital Michelangelo project:3D scanning of large statues[C]//Proc of the 27th Annual Conference on Computer Graphics and Interactive Techniques.New York:ACM Press,2000:131144.
[3]HAY B,WETS G,VANHOOF K.Clustering navigation patterns on a website using a sequence alignment method[C]//Proc of the 17th International Joint Conference on Artificial Telligent.2001.
[4]呂鳳軍.數字圖像處理編程基礎[M].北京:機械工業出版社,1998.
[5]CHOI K R,KIM K C.T*tree:a main memory database index structure for realtime application[C]//Proc of the 3rd Int’l Workshop on Realtime Computing Systems and Application.1996.
[6]黃敏,何國輝.Visual C++程序開發指南[M].北京:科學出版社,1995.