メモリマップされたファイルは物理メモリに残りますか?
-
06-07-2019 - |
質問
メモリマップされたファイルを大量に使用するプロセスがあります。
問題は、マシンのメモリが不足している場合でも、これらのファイルが物理メモリに保持され、他のプロセスがこのメモリを必要とすることです。
使ってみた 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);
}
}
他のヒント
メモリ マップされたファイルを含むプロセスがそれらのページの多くを保持していることがわかった場合、OS は他のプロセスに与えるためにメモリ マップされた領域を破棄する必要がなかったことを意味します。では、マップされたファイルに現在使用されているメモリを他のプロセスが実際に必要としているとどうやってわかるのでしょうか?OS の物理 RAM が少ないだけでは意味がありません。他のプロセスは、OS にマップされたページを削除させて RAM を与えるためにメモリを要求する必要があります。
そのため、mmap-I/O プロセスが、RAM の使用頻度が低い他のプロセスを枯渇させているようです。1 つのアプローチは、枯渇しているプロセス内のメモリを慎重にロックすることです。win32 の VirtualLock を見てください。
私の回答こちら; VirtualUnlock()を使用すると、MMFの一部を手動でコミット解除できます。たとえば、すぐに再びアクセスするとは思わないセクション。