如何重命名Diskcache记忆化缓存并保留原有计算数据?
重命名diskcache中memoize的现有缓存键
diskcache的Cache.memoize装饰器若省略name参数,会基于函数全名生成缓存键,但函数全名受导入方式影响,导致不同脚本无法共享缓存。如果已基于自动推断的名称生成大量缓存,不想重新计算,可按以下步骤将现有缓存键迁移到新的显式name对应的键:
1. 确认新旧缓存键前缀
memoize的缓存键格式为memoize:{name}:{args_hash},其中name是自动推断的函数全名或显式指定的名称。先确定旧的推断名称(例如函数在mymodule.utils中,推断名称可能是mymodule.utils.long_computation),以及新的显式名称(比如my_long_computation)。
2. 遍历迁移缓存键
通过Cache的迭代器遍历所有键,筛选出旧前缀的键,将对应值复制到新前缀的键,可选删除旧键以节省空间:
from diskcache import Cache # 初始化缓存实例 cache = Cache("path/to/your/cache/directory") # 替换为实际的旧推断名称和新显式名称 old_memoize_name = "mymodule.utils.long_computation" new_memoize_name = "my_long_computation" # 遍历所有缓存键 for key in cache.iterkeys(): if isinstance(key, str) and key.startswith(f"memoize:{old_memoize_name}:"): # 生成新键 new_key = key.replace(f"memoize:{old_memoize_name}:", f"memoize:{new_memoize_name}:") # 复制缓存值到新键 cache.set(new_key, cache.get(key)) # 可选:删除旧键 # cache.delete(key) print("缓存键迁移完成")
3. 更新函数的装饰器
修改目标函数的memoize装饰器,指定显式name参数,确保后续调用使用新的缓存键:
@cache.memoize(name="my_long_computation") def long_computation(*args): # 原函数逻辑 ...
注意事项
- 迁移前建议备份缓存目录,避免数据丢失。
- 若缓存条目数量庞大,遍历迁移可能耗时,建议在低负载时段执行。
内容的提问来源于stack exchange,提问作者J E K
相关产品推荐
相关产品推荐

