2

我希望能够像使用functools.lru_cache那样装饰一个函数,但是,我希望将结果缓存在硬盘驱动器上而不是内存中。环顾四周,我觉得这是一个已解决的问题,我想知道是否有人能指出我正确的方向(或者至少再给我几个关键词来尝试谷歌搜索)

我不知道这是否会有所帮助或是否重要,但该功能是从唯一的文件名计算图像。

4

1 回答 1

1

这里有一些代码可以帮助您入门:

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,结果将被缓存到磁盘。

于 2021-06-20T05:07:08.790 回答