【问题标题】:LRU cache on hard drive python硬盘python上的LRU缓存
【发布时间】:2013-08-02 16:19:08
【问题描述】:

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

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

【问题讨论】:

    标签: python caching hard-drive lru


    【解决方案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,结果会缓存到磁盘。

    【讨论】:

      猜你喜欢
      • 2018-09-10
      • 2011-05-25
      • 1970-01-01
      • 2014-06-22
      • 1970-01-01
      • 1970-01-01
      • 2011-03-02
      • 1970-01-01
      • 2011-01-31
      相关资源
      最近更新 更多