私のアプリケーションでは、キーと値の両方がシリアライズ可能である、またはシリアライズ可能であるディクショナリ (追加、削除、更新、ルックアップをサポート) を使用します (値は非常に大きなオブジェクト グラフになる可能性があります)。ディクショナリが非常に大きくなり、メモリ内に完全に保持することが時折トリガーされ始めた時点に到達しましOutOfMemoryException
た (ディクショナリ メソッドやコードの他の部分で発生する場合もあります)。
ディクショナリをデータベースに完全に置き換えようとした後、パフォーマンスが許容できないレベルまで低下しました。
ディクショナリの使用パターンを分析すると、通常、値のごく一部が「ホット」(非常に頻繁にアクセスされる) であり、残り (大部分) は「コールド」(ほとんどまたはまったくアクセスされない) であることが示されました。新しい価値が追加される時期がホットかコールドかを判断するのは難しく、時間の経過とともに一部の値がホットとコールドの間を行ったり来たりする可能性があります。
メモリ不足のイベントでコールド値をディスクにフラッシュし、必要に応じてそれらの一部をリロードして、次のメモリ不足イベントが発生するまでメモリに保持できる辞書の実装が必要だと思います。 /cold ステータスが再評価されます。理想的には、アプリケーションのメモリ使用量のプロファイルに応じて、ホット部分とコールド部分のサイズとフラッシュ間隔を適切に調整して、全体的なパフォーマンスを最大化する必要があります。ディクショナリの複数のインスタンスが (異なるキー/値の型で) アプリケーションに存在するため、ワークフローを調整する必要があるかもしれません。
そのような辞書を実装する方法を教えてください。