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

如何使用Polars分批将20GB+的大型Parquet文件写入SQLite数据库?

如何使用Polars分批将20GB+的大型Parquet文件写入SQLite数据库?

兄弟,这个问题我太熟了!直接用collect()把几十GB的Parquet全拉进内存,不爆内存才怪呢。其实Polars的惰性API就是为这种场景设计的,咱们完全可以分批处理,不用一次性加载所有数据。给你看个实用的方案:

import polars as pl
from sqlalchemy import create_engine

# 创建SQLite连接,用SQLAlchemy引擎能更稳定地管理连接
engine = create_engine("sqlite:///my_data.db")

# 保持Parquet文件的惰性读取,不立刻加载全量数据
lazy_df = pl.scan_parquet(get_dataset_path())

# 设定每一批的行数,你可以根据自己的内存情况调整,比如100万行一批
batch_size = 1_000_000

# 分批迭代处理数据
for batch_idx, batch_df in enumerate(lazy_df.iterate_batches(batch_size=batch_size)):
    print(f"正在写入第 {batch_idx + 1} 批数据...")
    # 第一次写入用replace创建表,后续批次用append追加
    exist_strategy = "replace" if batch_idx == 0 else "append"
    batch_df.write_database(
        table_name="my_table",
        connection=engine,
        if_table_exists=exist_strategy
    )

为什么这么做能解决内存问题?

  • scan_parquet返回的是惰性DataFrame,只会记录读取逻辑,不会立刻把所有数据加载到内存里。
  • iterate_batches会按照你设定的batch_size,分批从Parquet文件中读取数据,每一批都是一个小的内存DataFrame,处理完就会被释放,不会占用过多内存。
  • 第一次写入用replace来初始化表结构,之后的批次用append追加,避免重复创建表或者覆盖已有数据。

另外提个小细节:如果你的Parquet文件本身是按块存储的,Polars会自动适配文件的分块逻辑,分批读取的效率会更高,不用额外担心性能问题。

备注:内容来源于stack exchange,提问作者Kamil Kleina

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.13 15:58:11