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

删除文件及文件夹脚本内存占用过高优化方案咨询

优化大目录删除脚本以降低内存占用

优化后的代码

import os
import time
import shutil

path = "/data/decision/"
expire_time = time.time() - 30 * 86400

# 使用os.scandir迭代处理,避免一次性加载所有文件列表
with os.scandir(path) as entries:
    for entry in entries:
        # 直接使用entry的stat信息,无需额外调用os.stat
        if entry.stat().st_mtime < expire_time:
            try:
                # 区分文件和文件夹,分别处理(shutil.rmtree也能删文件,但单独处理更高效)
                if entry.is_dir():
                    shutil.rmtree(entry.path)
                else:
                    os.remove(entry.path)
            except PermissionError:
                print(f"无权限删除: {entry.path}")
            except OSError as e:
                print(f"删除失败 {entry.path}: {e}")

关键优化点

  • 用os.scandir替代os.listdir:os.listdir会一次性把目录下所有文件名加载到内存,当目录有百万级文件时会占用大量RAM;而os.scandir返回迭代器,逐个生成目录条目,内存占用极低。同时os.scandir的条目自带缓存的stat信息,避免了重复调用os.stat的系统开销。
  • 移除中间临时文件:原脚本先把要删除的路径写入文件再读取,既增加了磁盘IO,也会在读取时把所有路径加载到内存。现在直接找到符合条件的条目就立即删除,完全不需要存储待删除列表。
  • 增加异常处理:针对并行写入的场景,删除时可能遇到文件正在被占用、权限不足等情况,添加异常捕获可以避免脚本崩溃,同时跳过无法处理的文件(后续可根据需求补充重试逻辑)。
  • 按需处理条目:每个条目处理完成后立即释放内存,不会在内存中累积大量待处理路径。

额外建议

  • 如果目录层级极深,shutil.rmtree的递归删除可能会占用一定内存,可以考虑用迭代式的删除实现替代递归(比如手动遍历目录层级,从最底层开始删除),进一步降低内存占用。
  • 可以添加批量处理的间隔(比如每删除N个条目后time.sleep(0.1)),减少对磁盘IO和系统资源的瞬时占用,避免影响并行写入的业务。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.06 07:27:16