我写了一个Python程序,它作用于一个大的输入文件,以创建数百万个表示三角形的对象。算法为:
读取输入文件 处理该文件并创建一个三角形列表,由它们的顶点表示 以OFF格式输出顶点:顶点列表后面跟着三角形列表。三角形由顶点列表中的索引表示
OFF要求我在打印三角形之前打印出完整的顶点列表,这意味着在我将输出写入文件之前,我必须将三角形列表保存在内存中。与此同时,由于列表的大小,我得到了内存错误。
告诉Python我不再需要某些数据,并且可以释放这些数据的最佳方式是什么?
我写了一个Python程序,它作用于一个大的输入文件,以创建数百万个表示三角形的对象。算法为:
读取输入文件 处理该文件并创建一个三角形列表,由它们的顶点表示 以OFF格式输出顶点:顶点列表后面跟着三角形列表。三角形由顶点列表中的索引表示
OFF要求我在打印三角形之前打印出完整的顶点列表,这意味着在我将输出写入文件之前,我必须将三角形列表保存在内存中。与此同时,由于列表的大小,我得到了内存错误。
告诉Python我不再需要某些数据,并且可以释放这些数据的最佳方式是什么?
当前回答
正如其他答案已经说过的,Python可以避免释放内存给操作系统,即使Python代码不再使用内存(因此gc.collect()不会释放任何东西),特别是在长时间运行的程序中。无论如何,如果您在Linux上,您可以尝试通过直接调用libc函数malloc_trim(手册页)来释放内存。 喜欢的东西:
import ctypes
libc = ctypes.CDLL("libc.so.6")
libc.malloc_trim(0)
其他回答
其他人已经发布了一些方法,您可以“哄骗”Python解释器释放内存(或以其他方式避免内存问题)。你应该先尝试他们的想法。但是,我觉得有必要直接回答你的问题。
实际上没有任何方法可以直接告诉Python释放内存。事实是,如果你想要这么低的控制级别,你将不得不用C或c++写一个扩展。
也就是说,有一些工具可以帮助解决这个问题:
cython 痛饮 提高python
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)
你不能显式地释放内存。您需要做的是确保不保留对对象的引用。然后它们将被垃圾收集,释放内存。
在您的情况下,当您需要大型列表时,通常需要重新组织代码,通常使用生成器/迭代器代替。这样你就不需要在内存中存储大的列表。