快捷搜索:  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);

}

免责声明:以上内容源自网络,版权归原作者所有,如有侵犯您的原创版权请告知,我们将尽快删除相关内容。

您可能还会对下面的文章感兴趣: