我有这个测试代码,它只是将大约7500个文件映射到虚拟内存然后取消映射。我这样做是为了检查我的RAM使用情况(我的虚拟内存使用情况很好)。当我运行这个应用程序时,我的物理可用内存变得非常低,一切都真的变慢了(我运行的是4 GB RAM机器XP 32位SP3)。有没有人知道如何解决这个问题? (我搜索并发现VirtualUnlock
可能有用,但是当我尝试它时没有任何区别)。这是代码:
int COUNT = 7759;
cout<<"Press a key to start\n";
getchar();
int i = 1;
for(i = 1; i <= COUNT; ++i)
{
CString s;
s.Format(_T("E:\\Images\\CD5\\04221155\\2 (%d)"), i);
HANDLE hFile = CreateFile(s,
GENERIC_READ | GENERIC_WRITE,
FILE_SHARE_READ | FILE_SHARE_WRITE,
NULL,
OPEN_EXISTING,
FILE_ATTRIBUTE_NORMAL,
NULL);
if(hFile == INVALID_HANDLE_VALUE)
{
TCHAR buf[256] = {0};
DWORD er = GetLastError();
FormatMessage(FORMAT_MESSAGE_FROM_SYSTEM, 0, er, 0, buf, 256, 0);
cout<<"Unable to open file, Error is:";
wcout<<buf;
cout<<"\n";
break;
}
DWORD filesize = 0;
filesize = GetFileSize(hFile,&filesize);
HANDLE hMapFile = CreateFileMapping(hFile,
NULL,
PAGE_READWRITE,
0,
filesize,
NULL);
if(hMapFile == NULL)
{
cout<<"Unable to create file mapping object. Error is:";
TCHAR buf[256] = {0};
DWORD er = GetLastError();
FormatMessage(FORMAT_MESSAGE_FROM_SYSTEM, 0, er, 0, buf, 256, 0);
wcout<<buf;
cout<<"\n";
break;
}
char* pBuf = (char*) MapViewOfFile(hMapFile,
FILE_MAP_ALL_ACCESS,
0,
0,
filesize);
if(pBuf == NULL)
{
TCHAR buf[256] = {0};
DWORD er = GetLastError();
FormatMessage(FORMAT_MESSAGE_FROM_SYSTEM, 0, er, 0, buf, 256, 0);
cout<<"Unable to map the file to virtual memory, Error is:";
wcout<<buf;
CString s1;
s1.Format(_T("%x"), hMapFile);
cout<<"Handle is:"<<s1;
cout<<"\n";
break;
}
if(i % 100 == 0)
{
cout<<"Mapped "<<i<<"\n";
}
memset(pBuf, 0, filesize);
//VirtualUnlock(pBuf, filesize);
UnmapViewOfFile(pBuf);
CloseHandle(hMapFile);
CloseHandle(hFile);
}
cout<<"finished i is "<<i<<"\n";
getchar();
答案 0 :(得分:3)
您正在以绝对最差的方式使用MMF。映射它们一次,点击每个页面并立即关闭映射。您的程序正在生成大量页面错误。您可以在Taskmgr.exe,进程选项卡,视图+选择列中轻松查看,以添加页面错误列。是的,页面错误相当昂贵,因为它们中的很多都会明显影响机器的运行。 RAM是课程的标准,你使用了很多。
我意识到这是一个综合测试。如果您的真实代码看起来像这样(从不利用缓存和延迟写回),那么不要使用MMF。