【发布时间】:2009-12-20 12:59:40
【问题描述】:
我们有一个 C++ 应用程序,我们试图提高其性能。我们发现数据检索需要很多时间,并且想要缓存数据。我们无法将所有数据存储在内存中,因为它很大。我们希望在内存中存储多达 1000 个项目。这些项目可以通过long 键进行索引。但是,当缓存大小超过 1000 时,我们希望删除最长时间未访问的项目,因为我们假设某种“引用位置”,即我们假设缓存中的项目最近被访问可能会再次访问。
你能建议一种实现它的方法吗?
我最初的实现是使用map<long, CacheEntry> 来存储缓存,并将accessStamp 成员添加到CacheEntry,每当创建或访问条目时,该成员将设置为递增计数器。当缓存满了,需要一个新的entry时,代码会扫描整个cache map,找到accessStamp最低的那个entry,将其移除。
这样做的问题是,一旦缓存已满,每次插入都需要对缓存进行全面扫描。
另一个想法是在缓存映射之外保存CacheEntries 的列表,并在每次访问时将访问的条目移动到列表的顶部,但问题是如何在列表中快速找到该条目。
您能提出更好的方法吗?
谢谢
分裂者
【问题讨论】:
-
@Neil 在这种情况下不能使用
accessStamp? -
不,因为它会改变。密钥必须保持不变。
-
@Niel 谢谢你的回答。我没有仔细考虑是我的错。
-
我更喜欢 accessStamp。我认为可以理解,“时间戳”可能是随时间增加的任何内容,不一定是访问的实际日期/时间。我会发现 accessCount 令人困惑,因为我想知道它是对所有缓存条目的所有访问计数(最近的缓存),还是仅对这个条目的访问计数(最常用的缓存)。
-
@Steve 我真的不明白你在说什么。如果您想要 MRU 缓存,则必须使用时间戳。如果你想要一个 MFU,你必须使用计数。在第一种情况下,我将其称为 accessStamp,在后一种情况下称为 accessCount。