关于使用内存映射文件的优点

土豆吞噬者 2010-08-05 01:26:56
网上都说使用内存映射文件好,但好在哪呢,我这里只针对操作文件。

1.减少I/O操作?内存映射文件不管怎样,也要进行一次I/O操作吧,不然怎么把磁盘的内容装载到内存呢?我一次性ReadFile到缓冲区,操作完毕之后再一次性WriteFile,这样不就可以减少I/O操作吗?

2.支持大文件?没有谁一次把超大文件装载到内存吧,都是需要一点装载一点,这个不要内存映射文件也可以做到啊。

所以我认为在操作文件方面,使用内存映射文件真想不出来能带来什么好处。。。
...全文
2445 23 打赏 收藏 转发到动态 举报
写回复
用AI写文章
23 条回复
切换为时间正序
请发表友善的回复…
发表回复
土豆吞噬者 2010-08-05
  • 打赏
  • 举报
回复
CPU怎么直接读磁盘 有这个指令吗 且不说磁盘的速度有多慢 如果不放入内存 程序怎么读取内容

http://www.cnblogs.com/chuncn/archive/2009/04/15/1427662.html

这里做了比较 但是第二个例子 多次调用了readfile和writefile才会造成速度变慢了,而我是只做一次readfile和writefile
Jekhn 2010-08-05
  • 打赏
  • 举报
回复
楼主的问题关键就在于,内存映射是不是用到物理内存。根据我的理解是不载入内存的,所以才叫内存映射,把磁盘上的文件映射到进程的地址空间里面。所以就省去cpu到内存再到磁盘,而是直接cpu到磁盘,这样就省去一个环节了,所以减少了IO操作。另外你上面说的CPU读磁盘,其实是可以的就是虚拟内存了,比如你的内存只有1G,但是可以访问到4G的空间,其实就是虚拟内存,页面文件磁盘上面的空间,个人理解,仅供参考
土豆吞噬者 2010-08-05
  • 打赏
  • 举报
回复
刚又看了下 映射不会分配内存?那么难道CPU直接去读磁盘?不可能吧 不经过内存怎么行
土豆吞噬者 2010-08-05
  • 打赏
  • 举报
回复
我可以这样理解内存映射文件吗?(我只针对操作文件,进程通信什么的我不关心)
一次性ReadFile到缓冲区,操作完毕之后再一次性WriteFile
而如果使用内存映射文件,则那段缓冲区是系统做的工作,所以要更快?
土豆吞噬者 2010-08-05
  • 打赏
  • 举报
回复
http://topic.csdn.net/u/20100524/21/caecedaa-2623-4d59-9ea1-40f03decc31f.html


内存映射文件,本质上就和我们打开文件一样,也是将文件从磁盘复制到内存中,但内存映射文件可以选择将哪部分,以及多大映射到内存中,而且这个操作是系统内部完成的,显然要比用程序快.

为什么可以映射大文件,因为它可以一部分一部分映射到内存中,而且是系统内部操作的,所以你感觉和打开了一个大文件一样,但要注意,由于是系统操作,所以如果处理大量小数据反而会造成内存碎片
gyk120 2010-08-05
  • 打赏
  • 举报
回复
其实就是虚拟内存的一种运用技术,楼主为什么不去查处相关的资料?《Wndows核心编程》上面说的应该够详细了
yunyun050924 2010-08-05
  • 打赏
  • 举报
回复
那个不是进程通信的一种方式吗??
金卯刀 2010-08-05
  • 打赏
  • 举报
回复
内存映射,并不是将文件加载到内存。
内存映射首先申请一段地址空间,并映射到物理存储器,而这里的物理存储器就是文件所在的磁盘,类似虚拟内存(pagefile);
当有需要时,程序不需要先把它加到内存,而是直接从磁盘读取。从这里看,IO操作减少了(不需要先加载到内存)
池龙 2010-08-05
  • 打赏
  • 举报
回复
网上说姚明很厉害,但是厉害在哪里呢?我觉得他跑步跨栏拳击都很稀松平常嘛。
无条件为你 2010-08-05
  • 打赏
  • 举报
回复
楼主你只给这一点分,看来是没有诚意交流。我也只能简单说一方面了:

内存映射文件的优点在于可以保密文件。可以减少I/O操作。但文件过大的话并不推荐使用。
例如,我的程序要引用一个叫a.exe的程序,而a.exe是别人写的我没有源码,但我引用该exe时又不希望别人获得这个exe,只希望别人在我的程序中使用a.exe的功能。此时,只需要将a.exe定义到一个byte数组里面,使用该exe时执行这个数组就可以了,根本不用I/O操作,无读磁盘,效率自然要高些,像调用自己的窗体一样调用a.exe。而且因为是在byte数组里,我可以对该数组任意加密,使用时解密。安全性极高,虽然通过资源res文件可以将a.exe加密后放到资源,但别人用资源提取软件很容易将a.exe提出来。
bdmh 2010-08-05
  • 打赏
  • 举报
回复
你的理解只限于加载文件一级,所以你觉得没什么必要,其实内存映射可以应用到很多地方,比如跨进程数据共享等,自己阅读一下相关的资料吧,如果内存映射只是为了加载文件,那根本没必要搞这么个技术出来唬人
wxieyang 2010-08-05
  • 打赏
  • 举报
回复
这个我没有测试过,因为如果你的文件太小,估计肯定测试不出来,比如,你的文件小于windows的一个内存交换页,那么不管你怎么读,肯定也是被一次读进来了。再者 windows 本身还有内存缓冲机制,常用的数据会被缓冲在内存中,再次读取的时候,会直接从缓冲中读而不是访问慢速的磁盘设备,所以普通的测试有时候得到的时间不一定就是多次i/o的时间。

其实,没必要执着于某种应用,关键还是看实际的应用,虽然说我知道内存映射要比文件读写函数有这样那样的好处,但是,我还是经常使用 TFileStream 或者 TMemoryStream 来操作文件。原因就是用起来方便。

当然了,如果效率问题是首要问题,还是要考虑考虑使用什么技术的。
土豆吞噬者 2010-08-05
  • 打赏
  • 举报
回复
如果是那样的话,那我以后都用内存映射来读取了,能快一点就是一点嘛
土豆吞噬者 2010-08-05
  • 打赏
  • 举报
回复
我使用一个技术,这个技术不能带给我任何好处,我为什么要用它?
大文件,频繁读取,这个你说下用和不用File Mapping的区别?
我没有强调不过如此,我是非常客观地在比较。

谢谢楼上的,是否是内存映射文件就是少了不必要的内存操作呢?
wxieyang 2010-08-05
  • 打赏
  • 举报
回复
采用内存映射,好多操作字符串的函数可以直接使用,比如StrCopy move CompareMem 等所有可以接受PChar或者Pointer的函数都可以直接使用而不需要先读到另外的内存再处理。
而采用读写函数的文件操作,至少要经过:把要处理的文件内容加载到系统内存,再从系统内存到用户指定的内存,如果你多次读写文件,就会是多次的这个 加载、复制 的操作。
而内存映射就是加载一次而已,之后就都在内存中并且可以直接使用了。
当然,你也可以说,我一次都加载到一个我给定的内存,然后再处理,那也就差不了多少了。
池龙 2010-08-05
  • 打赏
  • 举报
回复
[Quote=引用 11 楼 xiongya8888 的回复:]
CPU怎么直接读磁盘 有这个指令吗 且不说磁盘的速度有多慢 如果不放入内存 程序怎么读取内容

http://www.cnblogs.com/chuncn/archive/2009/04/15/1427662.html

这里做了比较 但是第二个例子 多次调用了readfile和writefile才会造成速度变慢了,而我是只做一次readfile和writefile
[/Quote]

我觉得你完全就是在钻牛角尖。

File mapping allows the process to use both random input and output (I/O) and sequential I/O. It also allows the process to work efficiently with a large data file, such as a database, without having to map the whole file into memory. Multiple processes can also use memory-mapped files to share data.

任何技术都有其适用环境,没有什么东西是适用全部环境的。你非要排开多进程间共享数据吧,也行,那对于文件操作,也都是说File Mapping是对于大型文件和频繁读写的情况下有优势。

这么多人回帖告诉了你它的适用范围,你还坚持要找一个它并无优势的环境(单进程,只作一次Read和Write),然后强调它也不过如此。那你又希望得到什么答案呢?File Mapping是渣?众人皆醉你独醒?还是别的什么?
tologo 2010-08-05
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 mwy654321 的回复:]
楼主你只给这一点分,看来是没有诚意交流。我也只能简单说一方面了:

[/Quote]

我发现你在哪里回帖子都喜欢说别人分少
我们需要的是交流,大家一起进步
你要是真那么喜欢分
开个马甲刷快的很
wxieyang 2010-08-05
  • 打赏
  • 举报
回复
内存映射操作文件和文件读写函数操作文件两种操作文件的方式
内存映射的方式打开文件,你可以按照操作内存指针的方式操作文件,比如你要比较一个文件和另一个文件的内存释放一致,如果你采用读写函数,你首先要打开文件,然后开辟足够大的内存,然后读进来文件的数据然后才比较,而采用内存映射的方式,你可以直接比较两个映射的内存(因为内存映射函数返回的就是一个指针)。
是否使用内存映射,取决于你的应用,I/O效率是一方面,但不是主要方面。
如果单从I/O上说,两者差别不大。该有的I/O谁也省不了。
硬说这方面,那可以说内存映射访问大文件的时候(比如说4G的文件),可以一部分一部分打开并处理。

另外,exe文件的加载,windows采用的就是内存映射的方式。这不是说内存映射的方式就多么好,仅仅是方便而已
土豆吞噬者 2010-08-05
  • 打赏
  • 举报
回复
楼上的我这里可没说过WriteFile之后就关闭文件句柄
  • 打赏
  • 举报
回复
打开一个数据库连接,然后多次操作,然后关闭效率高呢,还是打开一个数据库连接,然后操作一次关闭,然后再打开……经过多次快呢?
加载更多回复(3)

1,183

社区成员

发帖
与我相关
我的任务
社区描述
Delphi Windows SDK/API
社区管理员
  • Windows SDK/API社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧