本文介绍在 polars 中高效处理逐行生成数据的三种主流方案,重点推荐基于 lazyframe 的 `sink_csv` 流式写入方法,并对比列表累积、vstack 拼接等传统方式的性能差异与适用边界。
在实时数据采集、日志解析或流式 ETL 场景中,常需从逐行生成器(如传感器读数、API 分页响应、自定义迭代器)持续提取结构化特征并写入磁盘。若直接使用 pl.DataFrame() 逐行构造再 vstack 合并,将引发严重性能退化——因 Polars 的 DataFrame 是不可变的列式结构,每次 vstack 都需复制全部已有数据,时间复杂度为 O(n²),完全不可扩展。
✅ 推荐方案:LazyFrame + sink_csv(流式写入)
Polars 原生支持零拷贝流式数据管道,核心是 pl.LazyFrame 结合 sink_csv() 方法:
import polars as pl
def generation_mechanism():
for x in range(1_000_000):
yield (x, x + 1)
# 直接从生成器构建 LazyFrame(不触发计算)
lf = pl.LazyFrame(generation_mechanism(), schema=["feature_a", "feature_b"])
# 流式写入 CSV,每 100 行刷新一次缓冲区(无需手动管理内存)
lf.sink_csv("output.csv", batch_size=100)
✅ 优势: