内存映射文件导致物理内存不足

时间:2010-05-11 14:18:09

标签: caching memory memory-management memory-mapping

我有一个2GB内存并运行内存密集型应用程序并进入低可用物理内存状态,系统没有响应用户操作,如打开任何应用程序或菜单调用等。

如何触发或告诉系统将内存交换为页面文件和释放物理内存? 我正在使用Windows XP。

如果我在4GB RAM机器上运行相同的应用程序则不是这样,系统响应是好的。在被可用的物理内存系统堵塞后,自动切换到页面文件和释放物理内存,而不是2GB系统。

要解决此问题(在2GB计算机上),尝试将内存映射文件用于由应用程序分配的大型数据集。在这种情况下,应用程序(进程)的虚拟内存很好,但是系统缓存很高,并且与上面相同的问题是物理内存较少。

即使内存映射文件未映射到进程虚拟内存,系统缓存也很高。为什么???!!! :(

感谢任何帮助。 感谢。

3 个答案:

答案 0 :(得分:1)

如果使用内存映射文件的数据访问模式是顺序的,则在打开基础文件时通过指定FILE_FLAG_SEQUENTIAL_SCAN标志可能会获得稍微好一点的页面回收。如果您的数据模式以随机顺序访问映射文件,则无效。

您应该考虑减小地图视图的大小。这就是所有内存实际被消耗和缓存的地方。由于您似乎需要处理大于可用连续空闲物理内存的文件,因此您可以比虚拟内存页交换器更好地完成内存管理,因为您比虚拟内容更了解内存使用情况记忆管理员呢。如果可能的话,尝试调整您的设计,以便您可以使用较小的视图操作大文件的某些部分。

即使您无法在整个基础文件范围内摆脱对完全随机访问的需求,也可能需要拆除并根据需要重新创建视图以将视图移动到下一个操作需要访问的文件。如果您的数据访问模式倾向于在继续之前聚集在文件的各个部分周围,那么您将不需要经常移动视图。你可以点击下拉并重新创建视图对象,但是由于拆除视图也释放了与视图关联的所有缓存页面,因此可能会看到性能的净增益,因为较小的视图会显着降低内存压力和页面交换系统。尝试根据已安装的系统RAM的一部分设置视图的大小,并根据文件处理的需要移动视图。视图越大,移动它所需的越少,但它消耗的RAM越多,可能会影响系统响应。

答案 1 :(得分:0)

我认为你在暗示你的帖子,响应时间慢可能至少部分是由于系统延迟,而操作系统将内存内容写入页面文件,为物理内存中的其他进程腾出空间。 / p>

显而易见的解决方案(可能不实用)是在应用程序中使用更少的内存。我认为这不是一个选项,或者至少不是一个简单的选择。另一种方法是尝试主动将数据刷新到磁盘,以便持续保留可用的物理内存以供其他应用程序运行。您可以使用GlobalMemoryStatusEx在计算机上找到总内存。 GetProcessMemoryInfo将返回有关您自己的应用程序内存使用情况的当前信息。由于您说您正在使用内存映射文件,因此您可能需要另外考虑该内容。例如,我相信从该API返回的PageFileUsage信息将不包含有关您自己的内存映射文件的信息。

如果您的应用程序正在监视使用情况,您可以使用FlushViewOfFile主动从内存强制数据到磁盘。还有一个API(EmptyWorkingSet),我认为尝试尽可能多地将脏页写入磁盘,但这似乎很可能会严重损害您自己的应用程序的性能。虽然,在您知道应用程序进入某种空闲状态的情况下它可能很有用。

最后,另一个可能有用的API是SetProcessWorkingSetSizeEx。您可以考虑使用此API来提示应用程序工作集大小的上限。这可能有助于为其他应用程序保留更多内存。

编辑:这是另一个明显的陈述,但我之前忘了提到它。它对您来说也可能不实用,但考虑到您遇到32位限制,它听起来像是您可能做的最好的事情之一是将您的应用程序构建为64位并在64位操作系统上运行它(并在机器上投入更多的内存。)

答案 2 :(得分:0)

嗯,听起来你的程序需要超过2GB的工作集。

现代操作系统的设计目的是在任何时候都使用大部分RAM,只保留相当少的空闲数量,以便可以立即分发给需要更多内容的进程。其余用于保存最近使用过的内存页面和缓存磁盘块;最近没有使用的任何内容都会刷回磁盘以补充免费页面池。简而言之,假设没有多少免费的物理内存。

使用正常内存分配和映射文件的内存之间的主要区别在于数据在必须从内存中分页时的存储位置。它不一定会对内存何时被分页有任何影响,并且对于将其分页的时间影响不大。

您看到的真正问题可能不是您的可用物理内存太少,而是分页率过高。

我的建议是尝试减少程序所需的存储量,看看是否可以增加引用的位置以减少所需的分页量。