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

如何用memory_profiler监控subprocess.run启动的进程内存?

问题分析

memory_profiler的memory_usage()默认追踪的是调用它的Python主进程的内存变化,而subprocess.run()启动的是完全独立的子进程,两者属于不同的进程空间。主进程仅负责创建子进程,自身内存不会随子进程的内存波动而变化,这就是你看到内存数据几乎无变化的核心原因。

解决方案

要监控子进程的内存,必须直接针对子进程本身进行采样,而非监控Python主进程。以下是两种可行的实现方式:

方法一:用psutil实时采样子进程内存

借助psutil库,在子进程运行期间定期查询其内存占用,这是跨平台且通用的方案,适用于所有类型的子进程(包括C++编译的二进制程序)。

修改后的代码

import subprocess
import psutil
import time

def run_and_monitor_subprocess():
    # 编译C++代码(若无需监控编译阶段内存可跳过)
    subprocess.run("g++ -Wall -o test.out code.cpp".split(), check=True)
    
    # 启动子进程,保持进程句柄以便监控
    proc = subprocess.Popen(
        ["./test.out"],
        stdin=open("input.txt", 'r'),
        stdout=open("output.txt", 'w')
    )
    
    mem_usage = []
    # 循环采样直到子进程结束
    while proc.poll() is None:
        try:
            # 获取子进程的进程对象
            p = psutil.Process(proc.pid)
            # 读取常驻内存(RSS),转换为MB单位
            mem_mb = p.memory_info().rss / (1024 * 1024)
            mem_usage.append(mem_mb)
            time.sleep(0.1)  # 采样间隔,可根据精度需求调整
        except psutil.NoSuchProcess:
            break  # 进程已提前结束
    
    # 计算并输出结果
    max_mem = max(mem_usage) if mem_usage else 0
    print("子进程内存使用记录:", mem_usage)
    print("子进程最大内存占用:", max_mem, "MB")

if __name__ == "__main__":
    run_and_monitor_subprocess()

注意事项

  • 先安装依赖库:pip install psutil
  • 采样间隔time.sleep(0.1)可灵活调整:间隔越小采样越密集,但会增加主进程的CPU开销
  • 若需要其他内存指标(如虚拟内存),可将rss替换为vms,具体参考psutil的memory_info()返回值

方法二:仅适用于Python子进程的内存监控

如果你的子进程是Python脚本,可直接用memory_profiler注入监控,比如通过python -m memory_profiler script.py启动子进程,再解析输出结果。但此方法不适用于你的C++二进制程序场景,仅作补充说明。

原代码失效的核心原因

原代码中memory_usage((run_subprocess, (), {}))监控的是run_subprocess函数在Python主进程内的内存变化,而subprocess.run()仅在主进程中创建了子进程的管理对象,主进程自身的内存不会因为子进程的内存占用而增加,因此得到的只是主进程的内存数据,与目标子进程无关。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.13 04:56:22