如何将Python内存释放回操作系统
我有一个运行很久的Python脚本,完成需要1到2个小时。它是在一个4GB内存的容器上运行,只有1个CPU。
这个脚本在一个循环中获取和处理数据,类似下面的代码:
for i in ENOUGH_API_CALLS_TO_TAKE_2_HOURS:
data = fetch_data()
process_data(data)
但是在脚本执行到一半的时候,这个4GB的容器因为内存不够而崩溃了。其实每次调用API获取的数据都远远没有达到4GB。
我使用了tracemalloc
来调试,发现Python在每次API调用后慢慢占用内存,但没有把内存释放回操作系统。最终导致内存超限,程序崩溃。
我看到有一些讨论提到可以用多进程来确保任务完成后内存能被释放。但我这里只有1个CPU,所以没有第二个处理器可以用。
有没有其他方法可以在主线程中把内存释放回操作系统呢?
另外,我尝试过gc.collect()
,但没有成功。
1 个回答
1
多进程并不需要你有多个物理或逻辑的CPU。如果你查看你电脑上的任务管理器,你会发现运行的进程数量通常比你的核心数或线程数要多。
在这种情况下,你的单个处理器一次只能专注于一个任务,但它可以在不同的任务之间快速切换,虽然这样会有一点额外的开销。这可能会让整体运行时间稍微延长,但它确实解决了资源被占用的问题。
你有没有确认你真的内存不够用?比如查看一下你的容器日志,或者实时监控一下你的Python进程的内存使用情况。如果你不确定,花时间确认一下这个问题可能会很有帮助,这样在你考虑更新代码之前,可以避免让代码变得更慢(因为创建子进程会有额外的开销)。