如何加速4GB+大文本文件的Python拆分脚本?
加速大文件拆分脚本的优化方案
你的脚本耗时过长的核心原因有两个:
- 一次性将4GB的超大文件全部加载到内存,既占用大量内存,又拖慢了初始读取速度;
- 每处理一行就打开、关闭一次目标文件,频繁的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
相关产品推荐
相关产品推荐

