On 3/19/2015 8:49 PM, Umesh Prasad wrote:
> It might be because LRUCache by default will try to evict its entries on
> each call to put and putAll. LRUCache is built on top of java's
> LinkedHashMap. Check the javadoc of removeEldestEntry
> <http://docs.oracle.com/javase/7/docs/api/java/util/LinkedHashMap.html#removeEldestEntry%28java.util.Map.Entry%29>
>
>
> Try using LFUCache and a separate cleanup thread .. We have been using that
> for over 2 yrs now without any issues ..

All cache implementations evict old entries on "put" if the cache is
full, including LFUCache.  What's different is how the evicted entry is
chosen and how efficient the eviction process is.

I wrote the LFUCache implementation that's currently in Solr.  It is the
most basic naive implementation of LFU that you can write, the kind of
thing that a beginning Computer Science student would write to show a
correct implementation. :)  It's probably suitable for very small cache
sizes (double digits), but if the cache size is large, LFUCache is very
inefficient at eviction.  With a large size, it might hit the CPU even
harder than LRUCache.

I have written a much better implementation that's more efficient, I
need to polish the code and commit it.

As a general rule, I would expect the LRU implementations to always be
more efficient at eviction than any implementation of LFU, but some
query patterns will have a higher cache hitCount with an LFU
implementation, so the tradeoff might be worth making.

Thanks,
Shawn

Reply via email to