我希望能够像使用functools.lru_cache那样装饰一个函数,但是,我希望将结果缓存在硬盘驱动器上而不是内存中。环顾四周,我觉得这是一个已解决的问题,我想知道是否有人能指出我正确的方向(或者至少再给我几个关键词来尝试谷歌搜索)
我不知道这是否会有所帮助或是否重要,但该功能是从唯一的文件名计算图像。
我希望能够像使用functools.lru_cache那样装饰一个函数,但是,我希望将结果缓存在硬盘驱动器上而不是内存中。环顾四周,我觉得这是一个已解决的问题,我想知道是否有人能指出我正确的方向(或者至少再给我几个关键词来尝试谷歌搜索)
我不知道这是否会有所帮助或是否重要,但该功能是从唯一的文件名计算图像。
这里有一些代码可以帮助您入门:
from pathlib import Path
import pickle
import hashlib
import os
class LRU_Cache:
def __init__(self, directory, original_function, maxsize=10):
self.directory = directory
self.original_function = original_function
self.maxsize = maxsize
try:
os.mkdir(directory)
except OSError:
pass
def __call__(self, *args):
filename = hashlib.sha1(pickle.dumps(args)).hexdigest()
fullname = os.path.join(self.directory, filename)
try:
with open(fullname, 'rb') as f:
value = pickle.load(f)
Path(fullname).touch()
return value
except FileNotFoundError:
pass
value = self.original_function(*args)
with open(fullname, 'wb') as f:
pickle.dump(value, f)
filenames = os.listdir(self.directory)
if len(filenames) <= self.maxsize:
return
fullnames = [os.path.join(self.directory, filename)
for filename in filenames]
oldest = min(fullnames, key=lambda fn: os.stat(fn).st_mtime)
os.remove(oldest)
它使用散列参数为每个函数调用创建一个唯一的文件名。使用该文件名腌制函数返回值。
缓存命中取消存储的结果并更新文件修改时间。
如果缓存目录超过目标大小,则删除最旧的缓存文件。
像这样使用它:
def square(x):
print('!')
return x ** 2
sqr = LRU_Cache('square_cache', square, 10)
现在正常调用sqr,结果将被缓存到磁盘。