??xml version="1.0" encoding="utf-8" standalone="yes"?>
关于内存映射文g处理
今天看到一文章讲内存映射文g的处理,虽然自己没有处理q如此大的文件系l,但是好奇׃看了(jin)下,谁知道自׃后会(x)不会(x)用到或考到q方面的知识。所以就l自?/span> mark 一下,增加点自q印象?/span>
首先Q通过 CreateFile() 函数来创建或打开一个文件内核对象,q个对象标识?jin)磁盘?sh)要用作内存映射文g的文件。(其实是获取文件句柄)(j)
其次Q通过 CreateFileMapping() 函数来ؓ(f)刚才创徏的文件内核对象创Z个文件映内核对象ƈ告诉pȝ文g的尺总?qing)访问文件的方式。(获取文g映射内核对象的句柄)(j)
再次Q通过 MapViewOfFile() 函数文件内核映对象添加到q程中。(获取映射内核对象的指针)(j)
接着Q程序就可以通过指针q行常规的文件读取了(jin)Q这里的操作和文g操作一P不做展开?/span>
用完之后Q还得回Ӟ先用 UnmapViewOfFile() 释放映内核对象指针,然后通过 CloseHandle 关闭之前创徏的文件映内核对象句柄和文g内核对象句柄?/span>
以下是我扑ֈ的文章的出处Q?/span> http://newcactus.bokee.com/viewdiary.15316244.html
下面Ua(b)是粘贴别人的作品Q?/span>
中用内存映文件处理大文g
本文l出?jin)一U方便实用的解决大文件的d、存储等处理的方法,q结合相关程序代码对具体的实现过E进行了(jin)介绍?span lang="EN-US">
引言
文g操作是应用程序最为基本的功能之一Q?span lang="EN-US">Win32 API?span lang="EN-US">MFC均提供有支持文g处理的函数和c,常用的有Win32 API?span lang="EN-US">CreateFile()?span lang="EN-US">WriteFile()?span lang="EN-US">ReadFile()?span lang="EN-US">MFC提供?span lang="EN-US">CFilecȝ。一般来_(d)以上q些函数可以满大多数场合的要求Q但是对于某些特D应用领域所需要的动辄几十GB、几?span lang="EN-US">GB、乃臛_TB的v量存储,再以通常的文件处理方法进行处理显然是行不通的。目前,对于上述q种大文件的操作一般是以内存映文件的方式来加以处理的Q本文下面将针对q种Windows核心(j)~程技术展开讨论?span lang="EN-US">
内存映射文g
内存映射文g与虚拟内存有些类|通过内存映射文g可以保留一个地址I间的区域,同时物理存储器提交l此区域Q只是内存文件映的物理存储器来自一个已l存在于盘?sh)的文gQ而非pȝ的页文gQ而且在对该文件进行操作之前必首先对文gq行映射Q就如同整个文件从盘加蝲到内存。由此可以看出,使用内存映射文g处理存储于磁盘(sh)的文件时Q将不必再对文g执行I/O操作Q这意味着在对文gq行处理时将不必再ؓ(f)文g甌q分配缓存,所有的文g~存操作均由pȝ直接理Q由于取消了(jin)文件数据加载到内存、数据从内存到文件的回写以及(qing)释放内存块等步骤Q得内存映文件在处理大数据量的文件时能v到相当重要的作用。另外,实际工程中的pȝ往往需要在多个q程之间׃n数据Q如果数据量,处理Ҏ(gu)是灵zd变的Q如果共享数据容量巨大,那么需要借助于内存映文件来q行。实际上Q内存映文件正是解x(chng)地多个进E间数据׃n的最有效Ҏ(gu)?span lang="EN-US">
内存映射文gq不是简单的文gI/O操作Q实际用C(jin)Windows的核?j)编E技?span lang="EN-US">--内存理。所以,如果惛_内存映射文g有更深刻的认识,必须?span lang="EN-US">Windows操作pȝ的内存管理机制有清楚的认识,内存理的相关知识非常复杂,出?jin)本文的讨论范畴Q在此就不再赘述Q感兴趣的读者可以参阅其他相关书c。下面给Z用内存映文件的一般方法:(x)
首先要通过CreateFile()函数来创建或打开一个文件内核对象,q个对象标识?jin)磁盘?sh)要用作内存映射文g的文件。在?span lang="EN-US">CreateFile()文件映像在物理存储器的位置通告l操作系l后Q只指定?jin)映像文件的路径Q映像的长度q没有指定。ؓ(f)?jin)指定文件映对象需要多大的物理存储I间q需要通过CreateFileMapping()函数来创Z个文件映内核对象以告诉pȝ文g的尺总?qing)访问文件的方式。在创徏?jin)文件映对象后Q还必须为文件数据保留一个地址I间区域Qƈ把文件数据作为映到该区域的物理存储器进行提交。由MapViewOfFile()函数负责通过pȝ的管理而将文g映射对象的全部或部分映射到进E地址I间。此Ӟ对内存映文件的使用和处理同通常加蝲到内存(sh)的文件数据的处理方式基本一P在完成了(jin)对内存映文件的使用Ӟq要通过一pd的操作完成对其的清除和用过资源的释放。这部分相对比较单,可以通过UnmapViewOfFile()完成从进E的地址I间撤消文g数据的映像、通过CloseHandle()关闭前面创徏的文件映对象和文g对象?span lang="EN-US">
内存映射文g相关函数
在用内存映文件时Q所使用?span lang="EN-US">API函数主要是前面提到q的那几个函敎ͼ下面分别对其q行介绍Q?span lang="EN-US">
函数CreateFile()即是在普通的文g操作时也l常用来创徏、打开文gQ在处理内存映射文gӞ该函数来创徏/打开一个文件内核对象,q将其句柄返回,在调用该函数旉要根据是否需要数据读写和文g的共享方式来讄参数dwDesiredAccess?span lang="EN-US">dwShareModeQ错误的参数讄会(x)D相应操作时的p|?span lang="EN-US">
|