坚持memoization/caching

Persistent memoization/caching

我想要一个 class 为某些分析结果提供接口,但结果的来源是在运行时确定的。第一次计算结果时,结果必须来自原始数据文件。这个计算需要很长时间,所以我想把它存储在一个结果文件中以便将来快速访问(我打算为此使用 msgpack)。但如果结果仍在内存中,那么我想使用那个版本,所以我不需要继续读取结果文件。

程序循环遍历其中许多 classes,因此可能会占用大量内存。出于这个原因,我认为最好有一个固定大小(或时间限制)的全局缓存。不幸的是,事先并不知道需要哪些结果,所以我无法通过一些预处理步骤来处理这个问题。如果需要,我需要能够从原始文件中获取新结果。

所以我想 class 看起来像:

class MyClass(object)
    def __init__(self, orig_file, result_file, cache):
        self.orig_file = orig_file
        self.result_file = result_file
        self.cache = cache

    def get_result(self, name):
        if name in self.cache:
            return self.cache[name]

        elif name in self.result_file:
            return self.result_file[name]

        else:  # compute for first time
            return self.orig_file.calculate(name)

最初的搜索返回了如此多的潜在路线,以至于我不知所措。我正在考虑某种持久性记忆,如 this, but I need the persistence to be specific to a class instance. Then I found this persistent lazy caching dictionary,它看起来非常好(虽然我不需要惰性评估),但不清楚如何将原始文件处理成这个。

是否有任何工具可以帮助回答这个问题?尝试用装饰器实现这一点是否合理? (例如,装饰方法将执行此源搜索)

你看过joblib了吗?

它基本上完成了这三个功能:

  1. transparent disk-caching of the output values and lazy re-evaluation (memoize pattern)
  2. easy simple parallel computing
  3. logging and tracing of the execution

我在搜索数字 2 时 运行 浏览过它并正在考虑使用它,但我记得看到它也具有记忆和缓存功能。