我有一个实用程序,使用Python的
产生以下内存使用图表: 拥有这些工人与
记忆分析器确实可以工作,或者至少在使用
编辑
阅读了“mprof”脚本后,我发现“-C”标志可以汇总所有子(分叉)进程的内存使用情况。这导致了以下改进的图表:
multiprocessing
模块生成多个工作进程,并且我希望能够通过出色的memory_profiler
实用程序跟踪它们的内存使用情况,该实用程序可以完全满足我的要求 - 特别是随时间对内存使用情况进行取样和绘制最终结果(对于此问题,我不关心逐行内存分析)。为了设置该问题,我创建了一个简化版的脚本,其中包含一个与memory_profiler
库中给出的示例类似的分配内存的工作者函数。该工作者如下:import time
X6 = 10 ** 6
X7 = 10 ** 7
def worker(num, wait, amt=X6):
"""
A function that allocates memory over time.
"""
frame = []
for idx in range(num):
frame.extend([1] * amt)
time.sleep(wait)
del frame
给定以下4个工人的顺序工作:
if __name__ == '__main__':
worker(5, 5, X6)
worker(5, 2, X7)
worker(5, 5, X6)
worker(5, 2, X7)
运行 mprof
可执行文件来对我的脚本进行分析,让每个工作进程一个接一个地运行,需要70秒。脚本的运行方式如下:
$ mprof run python myscript.py
产生以下内存使用图表: 拥有这些工人与
multiprocessing
并行执行意味着脚本将以最慢的工人(25秒)的速度完成。该脚本如下:import multiprocessing as mp
if __name__ == '__main__':
pool = mp.Pool(processes=4)
tasks = [
pool.apply_async(worker, args) for args in
[(5, 5, X6), (5, 2, X7), (5, 5, X6), (5, 2, X7)]
]
results = [p.get() for p in tasks]
记忆分析器确实可以工作,或者至少在使用
mprof
时没有错误,但结果有些奇怪:
快速查看活动监视器可以发现,实际上有6个Python进程,一个用于mprof
,一个用于python myscript.py
,然后每个工作子进程都有一个。看起来mprof
只测量了python myscript.py
进程的内存使用情况。
“memory_profiler”库高度可定制化,我非常有信心能够使用该库捕获每个进程的内存,并可能将其写入单独的日志文件中。只是我不确定从哪里开始或如何处理这种级别的定制化。编辑
阅读了“mprof”脚本后,我发现“-C”标志可以汇总所有子(分叉)进程的内存使用情况。这导致了以下改进的图表:
但我想要的是每个子进程随时间变化的内存使用情况,以便我可以在同一张图上绘制所有工作进程(和主进程)。我的想法是将每个子进程的 memory_usage
写入不同的日志文件,然后进行可视化。