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
相关产品推荐
相关产品推荐

