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

如何用Polars分块读取大SQL表并写入Parquet以降低内存占用?

解决Polars读取大型数据库表内存不足的方案

分块读取并写入Parquet

Polars的read_sql支持通过batch_size参数分批次读取数据,避免一次性加载全量数据到内存。你可以逐批次将数据追加写入Parquet文件:

import polars as pl

# 根据内存容量调整分块大小,示例为10万行
batch_size = 100_000

# 分块读取数据库表,返回DataFrame迭代器
batches = pl.read_sql("SELECT * from TABLENAME", connection_string, batch_size=batch_size)

# 逐块写入Parquet,第一块不追加,后续块追加写入
first_batch = True
for batch in batches:
    batch.write_parquet("output.parquet", append=not first_batch)
    first_batch = False

使用Lazy DataFrame接口降低内存占用

通过pl.scan_sql创建Lazy DataFrame(懒加载数据结构),不会立即将数据加载到内存。配合sink_parquet方法,Polars会自动流式处理数据并分块写入Parquet,全程内存占用极低:

import polars as pl

# 创建Lazy DataFrame,仅定义查询逻辑,不加载数据
lf = pl.scan_sql("SELECT * from TABLENAME", connection_string)

# 流式写入Parquet,Polars自动处理分块与内存管理
lf.sink_parquet("output.parquet")

额外注意事项

  • batch_size的取值需根据你的可用内存调整:过大仍会导致内存溢出,过小则会增加IO次数拖慢速度。
  • 若需要按字段分区存储Parquet,可在sink_parquet中添加partition_by=["column_name"]参数。
  • 确保你的数据库连接支持流式读取(主流数据库如PostgreSQL、MySQL、SQL Server均支持)。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.03 10:25:17