You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Python调用函数后内存未完全释放如何彻底回收?

问题描述

我编写了Python脚本,其中调用函数foo执行占用约10GB内存的复杂操作,最终返回小型对象res至主程序。打印res后我删除了该对象,但通过top命令查看发现ipython进程仍占用约1GB内存。我尝试使用gc.collect()但无任何效果,了解到有时内存会出现碎片化导致Python无法回收全部内存,请问如何确保进程释放所有未使用的内存?

附带代码:

def foo():
    .... # 一些复杂操作
    return res

if __name__ == "__main__":
    res = foo()
    print(res) 
    del res

可行解决方案

  • 子进程隔离内存密集操作
    Python主进程不会主动将已分配的空闲内存归还操作系统,内存碎片化后这个问题会更明显。但子进程结束时,操作系统会强制回收其所有内存,彻底规避碎片化问题。可通过multiprocessing模块实现:

    from multiprocessing import Pool
    
    def foo():
        .... # 一些复杂操作
        return res
    
    if __name__ == "__main__":
        with Pool(1) as pool:
            res = pool.apply(foo)
        print(res)
        # 子进程已终止,对应内存被系统完全回收
    
  • 调用系统级内存回收接口(分平台)
    针对CPython,可通过ctypes直接调用系统内存管理函数,强制将空闲内存归还操作系统:
    Linux平台:

    import gc
    import ctypes
    
    del res
    gc.collect()
    # 调用libc的malloc_trim释放空闲内存
    libc = ctypes.CDLL("libc.so.6")
    libc.malloc_trim(0)
    

    Windows平台:

    import gc
    import ctypes
    
    del res
    gc.collect()
    # 强制调整进程工作集,释放空闲内存
    kernel32 = ctypes.WinDLL("kernel32.dll")
    kernel32.SetProcessWorkingSetSize(-1, -1, -1)
    

    注意:该方法依赖操作系统,无法保证回收所有内存,但能有效缓解内存碎片化带来的残留问题。

  • 优化foo函数内部内存使用
    在foo函数中,及时清理不再需要的大临时对象,避免其长期占用内存加剧碎片化。处理完大对象后立即删除并触发垃圾回收:

    import gc
    
    def foo():
        big_data = ... # 占用大量内存的对象
        res = process_big_data(big_data)  # 处理得到结果
        # 及时清理大对象
        del big_data
        gc.collect()
        return res
    
  • 改用普通Python环境运行
    IPython会自动保留命令历史、变量缓存等数据,即使手动删除变量,这些缓存仍可能占用内存。换成普通Python脚本直接运行,内存回收表现会更符合预期。

内容的提问来源于stack exchange,提问作者motam79

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.26 06:43:11