我在Python中有一个大的分层数据集。在我完成它之后,我需要摆脱它 - 所以我只是在层次结构的根节点上做del
。
手动执行gc.collect()
是否可行 - 快速删除大数据或不应该这样做并让Python做生意是一种好习惯吗?
手动使用gc
的正确模式(如果有)是什么?
答案 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不会给操作系统返回太多内存,遗憾的是你无法做太多关于它的事情。