2

Android アプリでLRU キャッシュ (LruCacheのクラス) を使用しています。android.utilこれは一般的に正常に機能しています。

ここで、この LRU キャッシュに特別な要件があります。一部のオブジェクトが決して削除されないようにしたいのです。状況の説明:決して削除してはならないオブジェクト ( mymetadataオブジェクトという名前) の配列があり、LRU ルールで削除する必要がある他のオブジェクト ( dynamicdataオブジェクトという名前) がたくさんあります。オブジェクトの配列も大きくなる可能性があり、LRU キャッシュを使用するとメモリ不足を回避できるため、 mymetadataオブジェクトを LRU キャッシュに格納したいと考えています。

mymetadataオブジェクトが LRU キャッシュから削除されないことを保証するトリックはありますか? または、配列からオブジェクトにアクセスして、最後に使用されたものとしてマークする必要がありますか?

4

1 に答える 1

1

mymetadataが LRU キャッシュから削除されないことを保証するトリックはありますか? または、配列のオブジェクトにアクセスするだけで、最後に使用されたとマークされているのでしょうか?

LRU キャッシュに保持したいオブジェクトに定期的にアクセスする (強制的にランクを上げるため) 以外に、他に何ができるかわかりません。これに関する問題の 1 つは、これらのオブジェクトをいつ操作する必要があるか、およびこの操作がパフォーマンスにどのような影響を与えるかということです。

別のアプローチは、永続性に応じてオブジェクトのストレージを分割することです。永続オブジェクトの標準マップと、有効期限が切れる可能性のあるオブジェクトの LRU キャッシュを保持します。Mapこの 2 つのデータ構造の組み合わせは、 orのものと同様の単一のインターフェイスの背後に隠すことができますLruCache(各クエリは適切な内部ストレージに送信されます)。

オブジェクトの配列も大きくなる可能性があるため、 mymetadataオブジェクトを LRU キャッシュに入れたいと考えています。

これは、一部のオブジェクトに対する「決して削除されない」という要件と矛盾しているようです。永続オブジェクトの有効期限が切れる時期をどのように決定しますか?

いずれにせよ、さらに別のアプローチは、LRU キャッシュ データ構造を再実装し、オブジェクトの 1 つのリストではなく 2 つの別個の順序付けられたリストを保持することにあります。1 つはmymetadataオブジェクト用で、もう 1 つはdynamicdataオブジェクト用です。次に、このデータ構造への各クエリは正しいリストに送信され、両方の種類のオブジェクトが個別に期限切れになる可能性があります (キャッシュのサイズも、オブジェクトのセットごとに個別に選択できます)。ただし、両方の種類のオブジェクトは同じハッシュ テーブル/マップに格納されます。

于 2014-02-08T15:35:58.180 に答える