[英]How to release physical memory when using memory mapped files?
我有這個測試代碼,只是將約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();
您以絕對最差的方式使用MMF。 一次映射它們,點擊每個頁面並立即關閉映射。 您的程序正在生成大量的頁面錯誤。 您可以在Taskmgr.exe的“進程”選項卡的“查看+選擇列”中輕松添加一些內容,以添加頁面錯誤列。 是的,頁面錯誤的代價非常高昂,因為要使很多頁面缺陷明顯影響機器的運行。 RAM是該課程的標准配置,您正在使用很多。
我意識到這是一個綜合測試。 如果您的真實代碼看起來像這樣(不要利用緩存和延遲寫回),則不要使用MMF。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.