簡體   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