Python批量处理文件合并DataFrame时遇exit code -9问题求助
解决Python合并数千个DataFrame时退出码-9的问题
嘿,这个问题我太熟了——退出码-9几乎肯定是你的程序耗尽了系统内存,被操作系统强制终止了。毕竟你把几千个DataFrame都存在数组里,然后一次性合并,相当于把所有文件的数据都同时加载到内存里,这对系统来说压力太大了,尤其是单个文件本身就不小的时候。
给你几个实用的解决方案,按优先级排序:
1. 边读边合并,不存储所有DataFrame
别把所有DataFrame都存在数组里,读完一个就合并一个,这样内存里始终只保留当前合并后的大DataFrame和临时的单个文件DataFrame,能大幅降低内存占用:
import pandas as pd import gc # 假设你已经有了所有文件的路径列表 file_paths = [...] # 初始化合并后的DataFrame(读第一个文件) combined_df = pd.read_csv(file_paths[0]) # 循环处理剩余文件 for path in file_paths[1:]: # 读取单个文件的临时DataFrame temp_df = pd.read_csv(path) # 合并到总DataFrame combined_df = pd.concat([combined_df, temp_df], ignore_index=True) # 手动删除临时DataFrame并回收内存 del temp_df gc.collect()
2. 分块读取大文件(如果单个文件也很大)
如果你的单个文件本身就占用很多内存,可以用chunksize参数分块读取,再逐块合并:
import pandas as pd import gc combined_df = pd.DataFrame() file_paths = [...] for path in file_paths: # 每次读取10000行(可以根据内存情况调整这个数值) for chunk in pd.read_csv(path, chunksize=10000): combined_df = pd.concat([combined_df, chunk], ignore_index=True) del chunk gc.collect()
3. 用内存友好的库处理超大数据集
如果上面的方法还是不够,试试Dask DataFrame——它专门用来处理超出内存的数据集,会自动分块并行处理,不用你手动管理内存:
import dask.dataframe as dd # 直接读取所有文件(Dask会自动分块) ddf = dd.read_csv(file_paths) # 最后把计算结果转成pandas DataFrame(如果内存能容纳最终结果的话) combined_df = ddf.compute()
额外优化小技巧
- 读取文件时指定数据类型:比如用
dtype参数把重复值多的字符串列设为category,数值列用int32/float32代替默认的int64/float64,能减少内存占用。 - 只读取需要的列:用
usecols参数指定要加载的列,避免加载无用数据。 - 合并后及时清理:每次合并后删除临时变量并调用
gc.collect(),强制回收未使用的内存。
内容的提问来源于stack exchange,提问作者Lynn Bou Nassif
相关产品推荐
相关产品推荐

