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

时间:2010-11-17 13:23:29

标签: c++ winapi memory memory-management

我有这个测试代码,它只是将大约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();

1 个答案:

答案 0 :(得分:3)

您正在以绝对最差的方式使用MMF。映射它们一次,点击每个页面并立即关闭映射。您的程序正在生成大量页面错误。您可以在Taskmgr.exe,进程选项卡,视图+选择列中轻松查看,以添加页面错误列。是的,页面错误相当昂贵,因为它们中的很多都会明显影响机器的运行。 RAM是课程的标准,你使用了很多。

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