代码之家  ›  专栏  ›  技术社区  ›  Staale

Python MemoryError-如何强制删除对象

  •  0
  • Staale  · 技术社区  · 17 年前

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

    当我在一个目录中的所有文件上运行这个程序时,它将运行一段时间,然后用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]
    

    它的一个实例被创建,然后传递给报表中的每个元素。此实例仅保留在报表创建方法中的本地引用中。

    1 回复  |  直到 17 年前
        1
  •  3
  •   bayer    17 年前