内存映射文件保留在物理内存中?

我有一个使用大量内存映射文件的进程。
问题是这些文件保存在物理内存中,即使机器内存不足,其他进程也需要这些内存。

我已经尝试过使用SetProcessWorkingSetSize来限制进程工作集,但没有帮助,进程的工作集不断增长超过最大值。

有没有更好的方法来限制进程的工作集?
我可以更改Windows的heuristcs分页内存映射文件?

如果您发现内存映射文件的进程持有大量页面,那么这意味着操作系统不需要放弃任何内存映射区域来提供给其他进程。 那么,你怎么知道其他进程实际上需要当前用于映射文件的内存呢? 仅仅因为操作系统在物理内存不足意味着什么。 其他进程必须要求内存才能使操作系统放弃映射的页面并为其提供RAM。

所以,看起来你的mmap-I / O进程正在让你的另一个进程不太经常使用RAM。 一种方法是明智地锁定正在饿死的进程中的内存。 看看VirtualLock for win32。

结束使用蛮力VirtualUnlock。

PROCESS_MEMORY_COUNTERS pmc; if (GetProcessMemoryInfo( hProcess, &pmc, sizeof(pmc)) ) { if (pmc.WorkingSetSize > MaxWorkingSetSize) { VirtualUnlock(FilePtr.pData, MaxWorkingSetSize); UnmapViewOfFile(FilePtr.pData); CloseHandle(FilePtr.hFileMap); CloseHandle(FilePtr.hFile); } } 

在这里检查我的答案; 使用VirtualUnlock()你可以手动取消部分MMF; 例如,您认为您不会很快访问的部分。

我认为这种行为是由于MMF(内存映射文件)如何工作的。 看看这篇博客文章。 它解释了MMF文件跳过了Windows分页过程,因此不被页面文件支持。 相反,MMF本身就成了数据备份,这意味着最终它会占用更多的RAM,因为它不会被分页(呃,我不确定我是否自己得到这个 – 最好阅读博客!

下面是内存映射文件的MSDN文档, 这里是另一个关于MMF的SO问题。