使用pandas读取Ubuntu EC2实例大CSV文件时进程被杀死如何解决
问题诱因
该问题核心是物理内存(RAM)不足,和磁盘存储空间无关联:
- pandas默认
read_csv方法会将整个CSV文件的内容全部加载到内存中生成结构化的DataFrame对象,83GB的CSV转成内存存储格式后实际占用空间会远大于磁盘文件本身,通常能达到原文件大小的1.5~3倍,远超对应EC2实例的物理内存上限。 - 进程被杀死是Linux内核的OOM(Out of Memory)杀手机制触发,系统会主动杀掉内存占用最高的进程来保障核心服务运行。
- 后续出现
-bash: fork: Cannot allocate memory报错,是因为OOM发生后系统剩余内存不足以支撑新进程创建(哪怕是ls、cd这类基础命令,启动进程都需要占用少量内存)。 - Python逐行读取可以正常完成,是因为每次仅加载一行数据到内存,总内存占用始终维持在极低水平,不会触碰到内存上限。
处理方案
- 调整pandas读取逻辑:使用
read_csv的chunksize参数分块读取,每次仅加载指定行数的数据到内存处理,示例用法:pd.read_csv('large_file.csv', chunksize=10000),遍历返回的chunk对象分批次处理即可。 - 替换适配大文件的处理工具:如果需要做全量数据聚合、关联等操作,可以使用Dask、Vaex这类支持外存计算的工具,无需将全量数据加载到内存即可完成计算。
- 升级EC2实例规格:如果业务场景必须全量加载数据到内存,直接更换内存容量大于处理后数据大小的EC2实例即可。
- 恢复当前异常状态:如果已经出现fork报错无法操作的情况,通过EC2控制台重启实例,释放所有占用的内存即可恢复正常操作。
内容的提问来源于stack exchange,提问作者krk
相关产品推荐
相关产品推荐

