内存映射文件使用情况

本文关键字:用情 情况 文件 映射 内存 | 更新日期: 2023-09-27 18:02:40

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

应用程序使用一系列大的输入文件来查找位置—当应用程序在单个线程上使用时,每个文件都是顺序访问的,我猜这偏离了更随机的访问领域—这使得MMF看起来很有价值。

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

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

欢呼。

内存映射文件使用情况

如果每个线程专用于一个文件,那么让每个线程为它正在处理的一个文件创建自己的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子系统更方便。使用一种技术并没有错,因为它对开发人员来说既简单又方便,只要你承认这个事实。

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

您需要同步对进程中文件的访问。在每个线程中重新打开文件没有多大意义,特别是在讨论"较大"的文件(几个MB)时。MSDN提供了一篇关于你的话题的文章,希望对你有所帮助。