网上都说使用内存映射文件好,但好在哪呢,我这里只针对操作文件。1.减少I/O操作?内存映射文件不管怎样,也要进行一次I/O操作吧,不然怎么把磁盘的内容装载到内存呢?我一次性ReadFile到缓冲区,操作完毕之后再一次性WriteFile,这样不就可以减少I/O操作吗?2.支持大文件?没有谁一次把超大文件装载到内存吧,都是需要一点装载一点,这个不要内存映射文件也可以做到啊。所以我认为在操作文件方面,使用内存映射文件真想不出来能带来什么好处
调试欢乐多
例如,我的程序要引用一个叫a.exe的程序,而a.exe是别人写的我没有源码,但我引用该exe时又不希望别人获得这个exe,只希望别人在我的程序中使用a.exe的功能。此时,只需要将a.exe定义到一个byte数组里面,使用该exe时执行这个数组就可以了,根本不用I/O操作,无读磁盘,效率自然要高些,像调用自己的窗体一样调用a.exe。而且因为是在byte数组里,我可以对该数组任意加密,使用时解密。安全性极高,虽然通过资源res文件可以将a.exe加密后放到资源,但别人用资源提取软件很容易将a.exe提出来。
内存映射首先申请一段地址空间,并映射到物理存储器,而这里的物理存储器就是文件所在的磁盘,类似虚拟内存(pagefile);
当有需要时,程序不需要先把它加到内存,而是直接从磁盘读取。从这里看,IO操作减少了(不需要先加载到内存)
内存映射文件,本质上就和我们打开文件一样,也是将文件从磁盘复制到内存中,但内存映射文件可以选择将哪部分,以及多大映射到内存中,而且这个操作是系统内部完成的,显然要比用程序快. 为什么可以映射大文件,因为它可以一部分一部分映射到内存中,而且是系统内部操作的,所以你感觉和打开了一个大文件一样,但要注意,由于是系统操作,所以如果处理大量小数据反而会造成内存碎片
一次性ReadFile到缓冲区,操作完毕之后再一次性WriteFile
而如果使用内存映射文件,则那段缓冲区是系统做的工作,所以要更快?
内存映射的方式打开文件,你可以按照操作内存指针的方式操作文件,比如你要比较一个文件和另一个文件的内存释放一致,如果你采用读写函数,你首先要打开文件,然后开辟足够大的内存,然后读进来文件的数据然后才比较,而采用内存映射的方式,你可以直接比较两个映射的内存(因为内存映射函数返回的就是一个指针)。
是否使用内存映射,取决于你的应用,I/O效率是一方面,但不是主要方面。
如果单从I/O上说,两者差别不大。该有的I/O谁也省不了。
硬说这方面,那可以说内存映射访问大文件的时候(比如说4G的文件),可以一部分一部分打开并处理。另外,exe文件的加载,windows采用的就是内存映射的方式。这不是说内存映射的方式就多么好,仅仅是方便而已
我觉得你完全就是在钻牛角尖。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是渣?众人皆醉你独醒?还是别的什么?
而采用读写函数的文件操作,至少要经过:把要处理的文件内容加载到系统内存,再从系统内存到用户指定的内存,如果你多次读写文件,就会是多次的这个 加载、复制 的操作。
而内存映射就是加载一次而已,之后就都在内存中并且可以直接使用了。
当然,你也可以说,我一次都加载到一个我给定的内存,然后再处理,那也就差不了多少了。
大文件,频繁读取,这个你说下用和不用File Mapping的区别?
我没有强调不过如此,我是非常客观地在比较。谢谢楼上的,是否是内存映射文件就是少了不必要的内存操作呢?