如何使用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
相关产品推荐
相关产品推荐

