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

Jupyter中Polars内存持续上涨问题排查与内存释放方法咨询

Polars重复执行代码内存持续上涨的原因与解决方法

内存上涨的核心原因

  • Polars延迟执行的缓存残留:Polars默认采用延迟执行模式,每次链式调用会生成新的查询计划,旧的中间计算结果(比如join、filter后的临时数据)可能因为Python与Rust跨语言的引用问题,无法被Python垃圾回收(GC)及时识别回收,导致内存堆积。
  • GC回收节奏滞后:Windows系统下Python的GC对大型对象的回收效率偏低,即便复用了MASTER变量,旧DataFrame实例的内存要等GC触发才会释放,而代码重复执行的速度可能快于GC回收节奏,内存就会持续上涨。
  • 排序操作的临时内存未释放:sort("num")需要额外内存存储排序过程中的临时数据,这部分内存有时不会立刻归还给系统,重复执行时就会累积占用。

有效的内存释放方法

  • 手动触发垃圾回收:每次执行代码后显式调用GC,强制回收未被引用的对象:
    import gc
    
    MASTER = DF.join(G, how="left", on="uid").filter([
        (pl.col("num") > 1) & (pl.col("num")<100)
    ]).sort("num").with_columns([(pl.col("lvl_1") + pl.lit("_") + pl.col("lvl_2")).alias("cat")])
    gc.collect()
    
  • 清除Polars内部缓存:调用Polars自带方法清除查询计划和临时缓存:
    import polars as pl
    
    # 执行代码段后调用
    pl.clear_cache()
    
  • 拆分链式调用并清理中间变量:把长链式调用拆成多个步骤,手动删除中间变量,减少内存占用:
    import polars as pl
    import gc
    
    # 拆分执行步骤
    joined_df = DF.join(G, how="left", on="uid")
    filtered_df = joined_df.filter((pl.col("num") > 1) & (pl.col("num")<100))
    sorted_df = filtered_df.sort("num")
    MASTER = sorted_df.with_columns((pl.col("lvl_1") + pl.lit("_") + pl.col("lvl_2")).alias("cat"))
    
    # 手动清理中间对象
    del joined_df, filtered_df, sorted_df
    gc.collect()
    pl.clear_cache()
    
  • 限制Polars内存池大小:通过设置内存池上限,避免无限制占用系统内存:
    import polars as pl
    
    # 设置内存池上限为8GB(可根据实际硬件调整)
    pl.set_memory_pool_limit(8 * 1024**3)
    
  • 排查隐藏引用:检查代码中是否有其他变量(比如全局变量、列表容器)持有旧DataFrame的引用,这些引用会阻止GC回收内存,需要及时清理。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.27 09:43:13