Отображенные в памяти файлы остаются в физической памяти?

StackOverflow https://stackoverflow.com/questions/1620536

Вопрос

У меня есть процесс, который использует много файлов с отображенной памятью.
Проблема заключается в том, что эти файлы хранятся в физической памяти, даже когда на машине недостаточно памяти, а другим процессам требуется эта память.

Я пытался использовать SetProcessWorkingSetSize для ограничения рабочего набора процесса, но это не помогает, рабочий набор процесса продолжает расти сверх максимального значения.

Есть ли лучший способ ограничить рабочий набор процесса?
Могу ли я изменить эвристики Windows для файлов подкачки в памяти?

Это было полезно?

Решение 2

Завершено с использованием грубой силы VirtualUnlock.

PROCESS_MEMORY_COUNTERS pmc;
if (GetProcessMemoryInfo( hProcess, &pmc, sizeof(pmc)) )
{
        if (pmc.WorkingSetSize > MaxWorkingSetSize)
        {
                VirtualUnlock(FilePtr.pData, MaxWorkingSetSize);
                UnmapViewOfFile(FilePtr.pData);
                CloseHandle(FilePtr.hFileMap);
                CloseHandle(FilePtr.hFile);
        }
}

Другие советы

Если вы обнаружите, что ваш процесс с файлами отображения памяти удерживает многие из этих страниц, это означает, что ОС не нужно отбрасывать какие-либо из областей отображения памяти для передачи другим процессам. Итак, как вы узнаете, что другим процессам на самом деле нужна память, используемая в настоящее время для сопоставленных файлов? То, что в операционной системе недостаточно физической памяти, ничего не значит. Другие процессы должны требовать памяти, чтобы ОС отбрасывала ваши отображенные страницы и выделяла им ОЗУ.

Итак, похоже, что ваш процесс mmap-I / O истощает ваш другой процесс, который использует ОЗУ реже. Один подход заключается в разумной блокировке памяти в процессе, который подвергается голоданию. Посмотрите на VirtualLock для win32.

Я думаю, что это связано с тем, как работают MMF (Memory Mapped Files). Ознакомьтесь с этой статьей блога. Это объясняет, что файлы MMF пропускают процесс подкачки Windows и, следовательно, не поддерживаются файлом подкачки. Вместо этого MMF становится резервной копией данных сама по себе, что означает, что, в конечном счете, она занимает больше оперативной памяти, поскольку не выходит из страниц (э-э, я не уверен, что получу это сам - лучше всего читать блог!)

Вот документация MSDN для сопоставленных файлов памяти и вот еще еще один вопрос, связанный с MMF.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top