我正在尝试使用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_cache
清除整个缓存,而不是使用LRU删除单个项目!下面是执行此操作的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
时,内存缓存中的所有项都将转储到存档缓存中,无论已存在多少项。