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

Python Pandas设chunksize读csv后concat仍报MemoryError咨询

问题根因

chunksize参数未生效的核心原因是代码逻辑完全抵消了分块读取的设计作用:

  • 传入chunksize=10000时,pd.read_csv返回的是可迭代的TextFileReader对象,本身确实不会一次性加载全量文件
  • 但result = pd.concat(df)会遍历所有分块,将全部3500万行、10GB的数据拼接为一个完整DataFrame存入内存,本质和不带chunksize直接读取整个文件没有区别,必然触发内存溢出
  • 磁盘空间被耗尽是因为内存不足时pandas会自动将临时交换数据写入系统盘,持续写入直到磁盘空间占满后抛出错误
  • 额外问题:原代码中print(output)会尝试将全量筛选结果输出到控制台,也会占用大量内存,进一步加剧溢出问题。
正确实现代码

分块读取的核心逻辑是逐块处理、逐块写入,绝对不能在内存中拼接全量数据,参考实现如下:

import pandas as pd

total_count = 0
first_write = True

# 逐块迭代读取原文件
for chunk in pd.read_csv("Data.csv", chunksize=10000):
    # 对当前分块直接做筛选,仅保留符合条件的行
    filtered_chunk = chunk[chunk['Geography'] == 'Ontario']
    # 累加符合条件的行数
    total_count += len(filtered_chunk)
    
    # 逐块写入结果文件
    if first_write:
        # 首次写入覆盖文件,带上表头
        filtered_chunk.to_csv('data2.csv', mode='w', index=False)
        first_write = False
    else:
        # 后续写入用追加模式,不再重复写表头
        filtered_chunk.to_csv('data2.csv', mode='a', index=False, header=False)

print(f"筛选完成,共提取Ontario相关行 {total_count} 条")
优化建议
  • 上述代码全程内存中仅保留单个分块的数据,内存占用稳定在几十MB级别,不会出现内存或磁盘占满的问题
  • 可以根据机器实际内存调整chunksize大小,内存充足时调大到50000-100000可以减少IO次数,提升处理速度
  • 如果不需要用到全量字段,可以在pd.read_csv中传入usecols参数指定需要加载的列,进一步降低单分块的内存占用
  • 写入时传入index=False是为了避免pandas自动生成的行索引被写入CSV,减少冗余的磁盘占用。

内容的提问来源于stack exchange,提问作者mrAT

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.27 03:27:31