我写了一个Python程序,它作用于一个大的输入文件,以创建数百万个表示三角形的对象。算法为:
读取输入文件 处理该文件并创建一个三角形列表,由它们的顶点表示 以OFF格式输出顶点:顶点列表后面跟着三角形列表。三角形由顶点列表中的索引表示
OFF要求我在打印三角形之前打印出完整的顶点列表,这意味着在我将输出写入文件之前,我必须将三角形列表保存在内存中。与此同时,由于列表的大小,我得到了内存错误。
告诉Python我不再需要某些数据,并且可以释放这些数据的最佳方式是什么?
我写了一个Python程序,它作用于一个大的输入文件,以创建数百万个表示三角形的对象。算法为:
读取输入文件 处理该文件并创建一个三角形列表,由它们的顶点表示 以OFF格式输出顶点:顶点列表后面跟着三角形列表。三角形由顶点列表中的索引表示
OFF要求我在打印三角形之前打印出完整的顶点列表,这意味着在我将输出写入文件之前,我必须将三角形列表保存在内存中。与此同时,由于列表的大小,我得到了内存错误。
告诉Python我不再需要某些数据,并且可以释放这些数据的最佳方式是什么?
当前回答
如果您不关心顶点重用,您可以有两个输出文件——一个用于顶点,一个用于三角形。完成后,将三角形文件附加到顶点文件。
其他回答
根据Python官方文档,你可以显式调用gc.collect()来释放未引用的内存。例子:
import gc
gc.collect()
你应该在使用del标记你想丢弃的东西后这样做:
del my_array
del my_object
gc.collect()
你不能显式地释放内存。您需要做的是确保不保留对对象的引用。然后它们将被垃圾收集,释放内存。
在您的情况下,当您需要大型列表时,通常需要重新组织代码,通常使用生成器/迭代器代替。这样你就不需要在内存中存储大的列表。
其他人已经发布了一些方法,您可以“哄骗”Python解释器释放内存(或以其他方式避免内存问题)。你应该先尝试他们的想法。但是,我觉得有必要直接回答你的问题。
实际上没有任何方法可以直接告诉Python释放内存。事实是,如果你想要这么低的控制级别,你将不得不用C或c++写一个扩展。
也就是说,有一些工具可以帮助解决这个问题:
cython 痛饮 提高python
del语句可能有用,但IIRC不能保证释放内存。医生来了…这里有一个不发布的原因。
我听说有人在Linux和unix类型的系统上使用python进程来做一些工作,得到结果,然后终止它。
本文介绍了Python垃圾收集器,但我认为缺乏内存控制是托管内存的缺点
Python是垃圾回收的,所以如果你减少列表的大小,它会回收内存。你也可以使用"del"语句完全摆脱一个变量:
biglist = [blah,blah,blah]
#...
del biglist