Python3 multiprocessing处理1万+文件内存不足电脑卡顿如何解决
问题根因排查
- 任务重复执行:现有代码中4个worker进程会各自生成全量文件列表并完整遍历,1万份文件实际被重复处理4次,总任务量翻4倍,同时4份全量文件列表常驻不同进程内存,带来额外内存开销。
- 子进程资源占用叠加:
execute_command中通过Popen创建的blab命令进程本身如果内存占用较高,叠加多倍重复任务的并发量,会快速耗尽系统内存。 - 子进程内存继承:multiprocessing创建子进程时,会默认复制父进程的内存空间,若父进程初始化阶段加载了大量数据,会进一步抬升整体内存占用。
- 缺少入口保护:没有加
if __name__ == "__main__"入口判断,部分操作系统下多进程初始化时会重复执行父进程的全局逻辑,额外加载资源占用内存。
修复方案
核心优化点
- 调整任务分发逻辑,将文件列表拆分为独立分片分配给不同worker,避免重复处理
- 用
multiprocessing.Pool统一管理进程生命周期,降低内存开销 - 优化文件列表加载逻辑,避免全量列表常驻内存
修改后参考代码
from multiprocessing import Pool from subprocess import Popen, DEVNULL TIMEOUT = 300 # 按需调整为你的超时时间 WORKER_NUM = 3 # 可根据blab的内存占用调整,单进程内存占比越高,并发数设置越低 def execute_command(runcommand): child = Popen(runcommand.split(' '), stdout=DEVNULL, stderr=DEVNULL) try: child.wait(timeout=TIMEOUT) except Exception as e: child.kill() # 确保子进程资源被完全回收 child.wait() return child.returncode def process_single_file(file_path): cmd = f"/usr/bin/blab params {file_path}" return execute_command(cmd) def main(): # 仅在父进程生成1份全量文件列表,无需每个worker单独生成 file_list = [] # 替换为你的文件列表生成逻辑 # 进程池自动分发任务,每个worker仅处理分配给自己的分片 with Pool(processes=WORKER_NUM) as pool: # chunksize可按需调整,数值越大进程间通信开销越小 pool.map(process_single_file, file_list, chunksize=100) if __name__ == "__main__": main()
额外优化建议
- 若文件数量极多,可改用生成器迭代文件路径,不要一次性把全量路径加载为列表,进一步降低内存占用
- 若
blab命令单进程内存占用超过2G,建议将WORKER_NUM调整为2,预留足够内存给系统本身 - 可添加简单的内存监控逻辑,进程内存超过阈值时主动销毁重启,避免内存泄漏累积
内容的提问来源于stack exchange,提问作者wejopa5747
相关产品推荐
相关产品推荐

