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

Python拆分大CSV写入多文件的性能优化方案咨询

解决方案

核心思路

ExitStack 支持动态添加上下文管理器,不需要提前一次性批量打开所有文件。你可以在遍历源文件的过程中,遇到新的类型时再动态打开对应文件、创建CSV写入器,用字典存储每个类型和写入器的映射关系即可,所有打开的文件句柄会由ExitStack统一管理,退出时自动批量关闭。

完整可运行代码

import csv
from contextlib import ExitStack

counter = 0
# 存储映射关系:key为行首的类型值,value为对应文件的CSV写入器
writers = {}

with ExitStack() as stack:
    # 打开源大文件
    large_file = stack.enter_context(open("PN000047.csv", newline=''))
    csv_reader = csv.reader(large_file)

    for row in csv_reader:
        row_type = row[0]
        # 遇到未记录的新类型时,动态创建文件和写入器
        if row_type not in writers:
            new_file = stack.enter_context(open(f"{row_type}.csv", "a", newline=''))
            writers[row_type] = csv.writer(new_file)
        # 写入当前行
        writers[row_type].writerow(row)
        counter += 1

print(counter)

注意事项

  • 该实现的IO操作次数从原方案的百万级降到和源文件中唯一类型数量一致,性能会有数十到上百倍的提升。
  • 普通操作系统默认限制单进程最大打开文件句柄数为512~1024,如果你的源文件中唯一类型数量超过该值,可以先临时调大系统句柄上限(Linux下执行ulimit -n 4096),或者补充LRU淘汰逻辑,长时间未使用的文件先关闭,后续用到时再重新打开。

内容的提问来源于stack exchange,提问作者Russell Templar

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.25 09:36:03