ฉันมียูทิลิตี้ที่สร้างคนงานหลายคนโดยใช้โมดูล Python 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
แต่ผลลัพธ์ที่ได้ค่อนข้างแปลก:
การดูการตรวจสอบกิจกรรมโดยย่อแสดงให้เห็นว่าอันที่จริงมีกระบวนการ Python 6 กระบวนการ หนึ่งกระบวนการสำหรับ mprof
หนึ่งกระบวนการสำหรับ python myscript.py
และอีกกระบวนการหนึ่งสำหรับกระบวนการย่อยของผู้ปฏิบัติงานแต่ละคน ดูเหมือนว่า mprof
กำลังวัดการใช้หน่วยความจำสำหรับกระบวนการ python myscript.py
เท่านั้น
ไลบรารี memory_profiler
สามารถปรับแต่งได้อย่างมาก และฉันค่อนข้างมั่นใจว่าควรจะสามารถบันทึกหน่วยความจำของแต่ละกระบวนการ และอาจเขียนลงในไฟล์บันทึกแยกกันโดยใช้ไลบรารีนั้นเอง ฉันแค่ไม่แน่ใจว่าจะเริ่มต้นจากตรงไหนหรือจะเข้าใกล้ระดับการปรับแต่งนั้นได้อย่างไร
แก้ไข
หลังจากอ่านสคริปต์ mprof
แล้ว ฉันค้นพบแฟล็ก -C
ซึ่งสรุปการใช้หน่วยความจำของกระบวนการย่อยทั้งหมด (แยกทาง) สิ่งนี้นำไปสู่กราฟ (ดีขึ้นมาก) ดังนี้:
แต่สิ่งที่ฉันกำลังมองหาคือการใช้หน่วยความจำของแต่ละกระบวนการย่อยในช่วงเวลาหนึ่ง เพื่อที่ฉันจะสามารถพล็อตผู้ปฏิบัติงานทั้งหมด (และต้นแบบ) บนกราฟเดียวกันได้ ความคิดของฉันคือให้แต่ละกระบวนการย่อย memory_usage
เขียนลงในไฟล์บันทึกอื่น ซึ่งฉันสามารถมองเห็นได้