Как освободить физическую память при использовании файлов с отображенной памятью? - PullRequest
1 голос
/ 17 ноября 2010

У меня есть этот тестовый код, который просто отображает около 7500 файлов в виртуальную память, а затем распаковывает его.Я сделал это, чтобы проверить использование моей оперативной памяти (мое использование виртуальной памяти просто отлично).Когда я запускаю это приложение, моя физическая доступная память становится опасно низкой, и все действительно замедляется (я работаю на машине с 4 ГБ ОЗУ 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 Ответ

3 голосов
/ 17 ноября 2010

Вы используете MMF абсолютно худшим из возможных способов. Сопоставляя их один раз, нажимая каждую страницу и немедленно закрывая сопоставление. Ваша программа генерирует огромное количество ошибок страниц. Что-то, что вы можете легко увидеть в Taskmgr.exe, вкладка «Процессы», «Просмотр + Выбор столбцов», чтобы добавить столбцы ошибок страницы. Да, сбои страниц довольно дороги, так как многие из них могут заметно повлиять на работу машины. Объем ОЗУ равен номиналу, вы используете его много.

Я понимаю, что это синтетический тест. Если ваш реальный код выглядит примерно так (никогда не используя преимущества кэширования и отложенной обратной записи), не используйте MMF.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...