?
快捷搜索:  as  test  1111  test aNd 8=8  test++aNd+8=8  as++aNd+8=8  as aNd 8=8

網賭新浦金可靠嗎:VC中用內存映射文件處理大文件

?

文件操作是利用法度榜樣最為基礎的功能之一,Win32 API和MFC均供給有支持文件處置懲罰的函數和類。一樣平常來說,這些函數可以滿意大年夜多半場合的要求,然則對付某些特殊利用領域所必要的動輒幾十GB、幾百GB、甚至幾TB的海量存儲,再以平日的文件處置懲罰措施進行處置懲罰顯然是行不通的。今朝,對付上述這種大年夜文件的操作一樣平常因此內存映射文件的要領來加以處置懲罰的。

內存映射文件與虛網賭新浦金可靠嗎擬內存有些類似,經由過程內存映射文件可以保留一個地址空間的區域,同時將物理存儲器提交給此區域,只是內存文件映射的物理存儲器來自一個已經存在于磁盤上的文件,而非系統的頁文件,而且在對該文件進行操作之前必須首先對文件進行映射,就猶如將全部文件從磁盤加載到內存。由此可以看出,應用內存映射文件處置懲罰存儲于磁盤上的文件時,將不必再對文件履行I/O操作,這意味著在對文件進行處置懲罰時將不必再為文件申請并分配緩存,所有的文件緩存操作均由系統直接治理,因為取消了將文件數據加載到內存、數據從內存到文件的回寫以及開釋內存塊等步驟,使得內存映射文件在處置懲罰大年夜數據量的文件時能起到相稱緊張的感化。別的,實際工程中的系統每每必要在多個進程之間共享數據,假如數據量小,處置懲罰措施是機動多變的,假如共享數據容量偉大年夜,那么就必要借助于內存映射文件來進行。實際上,內存映射文件恰是辦理本地多個進程間數據共享的最有效措施。

示例代碼:

在本例中,首先經由過程GetFileSize()獲得被處置懲罰文件長度(64位)的高32位和低32位值。然后在映射歷程中設定每次映射的塊大年夜小為1000倍的分配粒度(系統的數據分塊大年夜小),假如文件長度小于1000倍的分配粒度時則將塊大年夜小設置為文件的實際長度。在處置懲罰歷程中由映射、造訪、取締映射構成了一個輪回處置懲罰。此中,每處置懲罰完一個文件塊后都經由過程關閉文件映射工具來對每個文件塊進行收拾。CreateFileMapping()、MapViewOfFile()等函數是專門用來進行內存文件映射處置懲罰用的。

// 創建文件工具

HANDLE hFile = ::CreateFile(strFile, GENERIC_READ,FILE_SHARE_READ, NULL,

OPEN_EXISTING, FILE_FLAG_RANDOM_ACCESS, NULL);

if (hFile == INVALID_HANDLE_VALUE)

{

TRACE("創建文件工具掉敗,差錯代碼:%d\r\n", 網賭新浦金可靠嗎GetLastError());

return;

}

// 創建文件映射工具

HANDLE hFileMap = Create網賭新浦金可靠嗎FileMapping(hFile, NULL, PAGE_READONLY, 0, 0, NULL);

if (hFileMap == NULL)

{

TRACE("創建文件映射工具掉敗,差錯代碼:%d\r\n", GetLastError());

return;

}

// 獲得系統分配粒度

SYSTEM_INFO SysInfo;

GetSystemInfo(&SysInfo);

DWORD dwGran = SysInfo.dwAllocationGranularity;

// 獲得文件尺寸

DWORD dwFileSizeHigh;

__int64 qwFileSize = GetFileSize(hFile, &dwFileSizeHigh);

qwFileSize |= (((__int64)dwFileSizeHigh)

// 偏移地址

__int64 qwFileOffset = 0;

__int64 T_newmap = 900 * dwGran;

// 塊大年夜小

DWORD dwBlockBytes = 1000 * dwGran;//文件數據分段大年夜小

if (qwFileSize - qwFileOffset

dwBlockBytes = (DWORD)qwFileSize;

// 映射視圖

char *lpbMapAddress = (char *)MapViewOfFile(hFileMap,FILE_MAP_READ,

(DWORD)(qwFileOffset >> 32), (DWORD)(qwFileOffset & 0xFFFFFFFF),dwBlockBytes);

if (lpbMapAddress == NULL)

{

TRACE("映射文件映射掉敗,差錯代碼:%d ", GetLastError());

return;

}

// 關閉文件工具

CloseHandle(hFile);

///////////讀文件數據

while(qwFileOffset

{

/奸淫奸淫奸淫奸淫奸淫奸淫**讀文件奸淫奸淫奸淫奸淫奸淫奸淫奸淫奸淫奸淫/

//read_eh(&lpbMapAddress)讀取已映射到內存的數據,

//并將文件指針作響應后移(lpbMapAddress++),返回指針偏移量

qwFileOffset = qwFileOffset + read_eh(&lpbMapAddress); //改動偏移量

if (qwFileOffset > T_newmap)

{//當數據讀到90%時,為防數據溢出,必要映射在其后的數據T_newmap

UnmapViewOfFile(lpbMapAddress);//開釋當前映射

if ((DWORD)(qwFileSize - T_newmap)

dwBlockBytes = (DWORD)(qwFileSize - T_newmap);

lpbMapAddress = (char *)MapViewOfFile(hFileMap,FILE_MAP_READ,

(DWORD)(T_newmap >> 32), (DWORD)(T_newmap & 0xFFFFFFFF),dwBlockBytes);

// 修正參數

lpbMapAddress = lpbMapAddress + qwFileOffset - T_newmap;

T_newmap =T_newmap+ 900 * dwGran;

if (lpbMapAddress == NULL)

{

TRACE("映射文件映射掉敗,差錯代碼:%d ", GetLastError());

return;

}

}

}

//開釋著末數據塊映射

UnmapViewOfFile(lpbMapAddress);

// 關閉文件映射工具句柄

CloseHandle(hFileMap);

自己編寫的一個小法度榜樣:

代碼

void CSDItestView::OnCreateTestFile()

{

// TODO: Add your command handler code here

int i;

int DataNum=1000000;

BYTE* pData;

HANDLE hFile=CreateFile(L"E:\\test1.txt",GENERIC_READ|GENERIC_WRITE,

FILE_SHARE_READ,NULL,CREATE_ALWAYS,FILE_ATTRIBUTE_NORMAL,NULL);

HANDLE hMapping=CreateFileMapping(hFile,NULL,PAGE_READWRITE,0,DataNum*sizeof(int),L"MyMapping");

if(hMapping==NULL)

{

MessageBox(L"創建內存映射掉敗",L"差錯",MB_OK|MB_ICONERROR);

return;

}

pData=(BYTE*)MapViewOfFile(hMapping,FILE_MAP_WRITE,0,0,0);

if(pData==NULL)

{

MessageBox(L"創建映射視圖掉敗",L"差錯",MB_OK|MB_ICONERROR);

return;

}

for(i=0;iDataNum;i++)

{

*(int*)(pData+i*4)=i;

}

UnmapViewOfFile(pData);

CloseHandle(hMapping);

CloseHandle(hFile);

}

void CSDItestView::OnProcessBigFile()

{

// TODO: Add your command handler code here

int i;

int DataNum=1000000;

BYTE* pData1;

BYTE* pData2;

char pStr[20];

HANDLE hFile1=CreateFile(L"E:\\test1.txt",G網賭新浦金可靠嗎ENERIC_READ,

FILE_SHARE_READ,NULL,OPEN_EXISTING,FILE_ATTRIBUTE_NORMAL,NULL);

HANDLE hFile2=CreateFile(L"E:\\test2.txt",GENERIC_READ|GENERIC_WRITE,

FILE_SHARE_READ,NULL,CREATE_ALWAYS,FILE_ATTRIBUTE_NORMAL,NULL);

HANDLE hMapping1=CreateFileMapping(hFile1,NULL,PAGE_READONLY,0,DataNum*sizeof(int),L"MyMapping");

if(hMapping1==NULL)

{

MessageBox(L"創建內存映射1掉敗",L"差錯",MB_OK|MB_ICONERROR);

return;

}

HANDLE hMapping2=CreateFileMapping(hFile2,NULL,PAGE_READWRITE,0,DataNum*12,L"MyMapping2");

if(hMapping2==NULL)

{

MessageBox(L"創建內存映射2掉敗",L"差錯",MB_OK|MB_ICONERROR);

return;

}

pData1=(BYTE*)MapViewOfFile(hMapping1,FILE_MAP_READ,0,0,0);

if(pData1==NULL)

{

MessageBox(L"創建映射視圖1掉敗",L"差錯",MB_OK|MB_ICONERROR);

return;

}

pData2=(BYTE*)MapViewOfFile(hMapping2,FILE_MAP_WRITE,0,0,0);

if(pData2==NULL)

{

MessageBox(L"創建映射視圖2掉敗",L"差錯",MB_OK|MB_ICONERROR);

return;

}

char c1=0x0D;

char c2=0x0A;

for(i=0;iDataNum;i++)

{

sprintf(pStr,"%10d%c%c",*(int*)(pData1+i*4),c1,c2);

memcpy((void*)(pData2+i*12),pStr,12);

}

UnmapViewOfFile(pData1);

Cl網賭新浦金可靠嗎oseHandle(hMapping1);

CloseHandle(hFile1);

UnmapViewOfFile(pData2);

CloseHandle(hMapping2);

CloseHandle(hFile2);

MessageBox(L"創建文本停止",L"信息",MB_OK);

}

免責聲明:以上內容源自網絡,版權歸原作者所有,如有侵犯您的原創版權請告知,我們將盡快刪除相關內容。

您可能還會對下面的文章感興趣:

快三平台开户