我有一个处理多个文件的程序,每个文件都会生成一个报告。报告生成部分是一个单独的函数,它接受一个文件名,然后返回。在生成报告期间,中间部分会缓存在内存中,因为它们可能会用于报告的多个部分,以避免重新计算。
当我在目录中的所有文件上运行此程序时,它将运行一段时间,然后使用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]
创建一个实例,然后传递给报表中的每个元素。此实例仅保留在报表创建方法中的本地引用中。
所有data_providers都继承自一个公共类,该公共类用于根据散列构造函数参数和类名为该实例创建唯一的id。我传递MathCache,因为data_provider本身可能依赖于其他计算。