马儿慢些走

人生惶惶,悲喜一场。

【数据处理】Polars rechunk 减少内存碎片

其他数据的数据量小且文件少,但是DCLM(563B)的数据文件数量多,占用空间的总量大。出现两个问题:内存碎片,内存不足。

内存碎片是因为文件数量太多:接近一万份文件,虽然每份文件只有五千条数据,文件可能只有十几兆,但是为了统计数量,出现了太多内存碎片。

import polars as pl

df = pl.scan_parquet(r'xxxx/xxxx/*.parquet', low_memory=True, extra_columns='ignore')
count = df.select(pl.len()).collect().item()

上述这样简单的计算目录里一批文件样本数量的代码会造成机器卡死。

解决方法是读取的时候加上rechunk参数设置:

df = pl.scan_parquet(r'xxx/xxx/*.parquet', low_memory=True, rechunk=True, extra_columns='ignore')

使用eager模式做数据处理期间也可以通过rechunk操作来减少内存碎片:polars.DataFrame.rechunk — Polars documentation


Kimi的回答:

rechunk 参数的作用是:

当你使用通配符(glob)一次性读取多个 Parquet 文件时,最终的 LazyFrame 可能会由许多分散的小内存块组成。设置 rechunk=True 可以在读取完成后,把这些分散的小块重新整合成连续的大块内存(contiguous memory chunks),从而提升后续操作的性能。

简单来说,rechunk=True 就是“合并碎片内存”,让数据在内存中更紧凑,通常会带来更快的后续计算速度,但代价是会增加一点读取时的额外开销。


posted on 2025-08-06 08:00  马儿慢些走  阅读(71)  评论(0)    收藏  举报

导航