持久字典,其中键可以是hashab中的任何内容

2024-09-29 01:27:40 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在实现一个小型的functools.lru_cache“持久化”版本,其中“持久化”意味着在后续运行之间缓存不会被破坏。为此,我想我可以简单地用shelve对象替换functools.lru_cache使用的字典,但是我遇到了shelve对键的要求。我试图通过使用str(hash(...).to_int(...))来修复它,但是在cpython解释器的不同运行之间,相同对象的hash(...)是不相同的。你知道吗

有没有像shelve这样的类允许任何哈希键,而不仅仅是str键,同时可以像字典一样透明地访问?你知道吗

一些细节:我的缓存可能在100MB左右。这本书读得有点频繁,写得不多。你知道吗


Tags: to对象版本cache字典hashcpython解释器
2条回答

具体的解决方案实际上取决于您的需求,但您可能会发现使用数据库是最适合您的情况的解决方案。您也可以使用pickle而不是shelve,但这当然也有其缺点。你知道吗

  • 缓存大吗?你知道吗

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

  • 是否经常访问?你知道吗

然后,您可能还需要一个内存缓存,以避免频繁的缓慢的外部访问。你知道吗

快速搜索发现:persistentdict。你知道吗

另见this question。你知道吗

子类化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)

相关问题 更多 >