2009-03-09 1 views
1

私は.NET2.0 C#web-appを持っています。これには、多数のリクエストにまたがって共有されているが、任意のユーザにセッションされていない、サイズが大きくてinitに高価なオブジェクトが多数あります。したがって、私はそれをルックアップ構造で維持する必要があります。これらのオブジェクトは、必要に応じて作成する必要があり、アプリケーションの寿命のために必要ではなく、単にその使用期間の寿命です。ラージオブジェクトキャッシュ

少しプラス。

これを行うためのメモリリークの方法は簡単な辞書です。これを行うためのメモリ安全な方法は弱参照の辞書ですが、問題は、GCがあまりにも速いです。現実的にはこれは問題ではないかもしれません。なぜなら、オブジェクトへのトラフィックは、再生を余儀なくされることなく生き続けるようなものでなければならないが、理想的にはスケールダウンすることが理想的です。

ある一定の期間Xの間、オブジェクトを安全にGCから隠しておくことを考えていない、何らかの中間的な解決策がありますか?また、その時間の終わりにオブジェクトを収集できるようにします。セッショントークンと同様の方法で使用されるたびにそのタイムカウンタがリセットされるのが望ましいでしょうか?

答えて

5

完全な構文であると信じてキャッシュに挿入されたアイテムは、それらをタッチする毎に「更新」されます。それで、もはや必要がなくなるまで生き続けることができます。その後は、期限切れになるまでキャッシュにとどまります(スライドやローリングの時間)、またはメモリの圧迫により強制的にキャッシュされます。 - セット、使用に関係なく絶対時間:

  • 絶対時間:項目をタッチするたびに、死へのカウントダウンがリセットされます:アイテムは、システムクロックが(ローリング)時間をスライディング特定の日時

  • を通過した後に押し出されています。カウントダウンの持続時間はスライド時間(例えば、5分)である。

使用例:

//adds itemObject to cache under name "UniqueItemKey" 
//set to expire 5 minutes after last touched 
HttpRuntime.Cache.Add("UniqueItemKey", 
         itemObject, 
         null, 
         Cache.NoAbsoluteExpiration, 
         new TimeSpan(0, 5, 0), 
         CacheItemPriority.Normal, 
         null); 
+0

OPが必要とするものと全く同じです。 – configurator

+0

私はちょうど触れることなく覗くという問題がありますが、それは別の質問です。 – annakata

1

フレームワークのCacheオブジェクトを使用して、スライディング有効期限を設定しないのはなぜですか。 10分を言う。少なくとも10分ごとに1回使用されると、キャッシュに残ります.10分が経過すると期限切れになり、GCはそれを削除します。

例:(私はこれはHttpRuntime cacheはここで働いていないだろう、なぜ私はよく分からない

Cache.Add("myKey", MyLargeObject, null, DateTime.Now.AddMinutes(10), Cache.SlidingExpiration, CacheItemPriority.High) 
0

すでにあなた自身の問題への解決策を説明しているように聞こえます。キャッシュ構造の一種で、ある期間強い参照を保持していますが、そのオブジェクトがアクセスされずにある時間が経過すると弱参照に格下げされます。

+0

ダウングレードはトリックですが... – annakata

0

重要な部分は「使用の寿命」です。どのように定義するのですか?あなたが将来の知識を必要としない方法で正確に定義できるならば、残りはおそらく簡単でしょう。