質問

メモリマップされたファイルを大量に使用するプロセスがあります。
問題は、マシンのメモリが不足している場合でも、これらのファイルが物理メモリに保持され、他のプロセスがこのメモリを必要とすることです。

使ってみた 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の一部を手動でコミット解除できます。たとえば、すぐに再びアクセスするとは思わないセクション。

この動作は、MMF(Memory Mapped Files)の動作によるものだと思います。 こちらのブログ記事をご覧ください。 MMFファイルはWindowsのページングプロセスをスキップするため、ページファイルによってバックアップされないことを説明しています。代わりに、MMFはそれ自体でデータのバックアップになります。つまり、ページアウトされていないため、最終的にはより多くのRAMを使用します(自分でそれを取得できるかどうかはわかりません-ブログを読むのがベストです!)

こちらはメモリマップファイルとこちらはMMFに関連する別のSO質問です。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top