如何将S3指定文件夹内多个CSV文件高效加载到Python Notebook并合并
效率优化实现方案
原代码的核心问题是在循环中反复执行pd.concat,每次拼接都会生成新的DataFrame并全量拷贝已有的历史数据,整体时间复杂度为O(n²),文件数量越大性能损耗越严重。
基础优化版(最通用)
将所有文件读取的结果先存入列表,最后仅执行一次拼接操作,时间复杂度降为O(n),性能提升非常显著:
import pandas as pd import numpy as np df_buffer = [] path_template = "s3://ap/data/tm/aac0202-2121-%d.csv" for num in np.arange(41, 71): df_buffer.append(pd.read_csv(path_template % num)) # 单次拼接完成合并,ignore_index=True避免行索引重复 full_df = pd.concat(df_buffer, ignore_index=True)
进阶优化版(适合S3远程IO场景)
S3存储属于远程对象存储,读取的主要耗时在IO等待,可通过多线程并行读取进一步提速:
import pandas as pd import numpy as np from concurrent.futures import ThreadPoolExecutor def read_single_csv(num): return pd.read_csv(f"s3://ap/data/tm/aac0202-2121-{num}.csv") # 线程数可根据自身带宽情况调整,通常设置为4~12即可 with ThreadPoolExecutor(max_workers=8) as pool: df_buffer = list(pool.map(read_single_csv, np.arange(41, 71))) full_df = pd.concat(df_buffer, ignore_index=True)
可选优化点
- 读取时通过
dtype参数指定各列数据类型,可降低内存占用、提升读取速度,示例:pd.read_csv(path, dtype={"用户ID": int, "交易金额": float, "备注": str}) - 提前安装
s3fs、fsspec的最新版本,pandas读取S3路径依赖这两个库,新版修复了很多IO性能问题。 - 如果需要合并后直接写入其他存储,可在
pd.concat后直接调用to_csv/to_parquet等方法,不需要额外缓存中间结果。
内容的提问来源于stack exchange,提问作者LearningCode
相关产品推荐
相关产品推荐

