何时使用内存映射文件?

Pyg*_*gmy 43 c# memory-mapped-files

我有一个应用程序通过网络接收数据块,并将这些数据写入磁盘.一旦收到所有块,就可以将它们解码/重新组合成它们实际代表的单个文件.

我想知道是否使用内存映射文件是有用的 - 首先是将单个块写入磁盘,第二个是单个文件,所有这些文件都被解码.

我自己的感觉是它只对第二种情况有用,有人对此有所了解吗?

编辑:这是一个C#应用程序,我只是计划一个x64版本.(因此,遇到'最大的可用自由空间'问题应该不相关)

use*_*675 27

内存映射文件对于需要重复访问相当大的文件的较小部分(视图)的情况是有益的.

在这种情况下,操作系统可以通过仅分页进出映射文件的最近使用部分来帮助优化应用程序的整体内存使用和分页行为.

此外,内存映射文件可以暴露有趣的功能,例如写时复制或作为共享内存的基础.

对于您的方案,如果块不按顺序到达,则内存映射文件可以帮助您组装文件.但是,您仍需要提前知道最终文件大小.

此外,您应该只访问文件一次,以编写块.因此,与显式实现的异步I/O相比,性能优势不太可能,但是正确实现文件编写器可能更容易,更快捷.

在.NET 4中,Microsoft添加了对内存映射文件的支持,并且有一些包含示例代码的综合文章,例如http://blogs.msdn.com/salvapatuel/archive/2009/06/08/working-with-memory- mapped-files-in-net-4.aspx.

  • 我不同意mmf只适用于小视图.在64位系统上,您可以轻松地在整个文件上放置视图.重新定位视图是一项昂贵的IO操作. (4认同)
  • 你是对的.它们可用于任意大或全文件视图,特别是在64位地址空间.但是,这不是它们发光的地方,特别是当文件只被读取或写入一次时.我的观点是,在这种情况下,异步I/O将同样有效,但更难以正确实现. (2认同)

ker*_*vin 12

内存映射文件主要用于进程间通信或I/O性能改进.

在您的情况下,您是否想要获得更好的I/O性能?

讨厌指出这一点,但维基百科给出了一个很好的概述...... http://en.wikipedia.org/wiki/Memory-mapped_file

特别...

内存映射方法在次要页面错误中有成本 - 当一个数据块加载到页面缓存中但尚未映射到进程的虚拟内存空间时.根据具体情况,内存映射文件I/O实际上可能比标准文件I/O慢得多.

听起来你即将过早地优化速度.为什么不采用常规文件方法,然后在需要时重构MM文件?

  • 我的目标是提高IO性能.我现在获得大约12MB /秒的数据(但将来会更多)并且需要能够尽快处理它/将其写回磁盘.我已经阅读了维基百科的文章,我理解阅读时的好处,但是*写*文件时的最佳用途和好处对我来说并不是很清楚,这就是为什么我要求帮助理解它:) (2认同)