【问题标题】:Is it ok to simply cache every search using a CachingWrapperFilter?可以使用 CachingWrapperFilter 简单地缓存每个搜索吗?
【发布时间】:2013-02-11 22:23:03
【问题描述】:

使用 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);

更新

CachingWrapperFilter 的 Lucene.Net 实现也使用与垃圾收集相关的机制。它实现了一个WeakDictionary 类,该类使用WeakReference 类的实例进行键控。这是一个内置的 .Net 类,它包装任何对象并提供一种方法来检查该对象是否已被垃圾收集。这表明我的问题的答案是肯定的。 Lucene 缓存的内存管理将受到控制,因为它本质上与运行时垃圾收集器相关联,并且只要缓存项仍然有效,就会对其进行维护。

更详细一点...

缓存的密钥由IndexReader 提供,然后包装在WeakReference 中。 IndexReader 管理它作为缓存键提供的对象。当它们不再有效时,它们将被丢弃并随后被垃圾收集。然后缓存可以通过WeakReference 检测到这一点,并从缓存中删除该项目。

通过弱引用机制,IndexReader 和缓存可以断开连接。 IndexReader通过释放key对象来控制缓存项的有效性,缓存自行清理。

【问题讨论】:

    标签: caching lucene lucene.net


    【解决方案1】:

    在 Java Lucene 中,这个特定的缓存使用WeakHashMap,这意味着一旦内存压力加剧,条目将被自动清除。如果 .NET 中有 WeakHashMap 的对应物,我希望它也会被使用。

    【讨论】:

    • WeakHashMap 将在不再引用密钥时删除条目。因此,它在使用映射时避免了常见的内存“泄漏”,但它不会对内存压力做出任何不同的响应(尽管 gc 可能暂时不会运行)。
    猜你喜欢
    • 1970-01-01
    • 2014-09-03
    • 2017-07-20
    • 1970-01-01
    • 1970-01-01
    • 2020-09-23
    • 2016-12-25
    • 1970-01-01
    • 2015-11-24
    相关资源
    最近更新 更多