2011-11-08 22 views
2

大量のビットマップファイルを表示するというWPFアプリケーションで作業しています。辞書から一番古い項目を削除する

私のアプリケーションがディスクからファイルを読み込む時間を最小限に抑えるために、Dictionary<string, BitmapImage>(ここで、文字列は画像のファイルパスです)を作成しました。この問題を解決するには、最も最近使用された画像を保持する。最近閲覧した画像が要求された場合、プログラムはディスクからではなくDictionaryから取り込みます。ただし、表示される画像の数が増えると、プログラムによって使用されるRAMの量も増加します。だから私の考えは限られた量の画像を保持していて、新しいものがディスクからロードされると、私のDictionaryから最も古いものを上書きします。

可能な限り最良の方法でこれを行う方法を教えてください。私はSortedDictionaryを使用してみましたが、と書く方法を理解できません。keysまたはitemsには、追加された時間/順序に関する情報がありません。

別のSortedDictionary<DateTime, string>DateTime IComparerに保つのは分かりやすい解決策ですか?このようにして、新しいファイルが追加されると、最も古いファイルへのパスが見つかり、Dictionaryの正しいイメージと一致します。この種のことは高度な解決策のように感じます。見落とされていたり、組み込まれているソリューションはありますか?

答えて

4

least recently used (LRU) cache(「最近使われていないアイテムを最初に破棄する)ように思えます。ウェブ上で出回っいくつかの実装があります。

+0

私はBob Rossneyのものを使用します。私自身で平凡なものを作るよりも良いものを使う方が良い; Pありがとう! – Tobbe

0

あなたは自分で簡単に辞書を作成することをお勧めします。例えば

Dictionary<DateTime, Dictionary<string, Image>> SortedByDate; 

私はソートされた辞書が正しい日付をソートしますが、それがないと、最も古いの最後のエントリに等しい場合は、持っている場合、それはかなり簡単、そのエントリを削除する方法とわからないと思います。

+0

これで、パス(文字列)で検索することはできなくなりましたか? – ssube

+0

ありがとう、私はそれを試してみよう! http://stackoverflow.com/questions/453124/datetime-as-key-in-a-sorteddictionaryk-vによると、 'DateTime'はキーとして動作するはずです。 – Tobbe

+0

@peachykeenそれについて考えなかった!私はそれをさらに調べます。 – Tobbe

2

は、.NET 4にある場合、内蔵キャッシュ・メカニズムがある - ウォークスルーのためには、http://msdn.microsoft.com/en-us/library/dd997362.aspx

It allows you to set conditions when the respective cached item is discarded etc.を参照し、項目が(http://msdn.microsoft.com/en-us/library/system.runtime.caching.cacheitempolicy.aspxを参照してください)削除されようとしている場合にはそれがコールバックすることができます。

CacheItemPolicy.SlidingExpirationを使用して、説明したキャッシュポリシー(LRU - least recently usedと呼ばれます)を実装できます。

+0

ありがとうございますが、3.5になっています。私はさらに冒険のためにそれを念頭に置いておくだろう! – Tobbe

0

私は辞書に対して提案し、その代わりに使用しますビットマップを取るカスタムクラス、文字列と日時とリスト、のようなもの:

public Class ImageLocation{ 
    public BitmapImage image; 
    public string location; 
    public DateTime timeLoaded; 
} 

次にあなたがを使用することができます画像を保存するにはをクリックします。それらをtimeLoadedでソートし、最も古いDateTimeのものを削除します。

つまり、何らかの理由でLRUキャッシュを使用しない場合です。

関連する問題