我写了一个Python程序,它作用于一个大的输入文件,以创建数百万个表示三角形的对象。算法为:
读取输入文件 处理该文件并创建一个三角形列表,由它们的顶点表示 以OFF格式输出顶点:顶点列表后面跟着三角形列表。三角形由顶点列表中的索引表示
OFF要求我在打印三角形之前打印出完整的顶点列表,这意味着在我将输出写入文件之前,我必须将三角形列表保存在内存中。与此同时,由于列表的大小,我得到了内存错误。
告诉Python我不再需要某些数据,并且可以释放这些数据的最佳方式是什么?
我写了一个Python程序,它作用于一个大的输入文件,以创建数百万个表示三角形的对象。算法为:
读取输入文件 处理该文件并创建一个三角形列表,由它们的顶点表示 以OFF格式输出顶点:顶点列表后面跟着三角形列表。三角形由顶点列表中的索引表示
OFF要求我在打印三角形之前打印出完整的顶点列表,这意味着在我将输出写入文件之前,我必须将三角形列表保存在内存中。与此同时,由于列表的大小,我得到了内存错误。
告诉Python我不再需要某些数据,并且可以释放这些数据的最佳方式是什么?
当前回答
Python是垃圾回收的,所以如果你减少列表的大小,它会回收内存。你也可以使用"del"语句完全摆脱一个变量:
biglist = [blah,blah,blah]
#...
del biglist
其他回答
Python是垃圾回收的,所以如果你减少列表的大小,它会回收内存。你也可以使用"del"语句完全摆脱一个变量:
biglist = [blah,blah,blah]
#...
del biglist
根据Python官方文档,你可以显式调用gc.collect()来释放未引用的内存。例子:
import gc
gc.collect()
你应该在使用del标记你想丢弃的东西后这样做:
del my_array
del my_object
gc.collect()
其他人已经发布了一些方法,您可以“哄骗”Python解释器释放内存(或以其他方式避免内存问题)。你应该先尝试他们的想法。但是,我觉得有必要直接回答你的问题。
实际上没有任何方法可以直接告诉Python释放内存。事实是,如果你想要这么低的控制级别,你将不得不用C或c++写一个扩展。
也就是说,有一些工具可以帮助解决这个问题:
cython 痛饮 提高python
(del可以成为你的朋友,因为当没有其他引用时,它将对象标记为可删除。现在,CPython解释器通常会保留这个内存以供以后使用,所以您的操作系统可能看不到“释放”的内存。)
通过对数据使用更紧凑的结构,也许一开始就不会遇到内存问题。 因此,与标准数组模块或第三方numpy模块使用的格式相比,数字列表的内存效率要低得多。您可以通过将顶点放在NumPy 3xN数组中,将三角形放在n元素数组中来节省内存。
正如其他答案已经说过的,Python可以避免释放内存给操作系统,即使Python代码不再使用内存(因此gc.collect()不会释放任何东西),特别是在长时间运行的程序中。无论如何,如果您在Linux上,您可以尝试通过直接调用libc函数malloc_trim(手册页)来释放内存。 喜欢的东西:
import ctypes
libc = ctypes.CDLL("libc.so.6")
libc.malloc_trim(0)