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

时间:2017-06-14 07:46:20

标签: c# shared-memory mmf

我正在尝试将大量数据缓存在物理内存中,并为本地环境中的其他进程共享它们。所以我提出了MMF并阅读了Microsoft MMF document并看了几个例子并开始调整这样的代码。

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);
     }
}

它不会将数据保存在内存中

我正在研究IVSSharedMemory,但内存大小应该远高于此。

enter image description here

创建内存映射文件时,我有什么忘记做的事吗?请告诉我是否存在。我在发现这种意外行为后立即用Google搜索,有些人说这是虚拟内存。但我不禁想到这不是真的,因为in the document,它在下面的部分解释了这一点。

  

非持久内存映射文件

     

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

提前致谢。只是确认MMF设计的内容也会受到赞赏。

更新

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

enter image description here

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

enter image description here

是去了物理磁盘空间还是其他什么东西?

我读了很多关于MemoryMappedFile并试图看看地下的东西。但我仍然不明白为什么会这样。说真的,数据在哪里?我在哪里可以检查它?

1 个答案:

答案 0 :(得分:0)

内存映射文件是大多数现代OS内核提供的功能。其目的不是将文件加载到实际的物理内存中 而是利用虚拟内存映射功能来提供对文件内容的访问,就像文件是一块内存一样。

更准确地说,现代操作系统使用分页机制,该机制使用计算机的MMU来将虚拟地址空间映射到物理内存或磁盘上的交换文件。这就是实现虚拟内存的方式。这个想法是,MMU使用内核维护的映射将内存访问从CPU转换为RAM,或者如果页面丢失(页面已被交换到磁盘或根本没有映射),则会产生硬件中断,将调用内核来解决缓存未命中。对于内存映射文件,此解决方案从将丢失的页面加载到主内存并透明地恢复程序执行开始。