Python内存错误 - 如何强制删除对象

0 投票
1 回答
4025 浏览
提问于 2025-04-15 11:50

我有一个程序,它会处理多个文件,并为每个文件生成一个报告。生成报告的部分是一个单独的函数,它接收一个文件名,然后返回结果。在生成报告的过程中,程序会把一些中间结果保存在内存中,因为这些结果可能会在报告的多个部分中使用,这样可以避免重复计算。

当我在一个文件夹中运行这个程序时,它会运行一段时间,然后因为内存不足而崩溃。如果我再次在同一个文件夹中运行它,它会跳过那些已经成功生成报告的文件,继续处理其他文件。它会处理几个文件后又会崩溃。

那么,为什么在生成报告的函数调用结束后,所有资源没有被清理,或者至少没有被标记为可以回收呢?没有对象在离开,我也没有使用任何全局对象,并且在处理完每个文件后,所有打开的文件都被关闭了。

有没有办法让我确认没有额外的引用指向某个对象?在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]

它的一个实例被创建,然后传递给报告中的每个元素。这个实例只在报告创建方法中的一个局部引用中保留。

所有的数据提供者都继承自一个公共类,这个类的作用是根据构造函数的参数和类名生成一个唯一的ID。我将MathCache作为数据提供者传递,因为数据提供者本身可能依赖于其他计算。

1 个回答

3

撰写回答