chunksize需根据单行内存占用与空闲ram动态设定:先用前1000行估算均值(如80kb/行),1gb内存建议起始设5000,再逐步增至10000~20000并监控rss;避免none、勿循环concat、dtype/parse_dates须预设、skiprows/nrows在分块时失效。

chunksize 参数到底传多大才不爆内存
直接说结论:chunksize 不是越大越好,也不是越小越稳,得看单行数据平均内存占用和你机器的空闲 RAM。常见误区是设成 10 万或 100 万——实际可能一读就 OOM,尤其字段多、含长文本或对象类型时。
实操建议:
- 先用小样本估算:读前 1000 行,用
df.memory_usage(deep=True).sum()看总字节数,再除以 1000 得均值,比如 80 KB/行,那 1GB 内存最多扛约 12500 行(1024×1024×1024 ÷ 80÷1024) - 保守起见,初始设为
chunksize=5000,跑通后再逐步加到 10000 或 20000,观察top或任务管理器里的 Python 进程 RSS 增长 - 避免设成
chunksize=None或不设——这等于全量加载,和不用chunksize没区别
用 chunksize 读取后怎么安全地拼接或聚合
很多人以为 pd.concat([chunk for chunk in pd.read_csv(..., chunksize=...)]) 就完事了,但这样会把所有 chunk 全部 hold 在内存里,失去分块意义。
实操建议:
- 需要全量处理(如清洗后存新 CSV):用生成器逐块处理 +
to_csv(..., mode='a', header=False)追加写入,不保留中间 DataFrame - 需要聚合统计(如 sum/groupby):在每块内算局部结果(如
chunk.groupby('cat')['val'].sum()),再用pd.concat合并局部结果,最后再.groupby(...).sum()收口 - 千万别在循环里反复
df = pd.concat([df, chunk])——这是典型的内存泄漏写法,df引用链越来越长
dtype 和 parse_dates 必须在 chunk 读取时就指定
如果依赖 pandas 自动推断类型,每块都会独立 infer 一次,不仅慢,还可能导致同字段在不同 chunk 中类型不一致(比如某块全是空值被推成 float64,另一块有字符串变 object),后续 concat 报 ValueError: cannot concatenate object of type 'float64'。
实操建议:
- 提前用小样本跑一次
pd.read_csv(filename, nrows=10000).dtypes,把结果转成字典传给dtype参数,例如dtype={'user_id': 'uint32', 'tag': 'category'} -
parse_dates同理,必须显式传列名列表,如parse_dates=['event_time'];别指望 chunk 自己识别时间列 - 对含大量缺失的数值列,优先用
Int64(nullable int)或string类型替代默认float64,能省一半内存
read_csv + chunksize 遇到 skiprows 或 nrows 会失效
skiprows 和 nrows 在启用 chunksize 时行为反直觉:它们只作用于**第一个 chunk**,后续 chunk 仍按原始文件位置读,导致跳行错乱或提前结束。
实操建议:
- 要跳过表头以下 N 行?改用
skiprows=lambda x: x in range(1, N+1)(注意索引从 0 开始),这个函数会在每块内重新执行 - 要只读前 M 行?别用
nrows,改用itertools.islice(pd.read_csv(..., chunksize=...), M // chunksize + 1),再手动控制累计行数 - 最稳的方式:先用
head -n K file.csv > sample.csv(Linux/macOS)或 PowerShell 的Get-Content file.csv | Select-Object -First K | Set-Content sample.csv预处理,再对 sample 文件用 chunksize
真正卡住人的往往不是 chunksize 数值本身,而是类型推断、行号逻辑、以及 concat 时机这三个点——它们不报错,但会让内存悄悄涨上去,直到某个 chunk 加载失败才暴露。调的时候记得随时 import gc; gc.collect() 主动回收,别全靠 Python 自动。










