저는 파이썬 multiprocessing
모듈을 사용하여 여러 명의 작업자를 생성하는 유틸리티를 가지고 있으며, 내가 원하는 모든 것을 해주는 우수한 memory_profiler
유틸리티를 통해 메모리 사용을 추적 할 수 있기를 바랍니다. 특히 시간이 지남에 따라 메모리 사용을 샘플링하고 최종 결과 (이 질문에 대해 줄 단위 메모리 프로파일 링에 관심이 없다).파이썬 다중 처리 및 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 초 실행합니다. 로 실행 스크립트는 다음과 같습니다 이러한 노동자 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
를 사용하여 오류가 없는지하지만 결과는 이상한 조금 있습니다 : 다음과 같이 그 스크립트입니다
얼핏에서 Activity Monitor는 실제로 6 개의 파이썬 프로세스가 있음을 보여줍니다. 하나는 이고 하나는 python myscript.py
이고 나머지 하나는 각 작업자 프로세스입니다. mprof
은 python myscript.py
프로세스의 메모리 사용량을 측정하는 것으로 나타납니다.
memory_profiler
라이브러리
나는 모든 자식 (갈래) 프로세스의 메모리 사용량을 합산 -C
플래그를 발견했던 mprof
스크립트를 통해 읽은 후 편집
.
을하지만 내가 찾는 것은 시간이 지남에 따라 각각의 서브 프로세스의 메모리 사용 나는 모든 근로자 (마스터)를 그릴 수 있도록입니다 다음과 같이 이것은 (많이 개선) 그래프로 연결 같은 그래프에. 내 생각은 각 서브 프로세스 memory_usage
을 다른 로그 파일에 기록한 다음 시각화 할 수있게하는 것입니다.
이 질문은 관심있는 사람이 있다면 https://github.com/fabianp/memory_profiler/issues/118의 GitHub 개발자와 논의 중입니다. – bbengfort