用Python合并目录所有文件时运行超时且内存占用过高求排查
问题分析与优化方案
你的代码确实存在几个可能导致运行缓慢、内存占用过高的问题,咱们一步步拆解:
1. 未过滤子目录
glob.glob(new_directory_0035+"/*")会匹配目标目录下的所有条目,包括子目录。当fileinput尝试读取子目录时,不仅无法获取有效内容,还可能陷入无意义的循环或异常处理流程,这很可能是程序长时间运行的核心原因之一。
2. fileinput的额外开销
fileinput模块虽然能方便地处理多文件连续读取,但它为了支持行号跟踪、文件切换标记等功能,引入了额外的处理逻辑。在处理大量超大文件时,这些额外开销会被放大,直接导致内存占用飙升和运行效率下降。
优化后的代码
下面是更高效、更安全的实现方式,直接逐个处理文件,采用分块读写的模式(比逐行读取的IO效率更高,内存占用也更稳定):
import glob import os target_dir = new_directory_0035 output_path = os.path.join(target_dir, "merged.txt") # 以二进制模式打开输出文件,分块处理更高效 with open(output_path, 'wb') as outfile: # 遍历目录下的所有条目,过滤掉非文件内容 for file_path in glob.glob(os.path.join(target_dir, "*")): if not os.path.isfile(file_path): continue # 跳过子目录、符号链接等非文件对象 # 逐个打开源文件,分块读取写入 with open(file_path, 'rb') as infile: # 每次读取4KB块,可根据文件大小调整为64KB/128KB提升效率 while chunk := infile.read(4096): outfile.write(chunk)
为什么这个版本更好?
- 精准过滤内容:明确跳过子目录和非文件条目,避免无效操作。
- 分块读写更高效:以固定大小的块读取写入,比逐行读取更适配大文件场景,IO效率更高,内存仅占用单个块的大小,始终保持低负载。
- 无冗余模块开销:直接使用基础文件操作,避免
fileinput带来的不必要逻辑损耗。
另外,你的原代码中fileinput.close()是多余的——fileinput.input()在迭代结束后会自动关闭所有打开的文件,无需手动调用。
内容的提问来源于stack exchange,提问作者Grendel
相关产品推荐
相关产品推荐

