繁体   English   中英

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

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM