删除文件及文件夹脚本内存占用过高优化方案咨询
优化大目录删除脚本以降低内存占用
优化后的代码
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
相关产品推荐
相关产品推荐

