与使用 CreateFile ReadFile 组合执行相同操作相比,使用内存映射文件读取(常规大小的文件)有哪些缺点(如果有)?
3 回答
使用 ReadFile/WriteFile,您可以获得确定性的错误处理语义。当您使用内存映射文件时,会通过抛出异常来返回错误。
此外,如果内存映射文件必须访问磁盘(或更糟糕的是,网络),您的内存读取可能需要几秒钟(甚至几分钟)才能完成。根据您的应用程序,这可能会导致意外停顿。
如果您使用 ReadFile/WriteFile,您可以使用 API 的异步变体来控制此行为。
如果您使用 ReadFile,您还可以获得更多的确定性性能,特别是如果您的 I/O 模式是可预测的 - 内存映射 I/O 通常是随机的,而 ReadFile 几乎总是串行的(因为 ReadFile 在当前文件位置读取并推进当前文件位置)。
文件映射的一大优点是它不会影响系统缓存。如果您的应用程序通过 ReadFile 进行过多的 I/O,您的系统缓存将增长,消耗越来越多的物理内存。如果您的操作系统是 32 位并且您的内存远远超过 1GB,那么您就很幸运了,因为在 32 位 Windows 上,系统缓存的大小受到 1GB 的限制。否则系统缓存将消耗所有可用的物理内存,并且内存管理器将很快开始将其他进程的页面清除到磁盘,从而加强磁盘操作而不是实际减少它们。这种效果在 64 位 Windows 上尤为明显,其中缓存大小仅受可用物理内存的限制。另一方面,文件映射不会导致系统缓存过度增长,同时不会降低性能。
您需要更复杂的代码来建立文件映射,而不仅仅是打开和读取。文件映射旨在随机访问文件的一部分。如果您不需要它,请不要打扰文件映射。
此外,如果您需要将您的代码移植到另一个平台上,如果您不使用文件映射,您会更容易、更快地完成它。