C#内存映射文件不';不要占用物理内存空间

C#内存映射文件不';不要占用物理内存空间,c#,shared-memory,mmf,C#,Shared Memory,Mmf,我试图在物理内存中缓存大量数据,并为本地环境中的其他进程共享它们。所以我想到了MMF,阅读并看到了一些示例,并开始像这样调整代码 MemoryMappedFile MMF = MemoryMappedFile.CreateNew("Features", MaxSize); . . . using (MemoryMappedViewStream stream = MMF.CreateViewStream()) { BinaryWriter write = new BinaryWriter

我试图在物理内存中缓存大量数据,并为本地环境中的其他进程共享它们。所以我想到了MMF,阅读并看到了一些示例,并开始像这样调整代码

MemoryMappedFile MMF = MemoryMappedFile.CreateNew("Features", MaxSize);
.
.
.
using (MemoryMappedViewStream stream = MMF.CreateViewStream())
{
     BinaryWriter write = new BinaryWriter(stream);
     .
     .
     .
     // Fetched the data from database and store it into Rowdata variable.
     while (Rowdata.Read())
     {
          byte[] data = Rowdata.GetFieldValue<byte[]>(0);
          write.Write(data);
     }
}
MemoryMappedFile MMF=MemoryMappedFile.CreateNew(“Features”,MaxSize);
.
.
.
使用(MemoryMappedViewStream=MMF.CreateViewStream())
{
BinaryWriter write=新的BinaryWriter(流);
.
.
.
//从数据库获取数据并将其存储到Rowdata变量中。
while(Rowdata.Read())
{
字节[]数据=Rowdata.GetFieldValue(0);
写。写(数据);
}
}
它不会将数据保存在内存中

IVSSharedMemory是我正在研究的一个,但是内存大小应该比这个大得多

当我创建内存映射文件时,是否有忘记做的事情?请告诉我是否有。在我注意到这一意外行为,有人说这是一个虚拟内存后,我立即在谷歌上搜索了这个。但我忍不住想这不是真的,因为它在下面的部分解释了这一点

非持久内存映射文件

CreateNew和CreateOrOpen方法创建内存映射文件,该文件未映射到磁盘上的现有文件

提前谢谢。只要确认这是MMF设计的目的,我们也会很感激

更新


它看起来确实是一个虚拟内存。正如Mike z评论的那样,我检查了我的应用程序在VMMAP工具中保存的记忆,结果正是我想要看到的

但是看看这个,提交的内存量已经改变了。当我的应用程序完全加载所有数据时,就会发生这种情况。我可以猜测,前面的大小仅表示我在创建MMF时指定的
MaxSize

是否已转到物理磁盘空间或其他地方?


我读了很多关于MemoryMappedFile的书,想看看地下有什么。但我还是不明白为什么会这样。说真的,数据在哪里?在哪里可以检查它?

内存映射文件是大多数现代操作系统内核提供的功能。其目的不是在实际物理内存中加载文件 而是利用虚拟内存映射功能,以便像访问内存块一样访问文件内容


更准确地说,现代操作系统使用分页机制,利用计算机的MMU功能将虚拟地址空间映射到物理内存或磁盘上的交换文件。这就是虚拟内存的实现方式。其思想是,MMU使用内核维护的映射将内存访问从CPU转换到RAM,或者如果页面丢失(要么已交换到磁盘,要么根本没有映射),则会产生一个硬件中断,该中断将调用内核以解决缓存丢失问题。在内存映射文件的情况下,此解决方案需要将丢失的页面加载到主内存中,然后透明地恢复程序的执行。

我可能会首先使用vmmap之类的工具来查看正在使用的内存(如果有的话),而不是任务管理器,这里只看私有工作集。据我所知,内存映射文件并没有完全加载到内存中。它们是惰性加载的页面(大部分是4k大小)。因此,当您读取MMF时,操作系统将为您处理读取。查看维基百科以获得更好的解释。也许你的数据被交换到磁盘,然后从那里读取?@user743414我想也是。但是当其他进程尝试访问MMF时,我没有注意到任务管理器中有任何磁盘活动。这就是为什么我如此困惑。也许将数据保存在内存中的唯一方法是使用局部变量并将它们缓存到内存中。。。谢谢你的评论。你考虑过像redis这样的内存数据库吗?将内存缓存移到应用程序之外?如果已正确创建内存映射文件,则会占用空间。但是,使用的空间是虚拟的,您无法通过查看进程的工作集(任务管理器)或查看硬盘活动来观察虚拟内存的使用情况。虚拟内存的一个重要特性是,它以一种方式虚拟化实际(有限的)硬件,该方式尝试优化这些资源不仅由您的进程使用,而且由计算机上的所有进程使用。你的问题“我忘了什么吗?”是不可能回答的,即使答案可能是“不”。