我正在尝试监视使用 Python 中的
subprocess.run()
函数启动的进程的内存使用情况。为了实现这一目标,我想使用 memory_profiler
包来深入了解子进程执行时的内存消耗。
这是我想要实现的目标的简化版本:
import subprocess
from memory_profiler import memory_usage
def run_subprocess():
subprocess.run("g++ -Wall -o test.out code.cpp".split(), check=True)
subprocess.run(["./test.out"], stdin=open("input.txt", 'r'), stdout=open("output.txt", 'w'))
if __name__ == "__main__":
mem_usage = memory_usage((run_subprocess, (), {}))
max_mem = max(mem_usage)
print(mem_usage)
print("Max memory usage:", max_mem, "MB")
输出:
[19.8515625, 19.953125, 19.953125, 19.953125, 19.953125, 19.953125, 19.953125, 19.953125, 19.953125, 19.96484375]
Max memory usage: 19.96484375 MB
但是,我注意到 memory_profiler 报告的内存使用情况似乎并没有随着子进程的运行而改变。我知道内存使用量不会增加,因为函数
run()
没有分配任何新内存。
我需要采取哪些步骤才能使用 memory_profiler 正确监控通过 subprocess.run() 启动的进程的内存使用情况?我的代码中是否需要任何其他注意事项或修改?
任何有关如何在此子流程场景中实现准确内存监控的帮助或指导将不胜感激。预先感谢您!
使用子进程的 PID 应该会得到更好的结果。
def run_subprocess():
compile_pid = subprocess.run("g++ -Wall -o test.out code.cpp".split(), check=True)
prg_pid = subprocess.run(["./test.out"], stdin=open("input.txt", 'r'), stdout=open("output.txt", 'w'))
pids = {"compile": compile_pid, "program": prg_pid}
return pids
if __name__ == "__main__":
usage = {}
pids = run_subprocess()
for k, v in pids.items():
usage[k] = memory_usage(v, interval=.5, timeout=60)
for p, mem in usage.items():
print(f"Usage over time for {p}: {mem[:10]}...")
print(f"Max usage for {p}: {max(mem)} MB")