C# 何时使用内存映射文件?

C# 何时使用内存映射文件?,c#,memory-mapped-files,C#,Memory Mapped Files,我有一个通过网络接收数据块并将其写入磁盘的应用程序。 一旦接收到所有块,就可以将它们解码/重新组合到它们实际表示的单个文件中 我想知道使用内存映射文件是否有用——首先用于将单个块写入磁盘,其次用于将所有块解码到的单个文件 我个人的感觉是,它可能只对第二种情况有用,有人对此有一些想法吗 编辑: 这是一个C#应用程序,我只计划使用x64版本。 (因此,遇到“最大连续自由空间”问题不应该是相关的)我认为这两种情况都是相关的。只需在内存映射文件中按顺序将单个块写入适当的位置。当然,这只有在您知道每个块应

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

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

我个人的感觉是,它可能只对第二种情况有用,有人对此有一些想法吗

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

我认为这两种情况都是相关的。只需在内存映射文件中按顺序将单个块写入适当的位置。当然,这只有在您知道每个块应该放在哪里时才有用,比如在bittorrent下载程序中。如果您必须执行一些额外的分析以了解数据块应该放在哪里,那么内存映射文件的好处可能没有那么大。

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

在您的情况下,您是否试图获得更好的I/O性能

我不想指出讣告,但维基百科给出了一个很好的情况概述。。。

具体地说

内存映射方法的代价是较小的页面错误——当数据块加载到页面缓存中,但尚未映射到进程的虚拟内存空间时。根据具体情况,内存映射文件I/O实际上可能比标准文件I/O慢很多


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

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

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

此外,内存映射文件可以公开有趣的特性,如写时复制或作为共享内存的基础

对于您的场景,内存映射文件可以帮助您在数据块出现错误时组装文件。但是,您仍然需要提前知道最终的文件大小

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


在.NET 4中,Microsoft增加了对内存映射文件的支持,并且有一些带有示例代码的综合文章,例如:..

好极了,我编辑了我的帖子来详细说明-这将是一个仅限x64的应用程序。有什么优势你认为使用MM文件会给你带来什么?速度通常不是mmap文件的主要优势吗?如果你不能事先为块分配空间,我会将块写入一个物理磁盘,并将它们合并到另一个物理磁盘上,以获得最大的速度。优化磁盘IO时涉及许多因素。这可能会引起兴趣:我的目标是获得更好的IO性能。我现在获得的数据大约为12MB/秒(但在未来会更多),并且需要能够尽快处理数据/将数据写回磁盘。我读过维基百科的文章,我理解阅读时的好处,但我并不清楚向文件写入时的最佳用途和好处,这就是为什么我请求帮助理解它:)我不同意mmf仅用于小视图。在64位系统上,您可以轻松地将视图放在整个文件上。重新定位视图是一项昂贵的IO操作。你说得对。它们可以用于任意大的或整个文件视图,特别是在64位地址空间上。但这并不是它们发光的地方,尤其是当文件只被读取或写入一次时。我的观点是,在这种情况下,异步I/O同样有效,但更难正确实现。