内存映射文件用法

时间:2013-03-06 16:17:23

标签: c#

我目前正试图了解内存映射文件,并可能在我的应用程序中实现它们。

应用程序使用一系列大型输入文件来查找位置 - 当应用程序在单个线程上使用时,每个文件都是按顺序访问的,我猜这会进入更随机的访问区域 - 这使得MMF看起来值得。 / p>

我对使用情况有点困惑 - 我应该在每个线程中新建一个MMF吗?我知道他们可以共享相同的底层文件,所以看起来我想要在所有线程中使用相同的文件,然后只是在每个线程上创建一个到该MMF的视图。

如果我只应为每个文件创建一个,那么有一种方法可以测试MMF是否已经创建 - 通过已分配的名称或其他方式来防止尝试打开多个地图到同一个文件或我是否需要知道线程中将使用哪些文件并传入已创建的实例以防止重复?

干杯。

2 个答案:

答案 0 :(得分:2)

如果每个线程专用于一个文件,那么让每个线程为它正在处理的一个文件创建自己的MMF可能是有意义的。仅由单个线程使用的资源在线程中更容易分配和销毁。

但是,如果所有线程都从同一个文件读取,那么您不希望创建多个MMF,因为所有这些都会增加所消耗的内存量并产生一致性问题(同一部分的多个视图)该文件)。

对于在同一文件上运行的多个线程,您应该创建一次MMF并与多个线程共享MMF指针。

在多线程情况下按需分配变得非常复杂,并且通常归结为需要锁定对受保护资源的每次访问。要求锁定可以快速破坏运行多个独立线程的任何性能优势,如果它们都必须排队等待访问共享资源。

如果您可以在构造/启动线程之前分配共享资源,那么您通常不需要锁定访问资源,因为资源在线程需要时始终存在。

所以,我会考虑在线程旋转之前分配MMF,并在没有锁的情况下跨所有线程共享MMF指针。

这也假定文件是严格只读的 - 多个线程永远不会写回文件或MMF。多个线程可以共享指向公共内存区域/ MMF的指针,以进行只读访问,而不会出现任何线程并发问题。

与传统的缓冲文件访问相比,请注意您对MMF性能的假设。如果您的整个文件数据非常适合可用RAM,那么MMF可以比缓冲文件I / O更适合随机访问模式。如果文件数据比可用RAM大得多,则缓冲文件I / O可以比使用MMF更适合随机访问。为什么?因为MMF对记忆的使用很苛刻。 MMF只能以4k页面大小的块加载数据。缓冲文件I / O可以根据您的实际数据大小需求和模式进行更精细的调整。如果您的应用程序从文件中的100个不同的广泛分离位置加载512字节的数据,则MMF将必须加载4k * 100 = 400k字节的数据,即使您只需要512 * 100 = 50k的数据。在这种数据访问模式/用例中,MMF需要比传统文件I / O多10倍的数据传输和内存消耗。

MMF的主要吸引力往往是开发人员的便利而不是原始性能。从MMF支持的指针读取对于开发人员来说通常比​​编写和调整面向块的文件I / O子系统更方便。使用技术没有任何问题,因为只要你承认这个事实,它对开发人员来说既简单又方便。

答案 1 :(得分:0)

进程的线程始终共享相同的地址空间,这意味着每个线程都可以访问整个进程“全局”的对象和资源。

您需要同步对流程中文件的访问权限。在每个线程中重新打开文件没有多大意义,特别是在谈论“更大”的数量(几MB)时。 MSDN提供了一篇关于您主题的文章,希望有所帮助。