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

如何加速4GB+大文本文件的Python拆分脚本?

加速大文件拆分脚本的优化方案

你的脚本耗时过长的核心原因有两个:

  1. 一次性将4GB的超大文件全部加载到内存,既占用大量内存,又拖慢了初始读取速度;
  2. 每处理一行就打开、关闭一次目标文件,频繁的IO操作带来了巨大的性能开销。

核心优化措施

1. 逐行读取文件,避免内存过载

原代码使用readlines()将整个文件加载到列表中,对于4GB级别的文件完全没必要。直接迭代文件对象即可逐行读取,内存占用仅为单条数据行的大小,大幅降低内存压力。

2. 复用文件句柄,消除重复IO开销

用字典缓存已打开的文件对象,以行首前缀作为键。同一个前缀的行直接写入对应的已打开文件,最后统一关闭所有文件,彻底避免重复打开/关闭文件的耗时操作。

优化后的完整代码

import os

# 确保输出目录存在,避免因目录缺失报错
os.makedirs("import", exist_ok=True)

# 缓存已打开的文件句柄,键为行首前缀
file_handles = {}

try:
    # 逐行读取输入文件
    with open("updates//merged_lst.csv", encoding="utf8", errors='ignore') as input_file:
        for row in input_file:
            # 跳过空行或格式不符合的行(可根据实际需求调整)
            if not row.strip() or ',' not in row:
                continue
            
            # 获取行首前缀并转为大写
            prefix = row.split(',')[0].upper()
            target_filename = f"import//{prefix}.csv"
            
            # 若该前缀的文件未打开,则创建并缓存句柄,同时设置大缓冲区
            if prefix not in file_handles:
                # 设置1MB缓冲区,可根据磁盘性能调整为4MB/8MB
                fh = open(target_filename, 'a', encoding="utf8", errors='ignore', buffering=1024*1024)
                file_handles[prefix] = fh
            
            # 写入当前行
            file_handles[prefix].write(row)
finally:
    # 确保所有打开的文件都被正确关闭,避免数据丢失
    for fh in file_handles.values():
        fh.close()

额外优化细节

  • 缓冲区调优:代码中设置了buffering=1024*1024(1MB缓冲区),可以根据你的磁盘读写性能调整更大的值(如4*1024*1024),减少实际写入磁盘的次数;
  • 清理无用依赖:原代码导入了pandas和csv但未使用,优化后直接删除,减少不必要的模块加载;
  • 异常防护:加入了空行和无逗号行的判断,避免因格式异常导致脚本崩溃;
  • 目录预创建:用os.makedirs提前确保输出目录存在,避免运行时因目录缺失报错。

内容的提问来源于stack exchange,提问作者Tamas Kosa

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.03 11:25:34