我正在实现functools.lru_cache的小“持久”版本,其中“持久”意味着在后续运行之间不会破坏缓存。为此,我想我可以简单地替换functools.lru_cache
shelve
对象使用的词典,但我遇到str
要求密钥为str(hash(...).to_int(...))
英格斯。我尝试使用hash(...)
来修复它,但是shelve
对于cpython解释器的不同运行之间的相同对象并不相同。
是否有类似str
的类允许任何可哈希的密钥,而不仅仅是{{1}},同时可以像字典一样透明地访问?
一些细节:我的缓存可能大约为100MB。它经常被阅读并且不经常写。
答案 0 :(得分:1)
具体的解决方案实际上取决于您的需求,但您可能会发现使用数据库是您案例的最佳解决方案。您也可以使用pickle
而不是搁置,但这当然有其缺点。
然后你需要一种解决方案,它避免在每次访问时读取/写入整个缓存(例如基于pickle的解决方案),例如, DB。
那么你可能还想要一个内存缓存来避免频繁的慢速外部访问。
快速谷歌搜索发现:persistentdict。
答案 1 :(得分:0)
可以按照您想要的方式对Shelf
进行子类化吗?
from shelve import Shelf
class SubShelf(Shelf):
def __init__(self):
super().__init__()
def __setitem__(self, key, val):
h = str(hash(key))
super().__setitem__(h, val)
def __getitem__(self, key):
h = str(hash(key))
return super().__getitem__(h)