我有一個實用工具,它使用Python multiprocessing
模塊生成多個工作人員,我希望能夠通過出色的memory_profiler
實用程序跟蹤他們的內存使用情況,該工具可以完成我想要的任何事情 - 尤其是隨着時間的推移對內存使用情況進行採樣並繪製最終結果(我不關心這個問題的逐行內存分析)。如何使用Python多處理和memory_profiler來分析多個子進程?
爲了設置這個問題,我創建了一個更簡單的腳本版本,它具有一個工作函數,用於分配類似於memory_profiler
庫中給出的example的內存。工人如下:
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
寫入不同的日誌文件,然後我可以將其視覺化。
這個問題正在與GitHub上的開發人員討論,如果有人感興趣,可以在https://github.com/fabianp/memory_profiler/issues/118上找到。 – bbengfort