hin*_*531 10 c# shared-memory mmf
我正在尝试将大量数据缓存在物理内存中,并为本地环境中的其他进程共享它们.所以我想出了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);
}
}
Run Code Online (Sandbox Code Playgroud)
它不会将数据保存在内存中
我正在研究IVSSharedMemory,但内存大小应该远高于此.
当我创建内存映射文件时,有什么我忘了做的吗?请告诉我是否有.在我注意到这种意外行为之后我用谷歌搜索了这个,有些人说它是虚拟内存.但我不禁想到这不是真的,因为在文件中,它在下面的部分解释了这一点.
非持久内存映射文件
CreateNew和CreateOrOpen方法创建一个未映射到磁盘上现有文件的内存映射文件.
提前致谢.只是确认MMF设计的内容也会受到赞赏.
UPDATE
它确实是一个虚拟内存.正如Mike z评论的那样,我检查了我的应用程序在VMMAP工具中保留的记忆,结果就是我想要看到的内容.
但是看看这个,提交的内存量已经改变了.当我的应用完全加载所有数据时会发生这种情况.我可以猜测,之前的大小只是表明MaxSize我创建MMF时分配的大小.
是去了物理磁盘空间还是什么?
我读了很多关于MemoryMappedFile的内容,试图看看地下有什么.但我仍然不明白为什么会这样.说真的,数据在哪里?我在哪里可以检查它?
内存映射文件是大多数现代操作系统内核提供的功能。其目的不是将文件加载到实际的物理内存中,而是利用虚拟内存映射功能来提供对文件内容的访问,就好像它是一个内存块一样。
更准确地说,现代操作系统使用分页机制,该机制使用计算机的 MMU 船舶将虚拟地址空间映射到物理内存或磁盘上的交换文件。这就是虚拟内存的实现方式。这个想法是,MMU 使用内核维护的映射将内存访问从 CPU 转换到 RAM,或者如果页面丢失(它已被交换到磁盘或根本没有映射),则产生一个硬件中断将调用内核来解决缓存未命中的问题。对于内存映射文件,此解决方案采取将丢失的页面加载到主内存中并透明地恢复程序执行的形式。