我应该干扰正常的Python垃圾收集过程吗

我应该干扰正常的Python垃圾收集过程吗,python,Python,我有一个大型的Python层次数据集。在我处理完它之后,我需要去掉它——所以我只需要在层次结构的根节点上执行一个del 手动执行gc.collect()——快速删除大数据是一种好的做法,还是我不应该这样做,让Python来做 手动使用gc的正确模式是什么(如果有的话)?CPython垃圾收集器仍然主要基于引用计数,因此如果您的数据结构是真正分层的(不包含循环引用),最后一次引用时的del应将其从内存中清除,无需使用gc模块 尽管如此,我还是建议不要使用del。将函数设置为当最后一个使用数据结构的

我有一个大型的Python层次数据集。在我处理完它之后,我需要去掉它——所以我只需要在层次结构的根节点上执行一个
del

手动执行
gc.collect()
——快速删除大数据是一种好的做法,还是我不应该这样做,让Python来做


手动使用
gc
的正确模式是什么(如果有的话)?

CPython垃圾收集器仍然主要基于引用计数,因此如果您的数据结构是真正分层的(不包含循环引用),最后一次引用时的
del
应将其从内存中清除,无需使用
gc
模块

尽管如此,我还是建议不要使用
del
。将函数设置为当最后一个使用数据结构的函数返回时,最后一个对数据结构的引用就会消失,这要优雅得多:

def load():
    return some_huge_data_structure

def process(ds):
    do_whatever_to(ds)

process(load())  # after this, the huge DS will be gone

当CPython垃圾收集某些内容时,它实际上并不总是将该内存返回到操作系统

Python使用了一个复杂的内存系统“竞技场”和“池”(参见示例)。对象生活在这些池和竞技场中,只有当整个内存竞技场被垃圾收集时,内存才会返回到操作系统

这意味着,在最坏的情况下,可能会有1000个对象占用250MB的内存,因为每个对象都生活在自己的竞技场中,可能有256k大。现在Python以一种非常聪明的方式分配内存,所以这种最坏的情况(几乎)永远不会发生


如果您不断地分配和取消分配大量大小不同的对象,那么您可能会遇到这些内存碎片问题。在这种情况下,Python不会给OS返回很多内存,而且遗憾的是,你不能做很多事情。

我告诉你,通常的建议是让GC /引用计数工作,但是,来自C++的,我经常发现自己直觉地“代码> DEL< /CODE > INGO /不相信GC比我想的多。我没有循环引用。但是你是说如果我有它们,运行
gc
是必要的吗?我实际上是在编写一个服务器,数据必须跨请求持久化——因此我不能使用
del
,而是让数据像你描述的那样消失。python gc只用于循环引用。引用计数完成其余工作。@good_computer:当内存使用率持续上升时,您有一个迹象表明GC没有完成它的工作(假设您没有运行包含内存泄漏的C扩展)。即使您有循环引用,
GC
模块也很可能不是最佳解决方案,但事实上,这是一个很好的例子。