4

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コントロールは、キーオブジェクトを破棄することでキャッシュアイテムの有効性を制御し、キャッシュはそれ自体をクリーンアップします。

4

1 に答える 1

3

Java Luceneでは、この特定のキャッシュが使用WeakHashMapされています。これは、メモリの負荷が高まると、エントリが自動的にクリアされることを意味します。.NETに対応するものがあれば、WeakHashMapそれも使用されると思います。

于 2013-02-06T17:26:27.213 に答える