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
相关产品推荐
相关产品推荐

