读取25GB大体积CSV文件时内存即将占满该如何规避?
解决方案
问题根因
你当前的代码逻辑是将所有CSV分片全部存入列表后再合并为全量DataFrame,相当于需要将25GB的完整文件全部加载到仅24GB的运行内存中,必然会触发内存溢出(OOM)报错。
实现内存阈值控制方案
前置依赖
使用psutil库获取当前进程的内存占用,安装命令:
pip install psutil
代码实现
以下代码会在每次加载分片前校验当前内存占用,达到20GB阈值时自动停止加载,你也可以在阈值触发分支自定义其他处理逻辑:
import pandas as pd import psutil import os # 内存阈值设置为20GB,转换为字节单位 MEM_THRESHOLD = 20 * 1024 ** 3 # 获取当前Python进程对象 current_process = psutil.Process(os.getpid()) df_list = [] chunksize = 100000 load_stop = False for chunk in pd.read_csv(path, chunksize=chunksize): # 获取当前进程已使用的物理内存大小 used_mem = current_process.memory_info().rss if used_mem >= MEM_THRESHOLD: # 此处可替换为自定义处理逻辑,如将已加载数据存盘、清理冗余缓存后继续加载等 print(f"内存占用已达{used_mem / 1024**3:.2f}GB,触发阈值停止加载") load_stop = True break df_list.append(chunk) # 仅当加载未被中断时合并全量DataFrame if not load_stop: X = pd.concat(df_list)
优化建议
- 若非必须使用全量DataFrame进行计算,建议直接在chunk迭代阶段完成数据清洗、过滤、聚合等操作,无需将所有分片存入内存,从根源避免内存溢出问题
- 可根据单分片的实际内存占用动态调整
chunksize参数,进一步优化内存使用效率 - 如果后续需要使用全量数据,可在迭代时将预处理后的分片写入磁盘的Parquet格式文件,后续按需读取分片即可
内容的提问来源于stack exchange,提问作者Tawan
相关产品推荐
相关产品推荐

