何时使用内存映射文件?

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

我想知道是否使用内存映射文件是有用的 – 首先将单个块写入磁盘,其次是单个文件,所有这些文件都解码。

我自己的感觉是,对于第二种情况可能是有用的,任何人都有这个想法吗?

编辑:这是一个C#应用程序,我只计划一个x64版本。 (所以遇到“最大的可疑空间”问题应该是不相关的)

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

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

此外,内存映射文件可以显示有趣的function,如写时复制或作为共享内存的基础。

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

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

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

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

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

讨厌指出明显,但维基百科提供了一个很好的情况下的情况… http://en.wikipedia.org/wiki/Memory-mapped_file

特别…

内存映射方法的代价是轻微的页面错误 – 当一个数据块加载到页面caching中,但还没有映射到进程的虚拟内存空间时。 内存映射文件I / O实际上可能比标准文件I / O慢得多。

这听起来像你即将过早地优化速度。 为什么不是一个常规的文件方法,然后在需要时重构MM文件呢?

我想说这两种情况都是相关的。 简单地将单个块写入内存映射文件中的适当位置,当它们进来时,这些块不合适。当然这只有在您知道每个块应该放在哪里的时候才有用,就像在一个bittorrent下载器中一样。 如果您必须执行一些额外的分析才能知道块的位置,则内存映射文件的好处可能不会太大。