缓存时间密集型操作的结果

时间:2012-08-19 05:35:08

标签: python database hash shelve

我有一个程序(PatchDock),它从参数文件中获取输入,并生成一个输出文件。运行这个程序是耗时的,我想缓存过去运行的结果,这样我就不需要运行两次相同的参数了。

我能够将输入和输出文件解析为适当的数据结构。例如,输入文件被解析为类似字典的对象。输入键都是字符串,值是原始数据类型(整数,字符串和浮点数)。

我的方法

我的第一个想法是使用输入文件的md5哈希作为shelve数据库中的键。但是,这无法捕获具有完全相同输入的缓存文件,但输入文件(注释,间距,参数顺序等)略有不同。

散列解析的参数对我来说似乎是最好的方法。但我能想到从字典中获取唯一哈希的唯一方法是对已排序的字符串表示进行哈希处理。

问题

散列参数字典的字符串表示似乎是实现我的最终目标的迂回方式 - 将唯一输入值键入指定输出。有没有更简单的方法来实现这个缓存系统?

理想情况下,我希望用Python实现这一目标。

2 个答案:

答案 0 :(得分:4)

散列已解析输入的已排序表示实际上是执行此操作的最直接方式,也是有意义的方法。你的直觉是正确的。

基本上,您将输入规范化(通过解析并对其进行排序),然后使用它来构造散列键。

答案 1 :(得分:2)

哈希似乎是一种非常可行的方式,但是自己这样做似乎有点矫枉过正。为什么不使用输入元组作为字典的关键字?您不必担心散列和可能的碰撞。您所要做的就是修复关键字参数的订单(并根据您的要求为未设置的关键字添加标记对象)。

如果您使用的是Python 3.2+,您也可能会发现functools.lru_cache很有用。 这是一个装饰器,它将为装饰函数的最后n次调用启用缓存。 如果您使用的是旧版本,则会backports of this functionality out there

此外,似乎有一个名为FileDict的类似目标的项目可能值得一看。