如何在 Python 中显式释放内存?

新手上路,请多包涵

我写了一个 Python 程序,它作用于一个大的输入文件来创建几百万个代表三角形的对象。该算法是:

  1. 读取输入文件
  2. 处理文件并创建一个三角形列表,由它们的顶点表示
  3. 以 OFF 格式输出顶点:顶点列表后跟三角形列表。三角形由顶点列表中的索引表示

OFF 要求我在打印出三角形之前打印出完整的顶点列表,这意味着我必须在将输出写入文件之前将三角形列表保存在内存中。与此同时,由于列表的大小,我遇到了内存错误。

告诉 Python 我不再需要某些数据并且可以释放它的最佳方式是什么?

原文由 Nathan Fellman 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 405
2 个回答

根据 Python 官方文档,您可以使用 gc.collect() 显式调用垃圾收集器以释放未引用的内存。例子:

 import gc

gc.collect()

您应该在使用 del 标记要丢弃的内容后执行此操作:

 del my_array
del my_object
gc.collect()

原文由 Havenard 发布,翻译遵循 CC BY-SA 4.0 许可协议

不幸的是(取决于您的 Python 版本和发行版)某些类型的对象使用“空闲列表”,这是一种简洁的局部优化,但可能会导致内存碎片,特别是通过使越来越多的内存“指定”用于特定类型的对象和因此无法使用“普通基金”。

确保大量但临时使用内存确实在完成后将所有资源返回给系统的唯一真正可靠的方法是让该使用发生在子进程中,该子进程完成耗费内存的工作然后终止。在这种情况下,操作系统将完成它的工作,并乐于回收子进程可能吞噬的所有资源。幸运的是, multiprocessing 模块使这种操作(过去相当痛苦)在现代版本的 Python 中并不太糟糕。

在您的用例中,子流程积累一些结果并确保这些结果可用于主流程的最佳方法似乎是使用半临时文件(我的意思是半临时文件,不是那种文件关闭时自动消失,只是普通文件,当你完成它们时明确删除)。

原文由 Alex Martelli 发布,翻译遵循 CC BY-SA 3.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题