用記憶體對映檔案處理大檔案應用示例
下面結合乙個具體的例項來進一步講述記憶體對映檔案的使用方法。該例項從埠接收資料,並實時將其存放於磁碟,由於資料量大(幾十gb),在此選用記憶體對映檔案進行處理。下面給出的是位於工作執行緒mainproc中的部分主要**,該執行緒自程式執行時啟動,當埠有資料到達時將會發出事件hevent[0],waitformultipleobjects()函式等待到該事件發生後將接收到的資料儲存到磁碟,如果終止接收將發出事件hevent[1],事件處理過程將負責完成資源的釋放和檔案的關閉等工作。下面給出此執行緒處理函式的具體實現過程:
……// 建立檔案核心物件,其控制代碼儲存於hfile
handle hfile = createfile("recv1.zip",
generic_write | generic_read,
file_share_read,
null,
create_always,
file_flag_sequential_scan,
null);
// 設定大小、偏移量等引數
__int64 qwfilesize = 0x4000000;
__int64 qwfileoffset = 0;
__int64 t = 600 * sinf.dwallocationgranularity;
dword dwbytesinblock = 1000 * sinf.dwallocationgranularity;
// 終止事件觸發
case 1:
bloop = false;
// 從程序的位址空間撤消檔案資料映像
unmapviewoffile(pbfile);
在終止事件觸發處理過程中如果只簡單的執行unmapviewoffile()和closehandle()函式將無法正確標識檔案的實際大小,即如果開闢的記憶體對映檔案為30gb,而接收的資料只有14gb,那麼上述程式執行完後,儲存的檔案長度仍是30gb。也就是說,在處理完成後還要再次通過記憶體對映檔案的形式將檔案恢復到實際大小,下面是實現此要求的主要**:
// 建立另外乙個檔案核心物件hfile2 = createfile("recv.zip",
generic_write | generic_read,
file_share_read,
null,
create_always,
file_flag_sequential_scan,
null);
// 關閉檔案核心物件
closehandle(hfile2);
// 將資料從原來的記憶體對映檔案複製到此記憶體對映檔案
memcpy(pbfile2, pbfile, qwfileoffset);
file://從程序的位址空間撤消檔案資料映像
unmapviewoffile(pbfile);
unmapviewoffile(pbfile2);
// 刪除臨時檔案
deletefile("recv1.zip");
結論
經實際測試,記憶體對映檔案在處理大資料量檔案時表現出了良好的效能,比通常使用cfile類和readfile()和writefile()等函式的檔案處理方式具有明顯的優勢。本文所述**在windows 98下由microsoft visual c++ 6.0編譯通過。
VC 中使用記憶體對映檔案處理大檔案
vc 中使用記憶體對映檔案處理大檔案 摘要 本文給出了一種方便實用的解決大檔案的讀取 儲存等處理的方法,並結合相關程式 對具體的實現過程進行了介紹。引言 檔案操作是應用程式最為基本的功能之一,win32 api和mfc均提供有支援檔案處理的函式和類,常用的有win32 api的createfile ...
VC 中使用記憶體對映檔案處理大檔案
檔案操作是應用程式最為基本的功能之一,win32 api和mfc均提供有支援檔案處理的函式和類,常用的有win32 api的createfile writefile readfile 和mfc提供的cfile類等。一般來說,以上這些函式可以滿足大多數場合的要求,但是對於某些特殊應用領域所需要的動輒幾...
VC 中使用記憶體對映檔案處理大檔案
引言 檔案操作是應用程式最為基本的功能之一,win32 api和mfc均提供有支援檔案處理的函式和類,常用的有win32 api的createfile writefile readfile 和mfc提供的cfile類等。一般來說,以上這些函式可以滿足大多數場合的要求,但是對於某些特殊應用領域所需要的...