私は、Python multiprocessing
モジュールを使用して複数のワーカーを生成するユーティリティを持っています。私は好きなことをする優れたmemory_profiler
ユーティリティを使用してメモリ使用量を追跡できます。最終結果(私はこの質問の行ごとのメモリプロファイリングには関心がありません)。Pythonマルチプロセッシングとmemory_profilerを使用して複数のサブプロセスをプロファイリングする方法は?
この質問を設定するために、memory_profiler
ライブラリにあるexampleに似たメモリを割り当てるワーカー関数を持つ、より単純なバージョンのスクリプトを作成しました。次のように労働者は次のようになりますように4人の労働者のシーケンシャルなワークロードを考える
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
は、次のとおりです。私のスクリプトをプロファイルする実行可能mprof
を実行
if __name__ == '__main__':
worker(5, 5, X6)
worker(5, 2, X7)
worker(5, 5, X6)
worker(5, 2, X7)
は、各ワーカーの実行次々に持つ70秒かかります。実行するスクリプトは、次のとおりです。これらの労働者はmultiprocessing
と並行して行く持つスクリプトは最も遅い労働者と同じくらい遅いフィニッシュすることを意味します
:
$ mprof run python myscript.py
には、以下のメモリ使用量のグラフを生成します(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プロセスがあり、いずれもpython myscript.py
の場合はmprof
、それから各ワーカーサブプロセスの場合は1つです。 mprof
は、python myscript.py
プロセスのメモリ使用量のみを測定しているようです。
memory_profiler
ライブラリは、高度にカスタマイズ可能であり、私は、私は、各プロセスのメモリをキャプチャし、おそらくライブラリ自体を使用して、別のログファイルにそれらを書くことができなければならないことをかなり確信しています。私はどこから始めるべきか、そのレベルのカスタマイズにどのようにアプローチするのかは分かりません。
EDIT
mprof
スクリプトを読んだ後、私はすべての子(フォーク)プロセスのメモリ使用量を合計-C
旗を発見しました。これは、以下のように(改善くらい)のグラフにつながる:
しかし、どのような私が探している私はすべての労働者(マスター)をプロットすることができるように時間をかけて、個々のサブプロセスのメモリ使用量であります同じグラフに表示されます。私の考えは、それぞれのサブプロセスmemory_usage
を別のログファイルに書き込むことです。次に、それを視覚化することができます。
誰もが興味を持っている場合は、この質問はhttps://github.com/fabianp/memory_profiler/issues/118でGitHubの上の開発者と議論されています。 – bbengfort