读书人

关于内存映射文件的理解,该如何处理

发布时间: 2012-05-16 11:12:12 作者: rapoo

关于内存映射文件的理解
内存映射文件 是不是 和虚拟内存机制 差不多

不同之处 系统程序 缺页时 虚拟内存机制 是磁盘虚拟内存区(如果虚拟内存中没有,就从物理磁盘调入虚拟内存)中调入新的页面 以继续程序的正常执行

而 内存映射 是发现缺页时候,是直接从磁盘调入内存

我理解有没有问题?


[解决办法]
http://blog.csdn.net/huangxiaoke2000/archive/2006/08/04/1017968.aspx
[解决办法]
一般都说内存映射文件和虚拟内存机制差不多。
一个很大的文件,通过CreateFileMapping建立内存映射文件无论多大的文件总是可以的,但是MapViewOfFile只能将文件有限的一部分映射到内存。这时可以理解成申请了一块内存空间,以移动窗口方式和文件的任意部分对应。对于这块内存Windows仍然用其内存管理机制管理,不用的时候还可以交换到页面文件,就是说内存映射文件和虚拟内存管理分两个层次进行。哈哈,注意了我上面说的都是我做的假设,没有资料这么说过,但是我在这假设前提下做的好像还都管用,解决问题才是主要的,管它什么机理。
对映射部分内存的操作速度不用怀疑,非常快。但是要关闭内存映射或者Flush到硬盘上的时候就惨了。楼主你的8G的文件就这么说吧,几乎是不能容忍。这个不但是内存映射文件的问题,主要还是文件太大文件传输时超过OS的性能极限。要是再大,超过几百个G内存映射没问题文件系统也受不了。
我的建议是将你的大文件拆分成一系列的瓦块文件,虽然复杂一些,但是可行。信哥的吧,没错。
[解决办法]
参考讨论贴:
http://topic.csdn.net/u/20100122/00/65762DAD-998A-49F2-A5AA-CC8B00372F23.html

希望对你的疑问有所启发。
[解决办法]

探讨

引用18楼说的:
“不断更改MapView,缓冲区满了以后内容交换的磁盘文件上,或者关闭的时候也将其全部写到磁盘文件上。按照我这种推断,即使不关闭映射,仅更改MapView也能导致磁盘文件的更新”

我也有这样的想法,但这点很重要,基本上我看的资料“都没有提到这点:当修改量达到一定时写回磁盘”,而都只是说只有在关闭映射文件对象或者显示flush的时候才写会磁盘,但这想这显然是不合理的,数据……

[解决办法]
如果不flush或者关闭文件,不会有任何更改的数据写入盘文件
Mapping不时缓存机制,而是一个映像机制

读书人网 >VC/MFC

热点推荐