如何用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
相关产品推荐
相关产品推荐

