如何正确使用Polars读取Feather文件?内存占用过高问题排查
问题解答
你用pl.read_ipc()读取Feather文件的方式是正确的——Feather本质是Apache IPC格式的一种实现,Polars的read_ipc()完全支持读取Feather文件。
关于Polars内存占用远超Pandas的情况,主要有这几个原因:
- 默认数据类型差异:Polars默认使用更精确的nullable数据类型(比如
pl.Int64而非pl.Int32),这类类型会额外存储空值标记;而Pandas可能自动推断更紧凑的非nullable类型,内存开销更低。 - 内存统计局限性:你用psutil统计的RSS是整个进程的常驻内存,包含了Python解释器、依赖库以及Polars读取时的临时缓存数据,Polars读取流程的内存峰值可能高于Pandas。
- 存储结构差异:Polars基于Apache Arrow列存储,会包含额外的元数据(如列统计信息、偏移量);对于大量小列的数据集,这些元数据的累积开销会比Pandas基于NumPy数组的存储更明显。
优化内存占用的方法
- 显式指定紧凑数据类型:读取时通过
dtypes参数手动指定更小的非nullable类型,减少不必要的内存开销:
df = pl.read_ipc('data.feather', dtypes={ "numeric_col": pl.Int32, "float_col": pl.Float32 })
- 使用Lazy模式按需加载:如果不需要全量数据,用
scan_ipc()创建LazyFrame,仅选择需要的列再收集到内存:
df = pl.scan_ipc('data.feather').select(["col1", "col3", "col5"]).collect()
- 移除空值类型开销:如果数据中无空值,可将nullable类型转换为非nullable类型:
df = pl.read_ipc('data.feather').with_columns( pl.col("numeric_col").cast(pl.Int32).alias("numeric_col") )
内容的提问来源于stack exchange,提问作者Naxi
相关产品推荐
相关产品推荐

