10万份共150GB CSV文件高效合并方法与现有方案优化求教
超大量CSV合并优化方案
你当前代码性能差的核心原因是循环对全量DataFrame做concat操作,每次concat都会触发全量数据的内存复制,时间复杂度是O(n²),数据量越大速度越慢,且150GB全量数据全部加载进内存本身就不现实,极易触发虚拟内存交换导致速度雪崩。
核心优化思路
放弃内存中保留全量数据的逻辑,改为逐文件处理后直接追加写入输出文件,内存中始终只保留单文件数据,处理速度不会随文件数量增加下降。
优化后实现代码(pandas原生,无额外依赖)
import pandas as pd import os from tqdm import tqdm # 第一步:轻量遍历获取所有列名,生成标准列顺序 all_cols = set() type1_list = [] for fname in tqdm(excelNames, desc="扫描列名"): fname = str(fname).lower().strip() if not fname.endswith('type1.csv'): continue type1_list.append(fname) # 仅读取表头,不加载数据,速度极快 head_df = pd.read_csv(os.path.join(pathxl, fname), nrows=0) all_cols.update(head_df.columns.tolist()) # 补全自定义的文件名列,得到最终标准列 standard_cols = list(all_cols) + ["File Name"] # 第二步:逐文件处理后追加写入输出文件 out_file = os.path.join(outpath, "df_t1.csv") # 先写入表头 pd.DataFrame(columns=standard_cols).to_csv(out_file, index=False, encoding="utf-8") # 遍历处理所有type1文件 for fname in tqdm(type1_list, desc="处理并合并文件"): df = pd.read_csv( os.path.join(pathxl, fname), error_bad_lines=False, warn_bad_lines=False, low_memory=False ) # 新增文件名列,用pandas广播特性直接赋值,无需循环生成列表 df["File Name"] = fname # 补全缺失列,调整为标准列顺序 for col in standard_cols: if col not in df.columns: df[col] = pd.NA df = df[standard_cols] # 追加写入输出文件,不重复写表头 df.to_csv(out_file, mode="a", header=False, index=False, encoding="utf-8") print("df_t1.csv generated")
额外性能提升建议
- 如果服务器CPU核心数充足,可以用多进程并行读取处理文件,按批次批量写入,写入时加锁避免内容乱序,速度可提升数倍
- 如果后续还需要对合并后的150GB数据做分析计算,可直接用Dask DataFrame处理,API和pandas几乎一致,自动做分块内存管理,无需手动实现追加写入逻辑
内容的提问来源于stack exchange,提问作者Prashant Kumar
相关产品推荐
相关产品推荐

