gpt4 book ai didi

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

转载 作者:可可西里 更新时间:2023-11-01 09:16:04 28 4
gpt4 key购买 nike

我试图在物理内存中缓存大量数据,并为本地环境中的其他进程共享它们。所以我想出了 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

我在创建内存映射文件时有没有忘记做些什么?如果有,请告诉我。 在我注意到这种意外行为后,我立即用谷歌搜索了这个,有人说这是一个虚拟内存。但我忍不住认为这不是真的,因为,in the document ,它在下面的部分对此进行了解释。

Non-Persisted Memory-Mapped Files

The CreateNew and CreateOrOpen methods create a memory-mapped file that is not mapped to an existing file on disk.

提前致谢。只要确认这就是 MMF 的设计目的,我们也将不胜感激。

更新


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

enter image description here

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

enter image description here

是不是去了物理磁盘空间之类的?

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

最佳答案

内存映射文件是大多数现代操作系统内核提供的功能。它的目的不是加载实际物理内存中的文件而是利用虚拟内存映射功能来提供对文件内容的访问,就好像它是一 block 内存。

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

关于C#内存映射文件不占用物理内存空间,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44538579/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com