我有一个程序可以处理几个文件,每个文件都会生成一个报告。报表生成部分是一个单独的函数,它接受一个文件名,然后返回。在报表生成期间,中间部分缓存在内存中,因为它们可能用于报表的多个部分,以避免重新计算。
当我在一个目录中的所有文件上运行这个程序时,它将运行一段时间,然后用MemoryError崩溃。如果我在同一个目录中重新运行它,它将跳过它为其成功创建报表的所有文件,然后继续。它将处理几个文件,然后再次崩溃。
现在,为什么在生成报告的方法调用之后,没有清除所有资源,或者至少标记为垃圾收集?没有实例离开,并且我没有使用任何全局对象,并且在每个文件处理之后,所有打开的文件都将关闭。
有没有方法让我验证没有对对象的额外引用?有没有办法在Python中强制垃圾回收?
更多关于实现和缓存的细节。每个报表中有多个元素,每个元素可以依赖于不同的计算,每个计算可以依赖于其他计算。如果已经完成了一次计算,我不想再做一次(大多数都很昂贵)。
以下是缓存的缩写版本:
class MathCache:
def __init__(self): self.cache = {}
def get(data_provider):
if not data_provider.id in self.cache:
self.cache[data_provider.id] = data_provider.get_value(self)
return self.cache[data_provider.id]
它的一个实例被创建,然后传递给报表中的每个元素。此实例仅保留在报表创建方法中的本地引用中。