用chunksize参数分块读取大CSV文件可避免OOM,返回TextFileReader对象逐块处理;需权衡chunksize大小,避免concat累积内存,并注意解析异常与替代方案选择。

用 pandas.read_csv 的 chunksize 参数控制内存占用
直接 pd.read_csv('big_file.csv') 加载几十GB文件必然 OOM。核心解法是让 pandas 返回一个可迭代的 TextFileReader 对象,而非一次性 DataFrame。
关键参数:chunksize 指定每块行数(非字节数),iterator=True 已被弃用,只需设 chunksize 即可:
for chunk in pd.read_csv('data.csv', chunksize=10000):
process(chunk) # 每次处理 1 万行
注意:chunksize 过小会导致 I/O 频繁、解析开销上升;过大仍可能爆内存。建议从 5000–50000 起步,根据单块内存占用(chunk.memory_usage(deep=True).sum())动态调整。
避免 concat 累积导致内存翻倍
常见错误:把所有 chunk 存进列表再 pd.concat(chunks) —— 这会让原始数据和拼接结果同时驻留内存,实际占用接近 2 倍。
更稳妥的做法:
- 逐块处理并立即释放(如写入数据库、保存为 Parquet 分片、或流式计算统计量)
- 若必须合并,改用
pd.concat(..., ignore_index=True, copy=False)减少副本 - 对聚合类任务(如求均值、计数),用增量算法:先算每块的
sum和count,最后统一除总和
处理含复杂结构的 CSV(如嵌套 JSON、不规则列)
chunksize 在遇到换行符在字段内(如 CSV 中含 \n 的字符串)、引号未闭合等情况时,可能割裂记录,导致某块解析失败或数据错位。
让 macOS 自动化像说话一样简单 —— 用代码控制你的 Mac,无需学习 AppleScript 系统要求 macOS 14+ (Sonoma) Python 3.9+ 需要开启:辅助功能 + 屏幕录制权限
应对方式:
- 优先确认源文件是否符合 RFC 4180 规范;若含自由换行,改用
lineterminator='\n'+quoting=csv.QUOTE_ALL - 对含 JSON 字段的列,不要在
read_csv阶段解析,先用dtype=str读为字符串,再在 chunk 内用json.loads()安全解析 - 若列数不固定,设置
error_bad_lines=False(pandas on_bad_lines='skip'(>=1.3),避免整块中断
切换到更轻量或流式替代方案:Dask 或 Polars
当 pandas 的 chunk 循环仍显笨重(比如要跨块做窗口计算、或需列式过滤后再分块),可考虑:
-
dask.dataframe.read_csv:延迟执行,自动分块+并行,但调度开销明显,适合 >100GB 且有多核可用场景 -
polars.scan_csv:真正惰性,支持链式过滤下推(.filter().select().collect_streaming()),内存效率更高,但生态兼容性弱于 pandas
别盲目上 Dask —— 单机小集群下,写好 chunk 循环往往比引入新依赖更稳、更易 debug。
真正麻烦的是跨块状态依赖(比如滑动窗口、累计标识),这种时候得自己维护缓冲区,而不是指望某个库自动搞定。
Python免费学习笔记(深入):立即使用
在学习笔记中,你将探索 Python 的核心概念和高级技巧!










