gpt4 book ai didi

c++ - 使用内存映射文件时如何释放物理内存?

转载 作者:行者123 更新时间:2023-11-30 03:09:19 26 4
gpt4 key购买 nike

我有这个测试代码,它只是将大约 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、Processes 选项卡、View + Select Columns 中轻松看到的内容以添加页面错误列。是的,页面错误是相当昂贵的,因为其中的许多页面错误将显着影响机器的操作。 RAM 是类(class)的标准配置,您使用了很多。

我意识到这是一个综合测试。如果您的真实代码看起来像这样(从不利用缓存和惰性写回),那么请不要使用 MMF。

关于c++ - 使用内存映射文件时如何释放物理内存?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4204766/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com