VC++中使用内存映射文件处理大文件(1)

VC++中使用内存映射文件处理大文件(1),第1张

VC++中使用内存映射文件处理大文件(1),第2张

简介
文件操作是应用程序最基本的功能之一。Win32 API和MFC都提供了支持文件处理的函数和类,常用的有Win32 API的CreateFile()、WriteFile()、ReadFile()和MFC提供的CFfile类。总的来说,上述功能可以满足大部分场合的要求,但用通常的文件处理方法来处理一些特殊应用领域所需的几十GB、几百GB,甚至几TB的海量存储,显然是不可行的。目前对上述大文件的操作一般都是通过内存映射文件的方式来处理。本文将在下面讨论这种Windows核心编程技术。

内存映射文件
内存映射文件和虚拟内存有些类似,在addresses 空之间的一个区域可以被内存映射文件保留,物理内存可以同时提交到这个区域,只不过内存文件映射的物理内存来自于磁盘上已经存在的一个文件,而不是系统的页面文件,在对其进行操作之前必须对文件进行映射,就像把整个文件从磁盘加载到内存中一样。由此可以看出,使用内存映射文件处理存储在磁盘上的文件时,对文件的I/O操作将是不必要的,也就是说在处理文件时,不需要为文件申请和分配缓存。所有文件缓存操作都由系统直接管理。由于取消了将文件数据加载到内存、将数据从内存写回文件以及释放内存块的步骤,内存映射文件在处理数据量较大的文件时可以发挥非常重要的作用。此外,实际项目中的系统经常需要在多个进程之间共享数据。如果数据量小,处理方式灵活,如果共享数据容量巨大,就需要借助内存映射文件来完成。事实上,内存映射文件是解决本地进程间数据共享问题最有效的方法。

内存映射文件不是简单的文件I/O操作,实际上使用了Windows的核心编程技术——内存管理。所以,想要对内存映射文件有更深入的了解,就必须对Windows操作系统的内存管理机制有一个清晰的认识。内存管理的相关知识非常复杂,超出了本文的讨论范围,在此不再赘述。有兴趣的读者可以参考其他相关书籍。下面给出了使用内存映射文件的一般方法:

首先,通过CreateFile()函数创建或打开一个文件内核对象,该对象标识磁盘上将被用作内存映射文件的文件。用CreateFile()通知操作系统文件镜像在物理内存中的位置后,只指定镜像文件的路径,不指定镜像的长度。为了指定文件映射对象需要多少物理存储空,还需要通过CreateFileMapping()函数创建一个文件映射内核对象,告诉系统文件的大小以及如何访问。创建文件映射对象后,必须为文件数据保留addresses 空之间的区域,并且文件数据必须作为映射到该区域的物理存储提交。MapViewOfFile()函数负责通过系统管理将文件映射对象的全部或部分映射到进程地址空。此时,内存映射文件的使用和处理与通常加载到内存中的文件数据基本相同。当内存映射文件的使用完成后,需要通过一系列的操作来清除它们,释放已使用的资源。这部分比较简单。UnmapViewOfFile()可以用来从进程的地址空撤销文件数据的镜像,CloseHandle()可以用来关闭之前创建的文件映射对象和文件对象。

内存映射文件相关函数
使用内存映射文件时,使用的API函数主要是上面提到的那些,下面介绍:

处理CreateFile(LPCTSTR lpFileName,

DWORD dwDesiredAccess,

DWORD dwShareMode,

LPSECURITY _ ATTRIBUTES lpSecurityAttributes,

DWORD dwCreationDisposition,

DWORD dwFlagsAndAttributes,

处理hTemplateFile);

位律师回复
DABAN RP主题是一个优秀的主题,极致后台体验,无插件,集成会员系统
白度搜_经验知识百科全书 » VC++中使用内存映射文件处理大文件(1)

0条评论

发表评论

提供最优质的资源集合

立即查看 了解详情