2009-12-07 99 views
40

我有一个应用程序通过网络接收数据块,并将这些数据写入磁盘。 一旦收到所有块,它们可以被解码/重组到他们实际表示的单个文件中。何时使用内存映射文件?

我想知道是否使用内存映射文件是有用的 - 第一个用于将单个块写入磁盘,第二个用于解码全部文件的单个文件。

我自己的感觉是,它可能只对第二种情况有用,任何人都有这方面的想法?

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

+0

良好的通话,我编辑了我的文章详细说明 - 这将是一个x64专用的应用程序。 – Pygmy 2009-12-07 10:51:20

+1

你认为使用MM文件会给你什么好处? – 2009-12-07 10:52:50

+0

速度通常不是mmap文件的主要优势吗? – 2009-12-07 11:00:18

回答

25

内存映射文件是用于其中需要被重复访问的一个相当大的文件的相对小的部分(视图)的方案是有益的。

在这种情况下,操作系统可以帮助优化通过寻呼应用的总体内存使用和分页行为和退出的只是映射文件的最近使用的部分。

此外,存储器映射文件可以暴露有趣的特性如写入时复制或用作共享存储器的基础。

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

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

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

+4

我不同意mmf只适用于小视图。在64位系统上,您可以轻松地查看整个文件。重新定位视图是一项昂贵的IO操作。 – 2009-12-07 13:15:58

+2

你说得对。它们可以用于任意大或全文视图,特别是在64位地址空间上。但这并不是他们发光的地方,特别是当文件只被读取或写入一次时。我的观点是,在这种情况下,异步I/O将同样高效,但难以正确实现。 – user33675 2009-12-07 21:59:57

3

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

12

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

就你而言,你是否想要获得更好的I/O性能?

讨厌指出obivious,但维基百科给出的状况很破败...... http://en.wikipedia.org/wiki/Memory-mapped_file

具体...

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

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

+2

我的目标是提高IO性能。 我现在正以12MB /秒左右的速度获得数据(但将来会更多),并且需要能够尽快处理/将其写回磁盘。 我已经阅读了维基百科的文章,并且我明白阅读的好处,但是写*文件的最佳用途和好处并不完全清楚,这就是为什么我要求理解它的原因: ) – Pygmy 2009-12-07 11:41:02