15

私のアプリケーションでは、キーと値の両方がシリアライズ可能である、またはシリアライズ可能であるディクショナリ (追加、削除、更新、ルックアップをサポート) を使用します (値は非常に大きなオブジェクト グラフになる可能性があります)。ディクショナリが非常に大きくなり、メモリ内に完全に保持することが時折トリガーされ始めた時点に到達しましOutOfMemoryExceptionた (ディクショナリ メソッドやコードの他の部分で発生する場合もあります)。

ディクショナリをデータベースに完全に置き換えようとした後、パフォーマンスが許容できないレベルまで低下しました。

ディクショナリの使用パターンを分析すると、通常、値のごく一部が「ホット」(非常に頻繁にアクセスされる) であり、残り (大部分) は「コールド」(ほとんどまたはまったくアクセスされない) であることが示されました。新しい価値が追加される時期がホットかコールドかを判断するのは難しく、時間の経過とともに一部の値がホットとコールドの間を行ったり来たりする可能性があります。

メモリ不足のイベントでコールド値をディスクにフラッシュし、必要に応じてそれらの一部をリロードして、次のメモリ不足イベントが発生するまでメモリに保持できる辞書の実装が必要だと思います。 /cold ステータスが再評価されます。理想的には、アプリケーションのメモリ使用量のプロファイルに応じて、ホット部分とコールド部分のサイズとフラッシュ間隔を適切に調整して、全体的なパフォーマンスを最大化する必要があります。ディクショナリの複数のインスタンスが (異なるキー/値の型で) アプリケーションに存在するため、ワークフローを調整する必要があるかもしれません。

そのような辞書を実装する方法を教えてください。

4

3 に答える 3

2

64 ビット用にコンパイルし、64 ビットに展開し、メモリを追加します。メモリに保管してください。

自分自身を成長させる前に、代わりに WeakReference http://msdn.microsoft.com/en-us/library/ms404247.aspxを見ることができます。もちろん、回収されたオブジェクトを再構築する必要がありますが、回収されたオブジェクトがあまり使用されないことを期待する必要があります。メモリ管理の問題の自動解決策として弱い参照を使用しないように独自のガイドラインが述べているという警告が付属しています。代わりに、アプリケーションのオブジェクトを処理するための効果的なキャッシュ ポリシーを作成してください。

もちろん、そのガイドラインを無視して、それを考慮してコードを効果的に操作することもできます。

キャッシュ ポリシーを実装し、有効期限が切れるとデータベースに保存し、フェッチ時に取得してキャッシュすることができます。もちろん、最も使用されているものを維持することに関心があるため、スライド式の有効期限を使用してください。

ただし、最も使用されているものと最も重いものはトレードオフであることを覚えておいてください. 復元に 5 分かかるオブジェクトを 1 日に 10 回失うことは、わずか 5 ミリ秒で復元できるオブジェクトを 10000 回失うことよりもユーザーを苛立たせます。

そして、上記の誰かがウェブキャッシュについて言及しました。前述のように、コールバックを使用して自動メモリ管理を行いますが、アプリでそれを持ち歩くかどうかによって異なります。

そして... 最後になりましたが、分散キャッシュを見てください。シャーディングを使用すると、その大きな辞書をいくつかのマシンに分割できます。

于 2013-08-20T08:49:44.213 に答える
0

単なるアイデア-それをしたことも、使用したこともありませんSystem.Runtime.Caching:

以下を行うMemoryCacheのラッパーを実装します。

  1. エビクション コールバックを指定してアイテムを追加します。コールバックは、削除されたアイテムをデータベースに配置します。
  2. データベースからアイテムをフェッチし、取得中にアイテムが MemoryCache に存在しない場合は、MemoryCache に戻します。
  3. データベースとメモリの両方に欠落しているアイテムに対する多くのリクエストが予想される場合は、存在する/欠落しているアイテムにもブルーム フィルターまたはキャッシュ キーを実装する必要があります。
于 2013-07-21T20:41:11.200 に答える
0

私は過去に同様の問題を抱えています。

あなたが探している概念は、LRU (Least Recent Used または Most Recent Used) キューを使用したリードスルー キャッシュです。

IDictionary の LRU 実装はありますか?

ディクショナリに項目を追加するときは、最近使用されていないものを追跡し、それらをメモリから削除して、ディスクに保存します。

于 2013-08-14T15:10:45.370 に答える