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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.30 17:27:03