作者:梦天使悠然 | 来源:互联网 | 2023-09-18 13:39
发现这也可以由Alex Martelli在另一个话题中回答。
不幸的是(取决于您的Python版本和版本),某些类型的对象使用“空闲列表”,这是一种整洁的局部优化,但可能会导致内存碎片,特别是通过为特定类型的对象分配更多的“专用”内存来实现。因此无法使用“普通基金”。
确保大量但临时使用内存的唯一确实可靠的方法是在完成后将所有资源都返还给系统,这是让使用发生在子进程中,该进程需要大量内存,然后终止。在这种情况下,操作系统将完成其工作,并乐意回收子进程可能吞没的所有资源。幸运的是,在现代版本的Python中,多处理模块使这种操作(以前是很痛苦的)变得不太糟糕。
在您的用例中,似乎子过程累积一些结果并确保这些结果可用于主过程的最佳方法是使用半临时文件(我指的是半临时文件,而不是那种关闭后会自动消失,只会删除您用完后会明确删除的普通文件)。
幸运的是,我能够将占用大量内存的工作分成多个单独的块,这使解释器在每次迭代后实际上都能释放临时内存。我使用以下包装器将内存密集型功能作为子进程运行:
import multiprocessing
def run_as_process(func, *args):
p = multiprocessing.Process(target=func, args=args)
try:
p.start()
p.join()
finally:
p.terminate()