微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

内存映射文件vs CreateFile / ReadFile

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

C ++:读取/从内存映射文件获取数据

msync()写入文件只改变了页面或整个caching的缓冲区?

如何使用Linux hugetlbfs共享文件的内存映射?

C ++ MapViewOfFile失败

使用boost :: iostreams :: mapped_file

用ReadFile / WriteFile你有确定性的错误处理语义。 当您使用内存映射文件时,通过抛出异常返回错误

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

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

如果您使用ReadFile,尤其是在您的I / O模式可预测的情况下,您也具有更多的确定性性能 – 内存映射I / O通常是随机的,而ReadFile几乎总是串行的(因为ReadFile在当前文件位置读取并推进当前文件位置)。

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

另外,如果需要将代码移植到另一个平台上,如果不使用文件映射,则会更容易,更快速地完成。

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

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。

相关推荐