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

时间:2012-03-19 11:35:21

标签: python

我在Python中有一个大的分层数据集。在我完成它之后,我需要摆脱它 - 所以我只是在层次结构的根节点上做del

手动执行gc.collect()是否可行 - 快速删除大数据或不应该这样做并让Python做生意是一种好习惯吗?

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

2 个答案:

答案 0 :(得分:3)

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

答案 1 :(得分:1)

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

Python使用复杂的内存系统“arenas”和“pool”(例如,参见http://www.evanjones.ca/memoryallocator/)。对象存在于那些池和竞技场中,并且当整个存储器竞技场被垃圾收集时,内存仅返回到OS。

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

如果你经常分配和取消分配大量不同大小的对象,那么你可能会陷入这些内存碎片问题。在这种情况下,Python不会给操作系统返回太多内存,遗憾的是你无法做太多关于它的事情。