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

Python3 multiprocessing处理1万+文件内存不足电脑卡顿如何解决

问题根因排查
  • 任务重复执行:现有代码中4个worker进程会各自生成全量文件列表并完整遍历,1万份文件实际被重复处理4次,总任务量翻4倍,同时4份全量文件列表常驻不同进程内存,带来额外内存开销。
  • 子进程资源占用叠加:execute_command中通过Popen创建的blab命令进程本身如果内存占用较高,叠加多倍重复任务的并发量,会快速耗尽系统内存。
  • 子进程内存继承:multiprocessing创建子进程时,会默认复制父进程的内存空间,若父进程初始化阶段加载了大量数据,会进一步抬升整体内存占用。
  • 缺少入口保护:没有加if __name__ == "__main__"入口判断,部分操作系统下多进程初始化时会重复执行父进程的全局逻辑,额外加载资源占用内存。
修复方案

核心优化点

  1. 调整任务分发逻辑,将文件列表拆分为独立分片分配给不同worker,避免重复处理
  2. 用multiprocessing.Pool统一管理进程生命周期,降低内存开销
  3. 优化文件列表加载逻辑,避免全量列表常驻内存

修改后参考代码

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.28 19:45:02