我试图将大量数据缓存在物理内存中,并在本地环境中与其他进程共享。所以我想到了使用MMF,读取了Microsoft 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);
}
}
它不会在内存中保存数据
我正在处理的是IVSSharedMemory,但是内存大小应该比这个要大得多。
创建内存映射文件时是否有什么我忘记做的事?如果有,请告诉我。 在注意到这种意外行为后,我立即在Google上搜索了一下,有些人说这是虚拟内存。但我认为这不是真的,因为文档中在下面的部分解释了这一点。
非持久性内存映射文件
CreateNew和CreateOrOpen方法创建一个未映射到现有磁盘文件的内存映射文件。
先感谢您。确认这是否是MMF的设计目的也将不胜感激。
更新
似乎的确是虚拟内存。就像Mike z所评论的那样,我使用了VMMAP工具检查了我的应用程序正在保留的内存,结果正是我想要看到的。
但是请注意,已提交的内存量已更改。当我的应用程序完全加载所有数据时会发生这种情况。我可以猜测以前的大小只表示我在创建MMF时分配的最大大小。
它是否消失到物理磁盘空间或其他地方了?
我读了很多关于MemoryMappedFile并试图查看底层原理。但我仍然不明白为什么会发生这种情况。真正的数据在哪里?我可以在哪里检查它?