持久字典,其中键可以是任何可以清除的

时间:2014-04-30 22:37:11

标签: python dictionary persistence memoization

我正在实现functools.lru_cache的小“持久”版本,其中“持久”意味着在后续运行之间不会破坏缓存。为此,我想我可以简单地替换functools.lru_cache shelve对象使用的词典,但我遇到str要求密钥为str(hash(...).to_int(...))英格斯。我尝试使用hash(...)来修复它,但是shelve对于cpython解释器的不同运行之间的相同对象并不相同。

是否有类似str的类允许任何可哈希的密钥,而不仅仅是{{1}},同时可以像字典一样透明地访问?

一些细节:我的缓存可能大约为100MB。它经常被阅读并且不经常写。

2 个答案:

答案 0 :(得分:1)

具体的解决方案实际上取决于您的需求,但您可能会发现使用数据库是您案例的最佳解决方案。您也可以使用pickle而不是搁置,但这当然有其缺点。

  • 是缓存大吗?

然后你需要一种解决方案,它避免在每次访问时读取/写入整个缓存(例如基于pickle的解决方案),例如, DB。

  • 经常访问吗?

那么你可能还想要一个内存缓存来避免频繁的慢速外部访问。

快速谷歌搜索发现:persistentdict

另见this question

答案 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)