如何在Python中显式释放内存?
我写了一个Python程序,它会处理一个很大的输入文件,生成几百万个代表三角形的对象。这个程序的步骤是:
- 读取一个输入文件
- 处理这个文件,创建一个三角形的列表,每个三角形由它的顶点表示
- 以OFF格式输出这些顶点:先列出所有顶点,然后列出三角形。三角形是通过顶点列表中的索引来表示的
由于OFF格式要求我在输出三角形之前,必须先打印出完整的顶点列表,这就意味着我必须在写入文件之前,把三角形的列表保存在内存中。可是,由于这些列表的大小,我遇到了内存错误。
那么,怎么才能告诉Python我不再需要某些数据,可以把它们释放掉呢?
10 个回答
可以使用 del
这个命令来删除东西,但我记得它并不能保证会释放内存。你可以在这里查看相关文档,还有这里解释为什么内存没有被释放。
我听说在Linux和Unix系统上,有人会启动一个Python进程来完成一些工作,得到结果后再把它杀掉。
这篇文章提到了Python的垃圾回收机制,但我觉得缺乏内存控制是管理内存的一个缺点。
不幸的是(这取决于你使用的Python版本和发布情况),某些类型的对象会使用“自由列表”,这是一种很不错的本地优化方式,但可能会导致内存碎片化。具体来说,它会让越来越多的内存被“专门留给”某种类型的对象,从而使这些内存无法被“公共资源”使用。
确保大量但临时使用的内存在完成后能将所有资源归还给系统的唯一可靠方法,就是让这些使用发生在一个子进程中。这个子进程负责处理内存需求大的工作,然后再结束。在这种情况下,操作系统会正常工作,乐意回收子进程可能占用的所有资源。幸运的是,multiprocessing
模块让这种操作(以前比较麻烦)在现代版本的Python中变得简单多了。
在你的使用场景中,似乎让子进程收集一些结果,同时确保这些结果可以被主进程使用的最好方法是使用半临时文件(这里的半临时是指,不是那种关闭后就自动消失的文件,而是普通文件,你在完成后会明确删除它们)。
根据Python官方文档,你可以手动调用垃圾回收器来释放那些没有被引用的内存,方法是使用gc.collect()
。举个例子:
import gc
gc.collect()
在你使用del
标记想要丢弃的内容之后,应该执行这个操作:
del my_array
del my_object
gc.collect()