2013-03-06 105 views
0

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

应用程序使用一系列大型输入文件来查找位置 - 当应用程序在单个线程中使用时,每个文件都按顺序访问,我想这会变成更随机的访问区域 - 这使得MMF看起来很有价值。

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

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

干杯。

回答

2

如果每个线程专用于一个文件,那么让每个线程为正在处理的一个文件创建自己的MMF是有意义的。仅由单个线程使用的资源更易于在线程内分配和销毁。但是,如果所有线程都从同一个文件读取,那么您不希望创建多个MMF,因为所有将要执行的操作都会乘以消耗的内存量并创建一致性问题(多个视图相同文件的一部分)。

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

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

如果您可以在构建/启动线程之前分配共享资源,那么您通常不需要锁定访问资源,因为资源总是在线程需要它时出现。

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

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

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

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

+0

感谢您的彻底解答!我纯粹处理阅读文件,这不是一个问题,我被要求看看MMF在我的特定实例中的影响,所以我会尝试并尽可能多地实现它,以便理解和好奇。道歉,如果我误解,你说我最好通过一个指针,MSDN文章使用“OpenExisting”在创建时给出的名称 - 有没有办法测试是否存在该名称的MMF?我不知道我将使用哪些文件,直到我已经进入线程为止,因为它现在写入的时间太晚了。 – 2013-03-06 17:09:30

+0

对不起,指针参考 - 旧的Win32本地代码习惯很难实现。 ;> – dthorpe 2013-03-06 21:00:13

+1

我的建议是,如果所有线程都将使用同一个文件并且只读取数据,那么您可能在所有线程中只使用一个MMF实例。例如,在线程启动之前调用MMF.CreateFromFile一次,并将该MMF对象实例与所有线程共享 - 例如,将MMF对象填充到线程可以到达的静态变量中。如果您不打算使用MMF的多个视图,那么您可能也可以在所有线程中共享一个视图。 – dthorpe 2013-03-06 21:04:06

0

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

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

+0

MSDN文章使用“OpenExisting” - 如果你知道该文件已经存在,这个工作原理,在我的情况下,我不知道我会需要什么。 有什么方法可以测试文件是否已经打开? – 2013-03-06 16:38:17

+0

对此,您需要使用FileStream.Open()进行检查。 [这里](http://stackoverflow.com/questions/876473/is-there-a-way-to-check-if-a-file-is-in-use)是SO的一个条目。 – 2013-03-06 16:43:48