我有一个使用大量内存映射文件的进程。
问题是这些文件保存在物理内存中,即使计算机内存不足,其他进程也需要此内存。
我尝试过使用SetProcessWorkingSetSize来限制进程的工作集,但是没有帮助,进程的工作集一直在增长,超过了最大值。
有没有更好的方法来限制进程的工作集?
我可以更改Windows的内存映射文件分页的启发式吗?
发布于 2010-08-15 14:01:46
最终使用了蛮力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);
}
}发布于 2009-10-25 22:17:37
如果您发现包含内存映射文件的进程保留了大量这样的页面,那么这意味着操作系统不需要丢弃任何内存映射区域来提供给其他进程。那么,您如何知道其他进程实际上需要当前用于映射文件的内存呢?仅仅因为操作系统的物理RAM很低并不意味着什么。其他进程必须要求内存才能使操作系统丢弃映射的页面并将RAM提供给它们。
因此,您的mmap-I/O进程似乎正在使使用RAM频率较低的其他进程处于饥饿状态。一种方法是明智地在正处于饥饿状态的进程中锁定内存。看看适用于win32的VirtualLock。
发布于 2009-10-25 20:19:07
我认为这种行为是由于MMF (内存映射文件)的工作方式造成的。看看this的博客文章吧。它解释了MMF文件跳过Windows分页过程,因此不受分页文件的支持。相反,MMF本身成为了数据备份,这意味着,最终,它占用了更多的RAM,因为它不是被页出的(呃,我不确定我自己是否得到了这一点-最好是阅读博客!)
Here's内存映射文件的MSDN文档,here's另一个与MMF相关的SO问题。
https://stackoverflow.com/questions/1620536
复制相似问题