1GB超大CSV文件按日期时间字段拆分存储的高效实现方案咨询
性能优化核心逻辑
你当前方案耗时过长的根本原因是每次遍历分组都对全量数据集做一次过滤查询,数据集越大、分组越多,耗时线性增长,所有最优方案都遵循「全量数据仅遍历一次完成拆分」的原则,以下是两种可直接落地的实现:
方案1:内存充足场景(1G文件无压力)pandas优化版
仅对全表做一次分组遍历,没有重复扫描,性能比你当前方案高10~100倍:
import os import pandas as pd # 按需指定字段类型,大幅提升读取速度、降低内存占用 dtype_map = { "日期": str, "时间": str, # 剩余字段按实际类型补充,比如价格字段设为float } df = pd.read_csv("你的源CSV路径.csv", dtype=dtype_map, engine="c") # 按日期+时间两列分组,sort=False关闭排序进一步提升性能 for (date_val, time_val), group_df in df.groupby(["日期", "时间"], sort=False): # 生成目标路径,自动创建多级目录 save_dir = os.path.join("C:/", date_val, time_val) os.makedirs(save_dir, exist_ok=True) save_path = os.path.join(save_dir, "自定义文件名.csv") # 写入文件,关闭索引输出 group_df.to_csv(save_path, index=False, encoding="utf-8-sig", engine="c")
方案2:内存不足场景流式逐行处理方案
不需要加载全量数据到内存,适合超大文件拆分:
import os import csv from collections import defaultdict # 缓存已打开的文件句柄和写入器,避免频繁开关文件损耗性能 file_handles = {} csv_writers = {} try: with open("你的源CSV路径.csv", "r", encoding="utf-8", newline="") as src_f: reader = csv.DictReader(src_f) headers = reader.fieldnames for row in reader: date_val = row["日期"] time_val = row["时间"] # 生成存储路径 save_dir = os.path.join("C:/", date_val, time_val) os.makedirs(save_dir, exist_ok=True) save_path = os.path.join(save_dir, "自定义文件名.csv") # 初始化当前分组的写入器 if save_path not in csv_writers: dst_f = open(save_path, "w", encoding="utf-8-sig", newline="") file_handles[save_path] = dst_f writer = csv.DictWriter(dst_f, fieldnames=headers) writer.writeheader() # 不需要表头可删除此行 csv_writers[save_path] = writer # 写入当前行 csv_writers[save_path].writerow(row) finally: # 批量关闭所有打开的文件句柄 for fh in file_handles.values(): fh.close()
额外优化提示
- 日期、时间字段优先用原始字符串处理,不需要转换为datetime类型,可进一步降低性能损耗
- 存储路径优先选择SSD盘,避免机械盘的IO瓶颈
- 如果拆分后的文件不需要表头,删除对应代码段的
writer.writeheader()即可
内容的提问来源于stack exchange,提问作者Vasiliy
相关产品推荐
相关产品推荐

