Lucene.Net 3.0.3を使用すると、ユーザーの検索に応じて作成されたすべてのクエリをで簡単にラップできますCachingWrapperFilter
。Luceneはますます多くのメモリを消費するので、これは悪い考えですか、それともLuceneはメモリを管理し、キャッシュされたアイテムをインテリジェントな方法で解放しますか?
CachingWrapperFilterでラップするクエリを選択する必要がありますか?
Query query = ....
QueryWrapperFilter queryFilter = new QueryWrapperFilter(query);
CachingWrapperFilter cachingFilter = new CachingWrapperFilter(queryFilter);
searcher.search(query, cachingFilter, 1);
アップデート
のLucene.Net実装CachingWrapperFilter
も、ガベージコレクションに関連付けられたメカニズムを使用します。WeakDictionary
クラスのインスタンスを使用してキー設定されたクラスを実装しますWeakReference
。これは、任意のオブジェクトをラップし、そのオブジェクトがガベージコレクションされているかどうかを確認する方法を提供する組み込みの.Netクラスです。これは、私の質問に対する答えが「はい」であることを示唆しています。Luceneキャッシュのメモリ管理は、基本的にランタイムガベージコレクターに関連付けられており、キャッシュアイテムが有効である限り維持されるため、制御下に置かれます。
もう少し詳しく...
キャッシュのキーは、IndexReader
でラップされる前に提供されWeakReference
ます。はIndexReader
、キャッシュキーとして提供するオブジェクトを管理します。それらが無効になると、それらは破棄され、その後ガベージコレクションされます。その後、キャッシュはを介してこれを検出WeakReference
し、キャッシュからアイテムを削除できます。
弱参照メカニズムを介してIndexReader
、キャッシュを切断できます。IndexReader
コントロールは、キーオブジェクトを破棄することでキャッシュアイテムの有効性を制御し、キャッシュはそれ自体をクリーンアップします。