我正在尝试使用 klepto 进行 LRU 缓存。我想将缓存存储到磁盘,并且目前正在为此使用 klepto 的dir_archive
选项。我编写了以下代码,主要基于 klepto 测试脚本中的代码:
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 删除单个项目,而是lru_cache
清除整个缓存!下面是执行此操作的 klepto 源代码(https://github.com/uqfoundation/klepto/blob/master/klepto/safe.py):
# 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]
所以我的问题是,为什么 klepto 会清除“归档”缓存?可以lru_cache
和dir_archive
一起使用吗?
另外,如果我的代码看起来完全疯了,我真的很感激一些关于我应该如何编写它的示例代码,因为没有太多关于 klepto 的文档。
附加说明:我也尝试dir_archive
用cached=True
. 当maxsize
达到时,内存中的缓存仍然会被清除,但缓存的内容会在此时转储到归档缓存中。我有几个问题:
- 内存中的缓存只有在达到时才准确
maxsize
,此时它被擦除。 - 归档缓存不受
maxsize
. 每次maxsize
内存缓存到达时,内存缓存中的所有项目都会转储到归档缓存中,无论有多少已经存在。 - 基于第 1 点和第 2 点,LRU 缓存似乎是不可能的。