Python MemoryError - 如何强制删除对象

时间:2009-05-26 11:11:41

标签: python memory resources garbage-collection

我有一个处理多个文件的程序,每个文件都会生成一个报告。报告生成部分是一个单独的函数,它接受一个文件名,然后返回。在生成报告期间,中间部分会缓存在内存中,因为它们可能会用于报告的多个部分,以避免重新计算。

当我在目录中的所有文件上运行此程序时,它将运行一段时间,然后使用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本身可能依赖于其他计算。

1 个答案:

答案 0 :(得分:3)