如何限制Polars读写大DataFrame时的CPU与内存占用?
解决Polars转换大CSV到Parquet时的高CPU/内存占用问题
1. 限制Polars使用的CPU线程数
Polars默认会占用全部CPU核心,直接拉满负载。你可以根据机器核心数指定线程数量,比如8核机器设置4-6个线程,就能把CPU占用控制在50-80%区间:
import polars as pl # 全局设置线程数,根据你的硬件调整 pl.Config.set_num_threads(4)
也可以在读取/写入操作时单独指定n_threads参数:
pl.scan_csv("large_file.csv", n_threads=4)
2. 改用流式扫描+自动批量写入(替代手动next_batches)
手动调用next_batches(500)可能因批次过大导致内存暴涨,推荐用Polars的scan_csv(懒加载)配合sink_parquet的流式方案,它会自动分拆合适的批次,内存占用更平稳:
# 提前定义Schema,避免Polars自动推断大类型,进一步降低内存消耗 custom_schema = { "id": pl.Int32, "user_name": pl.Utf8, "transaction_amount": pl.Float64 } ( pl.scan_csv("large_file.csv", schema=custom_schema, low_memory=True) .sink_parquet("output.parquet", compression="snappy") )
如果一定要手动控制批次,把next_batches的参数改小(比如100以内),减少单次加载的数据量:
reader = pl.read_csv("large_file.csv", schema=custom_schema, low_memory=True, streaming=True) with pl.ParquetWriter("output.parquet", reader.schema) as writer: for batch in reader.next_batches(100): writer.write_batch(batch)
3. 优化内存占用的细节
- 指定精确Schema:避免Polars将数值列推断为大类型(比如默认用
Int64而非Int32),字符串列明确设为pl.Utf8,能大幅降低内存占用。 - 启用
low_memory=True:让Polars分块推断数据类型,配合流式读取效果更好,避免一次性加载过多数据到内存。 - 选择轻量压缩算法:用
compression="snappy"比默认的zstd更快,写入时的CPU负载更低,同时磁盘占用也更小。
4. 系统级辅助控制
- Windows系统可打开任务管理器,找到Python进程,右键选择「设置相关性」,取消勾选部分CPU核心,强制限制进程的CPU使用范围。
- 尽量在命令行直接运行脚本,而非在VSCode中执行,减少IDE本身的资源占用,避免因内存不足导致崩溃。
内容的提问来源于stack exchange,提问作者Adeib Bashar
相关产品推荐
相关产品推荐

