内存映射文件和实际内存使用是怎么回事?
What is up with memory mapped files and actual memory usage?
我真的找不到任何关于这方面的细节,这里是我所知道的关于windows中的mmf的所有信息:
- 在windows中创建内存映射文件不会增加程序使用的表观内存量
- 创建该文件的视图所消耗的内存相当于视图大小
对我来说这看起来相当向后,因为首先,我知道mmf本身实际上在某处有内存。如果我在mmf中写入内容并销毁视图,数据仍然在那里。同时,为什么视图要占用内存呢?它只是一个指针,不是吗?
然后就奇怪了,ram里的东西和磁盘上的东西。在具有分布式访问模式的大型mmf中,有时速度是有的,有时不是。我猜,如果有一个绑定到它或分页文件,其中一些有时会存储在文件中,但实际上,我不知道。
无论如何,驱使我调查这个问题是,我有一个~2gb的文件,我想要多个程序共享。我不能在每个视图中创建2gb的视图,因为我只是"内存不足",所以我必须创建/销毁较小的视图。由于额外的偏移量计算和视图本身的创建,这会产生很多开销。有人能给我解释一下为什么会这样吗?
在像Windows这样的按需分页虚拟内存操作系统上,MMF的视图占用地址空间。只是给处理器的数字,每4096字节一个。只有在实际使用视图时才开始使用RAM。读取或写入数据。此时将触发一个页面错误,并迫使操作系统将虚拟内存页映射到物理内存。"需求页"部分
你不能在32位进程中获得一个2 GB的地址空间块,因为没有空间容纳其他任何东西。该限制是地址空间中其他代码和数据分配之间的最大漏洞,通常徘徊在~650兆字节左右。您需要以x64为目标。或者构建一个与/LARGEADDRESSAWARE链接并在64位操作系统上运行的x86程序。这个后门现在已经变得毫无意义了
内存映射文件中的事情是它允许您在没有I/O调用的情况下操作其数据。由于这种行为,当您访问该文件时,windows将其加载到物理内存中,因此可以在物理内存中而不是在磁盘上操作它。您可以在这里阅读更多信息:http://blogs.msdn.com/b/khen1234/archive/2006/01/30/519483.aspx
无论如何,驱使我调查这个问题是,我有一个~2gb的文件,我想要多个程序共享。我不能在每个视图中创建2gb的视图,因为我只是"内存不足",所以我必须创建/销毁较小的视图。
最可能的原因是程序是32位的。32位程序(默认情况下)只有2GB的地址空间,因此您不能在单个视图中映射2GB的文件。如果在64位模式下重新构建它们,问题就会消失。
- 使用递归的数组的最小值.这是怎么回事
- 我不小心调用了一个没有自己类对象的成员函数.但这是怎么回事呢
- 我使用 OpenMP 的线程越多,执行时间就越长,这是怎么回事?
- 绕道重铸瓷砖层是怎么回事
- 架 (U+67B6) 与en_US不符.UTF-8.这是怎么回事?
- R 中的算术在数字上比整数更快。这是怎么回事?
- 我的代码运行良好,但现在当尝试将其制作成模板时,我遇到了许多看似无关的错误。这是怎么回事?
- 在变量名后声明带有 () 的非内部类型与不使用变量名的行为不同。即 std::map<int,char>x(); - 这是怎么回事?
- 弄清楚这段代码是怎么回事(递归下降案例研究)
- 分配器密集和稀疏是怎么回事?
- 传递引用C++,指针的向量.这是怎么回事?
- __vector_base_common是怎么回事?
- (对象)不命名类型.怎么回事
- 变量已在 .obj 中定义;这是怎么回事?
- Sublime上的EasyClangComplete是怎么回事?
- 重复输出的类型是怎么回事,它如何区分迭代次数和 Ascii 代码?
- 标准::地图使用.这是怎么回事?核心转储?我做得不正确?
- llvm libcxx的源代码是怎么回事?
- 这一行是怎么回事: istringstream is( line );
- 内存映射文件和实际内存使用是怎么回事?