MMF (memory mapping file)

1. 对于小文件,windows提供的一般读取文件的方法完全够用了,而且performance, capacity都还可以。做法一般都是:一次把整个文件读取到内存中,再在内存中对其进行读取;主要是通过一次读取来减少I/O操作所带来的performance损耗。

2. 对于大文件,尤其是动辄几G,十几G的文件(CAD文件是典型的一类),常规方法就不行了。很明显的一点就是:一次读取到内存,空间不够用了(<2G的进程空间可供使用;你也不可能全用了)windows提供了MMF(内存映射文件)机制来解决这种情况。具体API的使用这里略。只列一下读取huge file的一般思路:

1)映射文件开头的映像。
2)对该映像进行访问。
3)取消此映像
4)映射一个从文件中的一个更深的位移开始的新映像。
5)重复步骤2,直到访问完全部的文件数据。

内存映射文件概述

内存文件映射也是Windows的一种内存管理方法,提供了一个统一的内存管理 特征,使应用程序可以通过内存指针对磁盘上的文件进行访问,其过程就如同对加载了文件的内存的访问。通过文件映射这种使磁盘文件的全部或部分内容与进程虚 拟地址空间的某个区域建立映射关联的能力,可以直接对被映射的文件进行访问,而不必执行文件I/O操作也无需对文件内容进行缓冲处理。内存文件映射的这种 特性是非常适合于用来管理大尺寸文件的。使用内存映射文件的3个目的:

(1)            系统使用内存映射文件来加载和执行.exe和dll文件。这极大的节省了系统页文件空间,也缩短了启动应用程序所需的时间。
(2)            使用内存映射文件访问磁盘上的数据。这既避免了对文件执行文件I/O(输入/输出)操作,也避免了为文件的内容申请缓冲区。
(3)            使用内存映射文件在多个进程间共享数据。Windows也提供了其他进行间通讯的方法-但是这些方法都是使用内存映射文件实现的。
3.  both native win32 and .net 4.0 support using MMF directly. Boost library has its implementation.

参考:

http://blogguan.blog.sohu.com/77220236.html

http://msdn.microsoft.com/en-us/library/ms810613.aspx

http://msdn.microsoft.com/en-us/library/dd997372.aspx

原文地址:https://www.cnblogs.com/taoxu0903/p/1970983.html