【问题标题】:Persistent memoization/caching持久记忆/缓存
【发布时间】:2016-06-27 12:58:06
【问题描述】:

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

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

所以我想这门课看起来像:

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,但我需要特定于类实例的持久性。然后我找到了这个persistent lazy caching dictionary,看起来很不错(虽然我不需要懒惰的评估),但不清楚如何将原始文件放入其中。

是否有任何工具可以在某种程度上回答这个问题?尝试使用装饰器来实现这一点是否合理? (例如,装饰将执行此源搜索的方法)

【问题讨论】:

  • The program loops through many of these classes, - 你是说(可能)有很多类的实例,每个实例都需要访问相同的数据?
  • 该类有很多实例,但每个实例都会访问不同的原始文件。
  • 我的建议:不要费心做自己的内存缓存,只需将数据存储在结果文件中,并依靠操作系统的文件缓存来提供对这些数据的快速访问。

标签: python caching memcached persistence memoization


【解决方案1】:

你看过joblib吗?

它基本上做了这三个功能:

  1. 输出值的透明磁盘缓存和延迟重新评估(记忆模式)
  2. 简单简单的并行计算
  3. 执行记录和跟踪

我在搜索 2 号时遇到了它,并正在考虑使用它,但我记得看到它还具有记忆和缓存功能。

【讨论】:

  • 谢谢阿迪亚。这看起来确实是一个有用的包,但最后我编写了自己的装饰器,使用了h5py。我是 HDF5 的忠实粉丝。 :-)
  • 很公平。感谢您接受答案。顺便说一句,感谢 Topas 的出色工作。
猜你喜欢
  • 2013-05-04
  • 2016-02-16
  • 1970-01-01
  • 2021-11-24
  • 2016-05-19
  • 1970-01-01
  • 2012-07-06
  • 2021-02-21
  • 2018-12-16
相关资源
最近更新 更多