文件的内存映射与CreateFile/ReadFile的区别

16

使用内存映射文件读取(常规大小的文件)相较于使用CreateFile和ReadFile组合读取,有哪些缺点(如果有)?

3个回答

13
使用ReadFile/WriteFile可以具有确定性的错误处理语义。当使用内存映射文件时,错误通过抛出异常来返回。
此外,如果内存映射文件需要访问磁盘(甚至更糟的是网络),您的内存读取可能需要几秒钟(甚至几分钟)才能完成。根据您的应用程序,这可能会导致意外的停顿。
如果使用ReadFile/WriteFile,您可以使用API的异步变体来控制此行为。
如果使用ReadFile,您还可以获得更确定性的性能,特别是如果您的I/O模式是可预测的 - 内存映射I/O通常是随机的,而ReadFile几乎总是串行的(因为ReadFile在当前文件位置读取并推进当前文件位置)。

3
文件映射的一个重要优势在于它不会影响系统缓存。如果您的应用程序通过ReadFile进行过多的I/O操作,那么您的系统缓存将增长,消耗越来越多的物理内存。如果您的操作系统是32位的,并且您拥有超过1GB的内存,那么您很幸运,因为在32位Windows上,系统缓存的大小被限制为1GB。否则,系统缓存将消耗所有可用的物理内存,并且内存管理器很快就会开始将其他进程的页面清除到磁盘上,加剧磁盘操作而不是减轻它们。这种影响在64位Windows上尤其明显,因为缓存大小仅受可用物理内存的限制。另一方面,文件映射不会导致系统缓存过度增长,同时也不会降低性能。

你有这方面智慧或相关材料的来源吗?我是说,这很可能是情况,但从我所阅读的内容来看,“系统缓存”听起来有点模糊,我们是否在谈论在被交换出去之前积累的文件数据页面? - Armen Michaeli
1
这段内容与我们团队在进行密集磁盘I/O时的经验有关。在使用映射文件之前,我们遇到了一些问题。使用映射文件后,性能得到了提升,内存占用也降低了。我无法提供更多细节,因为这已经是大约10年前的事情了,我只是记不清楚了。 :) - facetus

2

对于建立文件映射,您需要比仅打开和读取更复杂的代码。文件映射旨在随机访问文件的某个部分。如果您不需要这个功能,就不要费心使用文件映射。

此外,如果您需要将代码移植到另一个平台上,如果不使用文件映射,您将更容易且更快地完成该操作。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接