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

如何限制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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.31 23:22:14