首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何在磁盘上使用LRU缓存?

如何在磁盘上使用LRU缓存?
EN

Stack Overflow用户
提问于 2015-08-18 19:37:46
回答 1查看 184关注 0票数 1

我正在尝试使用反盗贼来进行LRU缓存。我想将缓存存储到磁盘中,目前正在使用klepto的dir_archive选项。我编写了以下代码,主要是基于劫用测试脚本中的代码:

代码语言:javascript
复制
def mymap(data):
    return hashlib.sha256(data).hexdigest()

class MyLRUCache:
    @lru_cache(cache=dir_archive(cached=False), keymap=mymap, ignore='self', maxsize=5)
    def __call__(self, data)
        return data

    call = __call__

    def store(self, data):
        self.call(data)

    # I would also appreciate a better way to do this, if possible.
    def lookup(self, key):
        return self.call.__cache__()[key]

在缓存到达maxsize之前,这段代码似乎运行良好。此时,lru_cache将清除整个缓存,而不是使用LRU删除单个项!下面是执行此操作的盗贼的源代码(https://github.com/uqfoundation/klepto/blob/master/klepto/safe.py):

代码语言:javascript
复制
# purge cache
if _len(cache) > maxsize:
    if cache.archived():
        cache.dump()
        cache.clear() 
        queue.clear()
        refcount.clear()
     else: # purge least recently used cache entry
        key = queue_popleft()
        refcount[key] -= 1
        while refcount[key]:
            key = queue_popleft()
            refcount[key] -= 1
        del cache[key], refcount[key]

所以我的问题是,为什么盗贼清除“存档”缓存?是否可以同时使用lru_cachedir_archive

此外,如果我的代码看上去完全疯了,我会非常感激一些示例代码,说明我的应该如何编写这个代码,因为没有多少关于盗贼的文档。

附加注意事项:我还尝试用dir_archive定义cached=True。到达maxsize时,内存中的缓存仍然会被清除,但是缓存的内容会在此时转储到归档缓存中。我对此有几个问题:

  1. 只有在到达maxsize之前,内存缓存才是准确的,这时它就被删除了.
  2. 存档缓存不受maxsize的影响。每次内存缓存到达maxsize时,内存缓存中的所有项都被转储到归档缓存中,而不管有多少项已经存在。
  3. 基于第1点和第2点,LRU缓存似乎是不可能的。
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2015-08-25 01:19:54

答案是,你不能在你的问题之前,但现在你可以。如果您从github获得了最新的klepto,并提供了新的标志purge=False --那么您将得到正在寻找的行为。我只是在回答你的问题时加了这个。

就你而言:

lru_cache(cache=dir_archive(cached=False), keymap=mymap, ignore='self', maxsize=5, purge=False)

或者,例如:

代码语言:javascript
复制
@lru_cache(maxsize=3, cache=dict_archive('test'), purge=True)
def identity(x):
  return x

identity(1)
identity(2)
identity(3)
ic = identity.__cache__()
assert len(ic.keys()) == 3
assert len(ic.archive.keys()) == 0
identity(4)
assert len(ic.keys()) == 0
assert len(ic.archive.keys()) == 4
identity(5)
assert len(ic.keys()) == 1
assert len(ic.archive.keys()) == 4

@lru_cache(maxsize=3, cache=dict_archive('test'), purge=False)
def inverse(x):
  return -x

inverse(1)
inverse(2)
inverse(3)
ic = inverse.__cache__()
assert len(ic.keys()) == 3
assert len(ic.archive.keys()) == 0
inverse(4)
assert len(ic.keys()) == 3
assert len(ic.archive.keys()) == 1
inverse(5)
assert len(ic.keys()) == 3
assert len(ic.archive.keys()) == 2

如果这不符合你的预期,请加一张票。谢谢你的建议。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/32081207

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档