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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.20 08:59:39