【发布时间】: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