文件的内存映射与CreateFile / ReadFile

时间:2009-03-13 05:57:13

标签: windows winapi memory-mapped-files

使用内存映射文件读取(常规大小的文件)而使用CreateFile ReadFile组合执行相同操作有什么缺点(如果有的话)?

3 个答案:

答案 0 :(得分:13)

使用ReadFile / WriteFile,您可以获得确定性错误处理语义。使用内存映射文件时,抛出异常会返回错误。

此外,如果内存映射文件必须访问磁盘(或者更糟糕的是网络),则内存读取可能需要几秒钟(甚至几分钟)才能完成。根据您的应用程序,这可能会导致意外停顿。

如果您使用ReadFile / WriteFile,您可以使用API​​的异步变体来控制此行为。

如果你使用ReadFile,你也有更多确定性的性能,特别是如果你的I / O模式是可预测的 - 内存映射I / O通常是随机的,而ReadFile几乎总是串行的(因为ReadFile读取当前文件的位置并提前当前文件位置)。

答案 1 :(得分:3)

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

答案 2 :(得分:2)

您需要更复杂的代码来建立文件映射,而不仅仅是打开和读取。文件映射旨在随机访问文件的一部分。如果您不需要,请不要打扰文件映射。

此外,如果您需要将代码移植到另一个平台上,如果不使用文件映射,则可以更轻松,更快速地完成。