我写了一个Python程序,它作用于一个大的输入文件,以创建数百万个表示三角形的对象。算法为:
读取输入文件 处理该文件并创建一个三角形列表,由它们的顶点表示 以OFF格式输出顶点:顶点列表后面跟着三角形列表。三角形由顶点列表中的索引表示
OFF要求我在打印三角形之前打印出完整的顶点列表,这意味着在我将输出写入文件之前,我必须将三角形列表保存在内存中。与此同时,由于列表的大小,我得到了内存错误。
告诉Python我不再需要某些数据,并且可以释放这些数据的最佳方式是什么?
我写了一个Python程序,它作用于一个大的输入文件,以创建数百万个表示三角形的对象。算法为:
读取输入文件 处理该文件并创建一个三角形列表,由它们的顶点表示 以OFF格式输出顶点:顶点列表后面跟着三角形列表。三角形由顶点列表中的索引表示
OFF要求我在打印三角形之前打印出完整的顶点列表,这意味着在我将输出写入文件之前,我必须将三角形列表保存在内存中。与此同时,由于列表的大小,我得到了内存错误。
告诉Python我不再需要某些数据,并且可以释放这些数据的最佳方式是什么?
当前回答
del语句可能有用,但IIRC不能保证释放内存。医生来了…这里有一个不发布的原因。
我听说有人在Linux和unix类型的系统上使用python进程来做一些工作,得到结果,然后终止它。
本文介绍了Python垃圾收集器,但我认为缺乏内存控制是托管内存的缺点
其他回答
Python是垃圾回收的,所以如果你减少列表的大小,它会回收内存。你也可以使用"del"语句完全摆脱一个变量:
biglist = [blah,blah,blah]
#...
del biglist
del语句可能有用,但IIRC不能保证释放内存。医生来了…这里有一个不发布的原因。
我听说有人在Linux和unix类型的系统上使用python进程来做一些工作,得到结果,然后终止它。
本文介绍了Python垃圾收集器,但我认为缺乏内存控制是托管内存的缺点
你不能显式地释放内存。您需要做的是确保不保留对对象的引用。然后它们将被垃圾收集,释放内存。
在您的情况下,当您需要大型列表时,通常需要重新组织代码,通常使用生成器/迭代器代替。这样你就不需要在内存中存储大的列表。
根据Python官方文档,你可以显式调用gc.collect()来释放未引用的内存。例子:
import gc
gc.collect()
你应该在使用del标记你想丢弃的东西后这样做:
del my_array
del my_object
gc.collect()
不幸的是(取决于你的Python版本和发行版),某些类型的对象使用“自由列表”,这是一种简洁的局部优化,但可能会导致内存碎片,特别是通过将越来越多的内存“指定”给特定类型的对象,从而无法用于“普通基金”。
The only really reliable way to ensure that a large but temporary use of memory DOES return all resources to the system when it's done, is to have that use happen in a subprocess, which does the memory-hungry work then terminates. Under such conditions, the operating system WILL do its job, and gladly recycle all the resources the subprocess may have gobbled up. Fortunately, the multiprocessing module makes this kind of operation (which used to be rather a pain) not too bad in modern versions of Python.
在您的用例中,似乎子进程积累一些结果并确保这些结果对主进程可用的最佳方法是使用半临时文件(我所说的半临时是指,不是那种关闭时自动消失的文件,而是在您全部使用完后显式删除的普通文件)。