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 回答