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

用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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.28 06:58:51