【问题标题】:Avoiding "mass evictions" in an LRU cache避免 LRU 缓存中的“大规模驱逐”
【发布时间】:2014-02-15 16:40:55
【问题描述】:

我已经实现了 LRU 缓存。插入新项目的过程如下所示:

  1. 检查干草堆中是否有足够的空间。如果是,请跳至 4。
  2. 删除最近最少使用的项目。
  3. 检查是否有足够的空间。如果没有,请重复 2。
  4. 在可用空间中插入项目。

项目在大海捞针中有效地随机排序。

当需要插入的项目比以前的项目大时,就会出现问题。它会导致“大规模驱逐”,在这种情况下,它会继续驱逐,直到有足够多的项目被驱逐,以至于恰好有几个连续的项目被驱逐。

这种“大规模驱逐”通常涉及驱逐数以万计的物品。

可以做些什么来避免或减轻这种“大规模驱逐”?

【问题讨论】:

  • 为什么缓存实现为连续内存?你不能使用指针和好的分配器库吗?

标签: c algorithm computer-science lru


【解决方案1】:

也许您可以查看 Buddy 内存分配,例如用于Linux 内核:

http://en.wikipedia.org/wiki/Buddy_memory_allocation

这样,我想你仍然会驱逐比严格必要的更多的项目,但是因为伙伴方法在避免碎片方面很有效,我假设你会更快地找到一个大块。

【讨论】:

    【解决方案2】:

    我会检查给每个缓存条目一个与其大小和年龄成正比的权重。

    (例如,非常旧的非常大的物品有很大的重量。非常小的尺寸非常旧的物品几乎没有那么重)

    然后根据“重量”驱逐事物。这将有利于驱逐较大的和中等旧的项目,而不是驱逐一万个较旧的小项目。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-04-21
      • 1970-01-01
      • 2017-07-26
      • 1970-01-01
      • 1970-01-01
      • 2022-11-11
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多