pandas 处理千万级数据行如何使用分块读取优化内存占用

文章导读
使用 pandas 的 `read_csv` 函数配合 `chunksize` 参数是分块读取千万级数据行的标准方案,适合文件体积超过物理内存的场景,风险在于无法直接使用依赖全量数据的聚合操作。
📋 目录
  1. A 命令速用版
  2. B 为什么会这样
  3. C 分步处理
  4. D 怎么验证是否生效
  5. E 常见坑
  6. F 常见问题
  7. G 参考来源
A A

使用 pandas 的 `read_csv` 函数配合 `chunksize` 参数是分块读取千万级数据行的标准方案,适合文件体积超过物理内存的场景,风险在于无法直接使用依赖全量数据的聚合操作。

先说结论:分块读取通过迭代器机制避免一次性加载全量数据,能防止内存溢出,但需要改写数据处理逻辑以适应流式处理。

  • 先定位:确认数据文件大小是否超过可用物理内存的 50%。
  • 先做:在 `read_csv` 中设置 `chunksize` 参数启用迭代器模式。
  • 再验证:监控进程内存峰值是否稳定在设定块大小范围内。

命令速用版

import pandas as pd

# 设置每次读取 10 万行,根据内存调整
chunk_size = 100000

for chunk in pd.read_csv('large_file.csv', chunksize=chunk_size):
    # 在此处处理每个 chunk,例如过滤或聚合
    processed_chunk = chunk[chunk['value'] > 0]
    # 避免直接 concat 所有结果,建议增量写入数据库或文件
    processed_chunk.to_csv('output.csv', mode='a', index=False, header=False)

为什么会这样

pandas 默认会将 CSV 文件全部加载到 DataFrame 对象中,导致内存占用随文件大小线性增长。设置 `chunksize` 后,`read_csv` 返回的是一个 TextFileReader 迭代器对象,每次循环仅将指定行数的数据加载到内存,处理完即释放,从而将内存占用控制在固定阈值内。

分步处理

步骤 1:评估内存预算
检查服务器可用内存,预留 50% 给操作系统和其他进程。如果文件 10GB,内存 16GB,建议单块大小不超过 100 万行。

步骤 2:指定数据类型
在 `read_csv` 中通过 `dtype` 参数明确列类型,避免 pandas 自动推断类型消耗额外内存。例如将 ID 列设为字符串,数值列设为 `float32` 而非默认 `float64`。

步骤 3:编写迭代逻辑
使用 `for chunk in reader` 循环处理数据。若需聚合计算(如求和),在循环外初始化累加变量,在循环内累加每个 chunk 的结果。

步骤 4:增量输出结果
处理后的数据不要存储在列表中,直接使用 `to_csv` 的 `mode='a'` 参数追加写入磁盘,或分批写入数据库。

怎么验证是否生效

使用系统监控工具(如 Linux 的 `top` 或 Python 的 `tracemalloc` 模块)观察 Python 进程内存占用。生效标志是内存占用随处理进度呈锯齿状波动,而不是持续上升直至溢出。若内存持续上涨,检查是否有变量在循环外意外引用了 chunk 对象。

pandas 处理千万级数据行如何使用分块读取优化内存占用

常见坑

1. 最后再次 concat 所有块
如果在循环结束后将所有 chunk 放入列表并使用 `pd.concat` 合并,会重新触发内存溢出,违背分块初衷。

2. 忽略表头处理
追加写入文件时,除第一块外,后续块写入需设置 `header=False`,否则输出文件会包含重复的列名行。

3. 全局排序需求
分块读取无法直接进行全量排序(如 `sort_values`),若业务强依赖全量排序,需借助外部排序工具或数据库中间件。

常见问题

pandas 分块读取支持 Excel 文件吗?

原生不支持高效的分块读取 Excel。`read_excel` 没有 `chunksize` 参数,建议先将 Excel 转换为 CSV 格式后再处理。

如何确定最佳的 chunksize 数值?

没有固定标准,需根据单行数据大小和可用内存测试。公开资料中没有看到可靠的量化数据,建议从 1 万行开始逐步调大,直到内存占用接近安全阈值。

分块读取会影响处理速度吗?

通常会略微降低速度。因为多次 IO 读取和函数调用开销比一次性读取大,但这是换取内存稳定性的必要代价。

参考来源

  • pandas 官方文档,pandas.read_csv,https://pandas.pydata.org/docs/reference/api/pandas.read_csv.html
  • pandas 官方用户指南,IO tools (text, CSV, HDF5, ...),https://pandas.pydata.org/docs/user_guide/io.html