缓存条目替换算法

时间:2011-03-11 20:29:14

标签: c# c++ algorithm caching

我有一个软件项目,可以从不同大小的对象创建一系列指纹(哈希)值。当然,对象大小越大,散列的计算就越昂贵。哈希用于比较目的。

我现在希望缓存哈希值,以提高后续比较的性能。对于缓存中的任何给定条目,我有以下指标:

  • 点击次数
  • 最后修改日期/时间
  • 对象的大小哈希

关于我的问题。鉴于需要约束缓存的大小(将其限制为特定数量的条目),更换缓存项的平衡方法是什么?

显然,较大的对象散列更昂贵,因此需要尽可能长时间地保持它们。但是,我想避免使用大量大对象填充缓存会阻止将来(较小)的项目被缓存的情况。

因此,根据我可用的指标(见上文),我正在寻找一个好的通用“公式”,用于在缓存变满时使缓存条目到期(删除)。

所有想法,评论都表示赞赏。

5 个答案:

答案 0 :(得分:1)

您需要考虑对象的性质。想想很快就会再次调用对象的概率。并删除最不可能的对象。

这非常特定于您使用的软件和对象的性质 如果他们在计划中持续使用,他们可能会遵守Locality of reference原则。所以你应该使用LRU(最近最少使用)算法。

如果更有可能再次调用具有较高命中数的对象,则使用该对象(并删除最低值)。

查看Cache Algorithms

原则上,您需要计算:

分钟(p *费用)

p =再次被召唤的概率。
费用 =再次缓存该对象的费用。

答案 1 :(得分:1)

假设能够记录上次访问某个条目的时间,我会为每个条目选择“成本”,您可以随时删除最便宜的条目。

Cost = Size * N - TimeSinceLastUse * M 

假设您完全从缓存中删除条目(并且不保留旧的hitcount数据)我会避免使用hitcount作为指标,您最终会得到一个具有高hitcount的条目,因为它已存在很长时间时间,它会更长,因为它有很高的数量。

答案 2 :(得分:1)

我通常使用严格最近最少使用(LRU)的方案来丢弃缓存中的内容,除非重建某些项目的成本非常高 。 LRU具有易于实现的优点,并且适用于广泛的应用程序。它还将最常用的项目保留在缓存中。

本质上,我创建了一个也被字典索引的链表。当客户想要一个项目时,我会在字典中查找它。如果找到了,我将节点从链接列表中取消链接并将其移动到列表的头部。如果该项不在缓存中,我构造它(从磁盘加载它,或其他),将它放在列表的头部,将其插入字典,然后删除列表尾部的项目

答案 3 :(得分:1)

可能想尝试多级缓存。将一定百分比的缓存专用于昂贵以创建项目和一部分以便于创建但访问更多的项目。然后,您可以使用不同的策略来维护昂贵的缓存,而不是使用较便宜的缓存。

答案 4 :(得分:0)

该算法可以考虑再现缺失元素的成本。这样,您就可以将最有价值的项目保留在缓存中。