我有一个通过网络接收数据块的应用程序,并将这些数据写入磁盘。 一旦收到所有块,就可以将它们解码/重新组合成它们实际代表的单个文件。
我想知道是否使用内存映射文件是有用的 - 首先是将单个块写入磁盘,第二个是单个文件,所有这些文件都被解码。
我自己的感觉是,它可能仅对第二种情况有用,任何人都对此有所了解?
编辑: 这是一个C#应用程序,我只计划一个x64版本。 (因此,遇到“最大的可用自由空间”问题应该不相关)
答案 0 :(得分:27)
内存映射文件对于需要重复访问相当大的文件的较小部分(视图)的情况是有益的。
在这种情况下,操作系统可以通过仅调度和调出映射文件中最近使用的部分来帮助优化应用程序的整体内存使用和分页行为。
此外,内存映射文件可以暴露有趣的功能,例如写时复制或作为共享内存的基础。
对于您的方案,如果块无序到达,则内存映射文件可以帮助您组装文件。但是,您仍需要提前知道最终文件大小。
此外,您应该只访问一次文件,以便编写块。因此,与显式实现的异步I / O相比,性能优势不太可能,但是正确实现文件编写器可能更容易,更快捷。
在.NET 4中,Microsoft添加了对内存映射文件的支持,并且有一些包含示例代码的综合文章,例如: http://blogs.msdn.com/salvapatuel/archive/2009/06/08/working-with-memory-mapped-files-in-net-4.aspx
答案 1 :(得分:12)
内存映射文件主要用于进程间通信或I / O性能改进。
在您的情况下,您是否尝试获得更好的I / O性能?
讨厌指出这一点,但维基百科给出了一个很好的概述...... http://en.wikipedia.org/wiki/Memory-mapped_file
...具体
内存映射方法在次要页面错误中有成本 - 当一个数据块加载到页面缓存中但尚未映射到进程的虚拟内存空间时。根据具体情况,内存映射文件I / O实际上可能比标准文件I / O慢得多。
听起来你要过早地优化速度。为什么不采用常规文件方法,然后在需要时重构MM文件?
答案 2 :(得分:3)
我会说两种情况都是相关的。只需将单个块写入内存映射文件中的适当位置,就会出现问题。这当然只有在知道每个块的位置时才有用,就像在bittorrent下载器中一样。如果你必须执行一些额外的分析来知道块应该去哪里,那么内存映射文件的好处可能不会那么大。