我写了一个Python程序,它作用于一个大的输入文件,以创建数百万个表示三角形的对象。算法为:

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

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

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


当前回答

Python是垃圾回收的,所以如果你减少列表的大小,它会回收内存。你也可以使用"del"语句完全摆脱一个变量:

biglist = [blah,blah,blah]
#...
del biglist

其他回答

Python是垃圾回收的,所以如果你减少列表的大小,它会回收内存。你也可以使用"del"语句完全摆脱一个变量:

biglist = [blah,blah,blah]
#...
del biglist

del语句可能有用,但IIRC不能保证释放内存。医生来了…这里有一个不发布的原因。

我听说有人在Linux和unix类型的系统上使用python进程来做一些工作,得到结果,然后终止它。

本文介绍了Python垃圾收集器,但我认为缺乏内存控制是托管内存的缺点

你不能显式地释放内存。您需要做的是确保不保留对对象的引用。然后它们将被垃圾收集,释放内存。

在您的情况下,当您需要大型列表时,通常需要重新组织代码,通常使用生成器/迭代器代替。这样你就不需要在内存中存储大的列表。

正如其他答案已经说过的,Python可以避免释放内存给操作系统,即使Python代码不再使用内存(因此gc.collect()不会释放任何东西),特别是在长时间运行的程序中。无论如何,如果您在Linux上,您可以尝试通过直接调用libc函数malloc_trim(手册页)来释放内存。 喜欢的东西:

import ctypes
libc = ctypes.CDLL("libc.so.6")
libc.malloc_trim(0)

根据Python官方文档,你可以显式调用gc.collect()来释放未引用的内存。例子:

import gc

gc.collect()

你应该在使用del标记你想丢弃的东西后这样做:

del my_array
del my_object
gc.collect()