การวิเคราะห์การใช้หน่วยความจำด้วย tracemalloc
ติดตามการจัดสรรหน่วยความจำและค้นหาหน่วยความจำรั่วด้วย tracemalloc
การวิเคราะห์การใช้หน่วยความจำด้วย tracemalloc เป็นบทเรียน Python Academy ฟรีบน CoddyKit นี่คือบทเรียนที่ 4 จากทั้งหมด 4 บทเรียน คุณสามารถอ่านบทเรียนทั้งหมดด้านล่างฟรี — จากนั้นลองปฏิบัติด้วยตัวคุณเองในเบราว์เซอร์พร้อมตัวแก้ไขโค้ดในตัวและติวเตอร์ AI ตลอด 24/7 บทเรียนนี้เป็นส่วนหนึ่งของเส้นทางการเรียน Python Academy และความก้าวหน้าของคุณจะซิงค์ข้ามเว็บและแอป CoddyKit คอร์ส Python Academy มีบทเรียนทั้งหมด 4 บทเรียน
tracemalloc คืออะไร
tracemalloc เป็นโมดูลในไลบรารีมาตรฐานที่ติดตามการจัดสรรหน่วยความจำของ Python โดยระบุหมายเลขไฟล์และบรรทัด
import tracemalloc
tracemalloc.start()
x = [i for i in range(100_000)]
current, peak = tracemalloc.get_traced_memory()
tracemalloc.stop()
print(f"Current: {current/1024:.1f} KB")
print(f"Peak: {peak/1024:.1f} KB")การบันทึกภาพสถานะ
ภาพสถานะจะบันทึกการจัดสรรหน่วยความจำทั้งหมดที่มีอยู่ ณ ช่วงเวลาหนึ่ง เปรียบเทียบภาพสถานะสองภาพเพื่อค้นหาสิ่งที่ได้รับการจัดสรรระหว่างช่วงเวลานั้น
import tracemalloc
tracemalloc.start()
snap1 = tracemalloc.take_snapshot()
data = [{"key": str(i)} for i in range(10_000)]
snap2 = tracemalloc.take_snapshot()
stats = snap2.compare_to(snap1, "lineno")
for stat in stats[:5]:
print(stat)การกรองภาพสถานะ
กรองสถิติเพื่อแสดงเฉพาะโค้ดของแอปพลิเคชัน โดยไม่รวมไลบรารีมาตรฐาน
import tracemalloc
tracemalloc.start()
leak_function()
snap = tracemalloc.take_snapshot()
filters = [tracemalloc.Filter(True, "*/myapp/*")]
stats = snap.filter_traces(filters).statistics("lineno")
for stat in stats[:10]:
print(stat)จุดที่จัดสรรหน่วยความจำมากที่สุด
ใช้ snapshot.statistics("lineno") หรือ "traceback" เพื่อดูผู้ใช้หน่วยความจำสูงสุด โดยแยกตามบรรทัดหรือย้อนดูเส้นทางการเรียกทั้งหมด
import tracemalloc
tracemalloc.start(nframe=10) # track 10 frames deep
big_list = [i**2 for i in range(500_000)]
snap = tracemalloc.take_snapshot()
for stat in snap.statistics("traceback")[:3]:
print(stat)
for line in stat.traceback.format():
print(" ", line)การค้นหาหน่วยความจำรั่ว
บันทึกภาพสถานะสองภาพคร่อมช่วงที่สงสัยว่าจะเกิดการรั่วไหล แล้วเปรียบเทียบกัน หากสถิติเพิ่มขึ้นระหว่างภาพสถานะ แสดงว่าอาจมีหน่วยความจำรั่ว
import tracemalloc
tracemalloc.start()
snap_before = tracemalloc.take_snapshot()
for _ in range(100):
suspected_leaky_function()
snap_after = tracemalloc.take_snapshot()
diff = snap_after.compare_to(snap_before, "lineno")
for stat in diff[:5]:
print(stat)get_traced_memory()
tracemalloc.get_traced_memory() ส่งคืนจำนวนไบต์ในรูปแบบ (current, peak) ซึ่งเหมาะสำหรับการตรวจสอบก่อนและหลังที่มีค่าใช้จ่ายต่ำ
import tracemalloc
tracemalloc.start()
before, _ = tracemalloc.get_traced_memory()
do_something()
after, peak = tracemalloc.get_traced_memory()
tracemalloc.stop()
print(f"Delta: {(after-before)/1024:.1f} KB, Peak: {peak/1024:.1f} KB")memory_profiler
memory_profiler แสดงการใช้หน่วยความจำทีละบรรทัด คล้ายกับที่ line_profiler แสดงการใช้ CPU
# pip install memory_profiler
from memory_profiler import profile
@profile
def build_data():
data = [i**2 for i in range(100_000)]
filtered = [x for x in data if x % 2 == 0]
return filtered
build_data()
# python -m memory_profiler script.pymemray
memray (โดย Bloomberg) เป็นเครื่องมือวิเคราะห์หน่วยความจำของ Python ที่ทำงานรวดเร็วและแสดงผลเป็นแผนภาพเปลวไฟ
# pip install memray
# python -m memray run script.py
# python -m memray flamegraph memray-script.py.bin
# Generates an interactive HTML flamegraph
# showing allocations by call stackการลดการใช้หน่วยความจำ
เทคนิคที่พบบ่อย ได้แก่ ใช้ตัวสร้างค่าแทนลิสต์ ใช้ __slots__ ใช้โมดูล array สำหรับข้อมูลตัวเลข ใช้อาร์เรย์ numpy และหลีกเลี่ยงการทำให้ออบเจ็กต์ขนาดใหญ่ยังคงอยู่ในคลอเชอร์
# Instead of:
data = [process(x) for x in huge_list] # all in memory
# Use a generator:
def gen_data(lst):
for x in lst:
yield process(x)
for item in gen_data(huge_list):
consume(item) # one at a timesys.getsizeof()
sys.getsizeof(obj) ส่งคืนหน่วยความจำที่ออบเจ็กต์ใช้เป็นจำนวนไบต์ (เฉพาะตัวออบเจ็กต์ ไม่รวมออบเจ็กต์ที่อ้างอิงอยู่)
import sys
print(sys.getsizeof([])) # 56
print(sys.getsizeof([1,2,3])) # 88
print(sys.getsizeof("hello")) # 54
print(sys.getsizeof({})) # 64
# For deep size, use recursive measurement:
def deep_size(obj):
return sys.getsizeof(obj) + sum(
sys.getsizeof(v) for v in vars(obj).values()
if hasattr(obj, "__dict__")
)การทำ Profile ในระบบจริง
เรียกใช้ tracemalloc โดยจำกัด nframes ในระบบจริงเพื่อลดค่าใช้จ่ายให้น้อยที่สุด บันทึกภาพสถานะลงไฟล์เพื่อวิเคราะห์ภายหลัง
import tracemalloc, pickle
tracemalloc.start(nframe=5) # low overhead
# ... serve some requests ...
snap = tracemalloc.take_snapshot()
with open("snap.pkl","wb") as f:
pickle.dump(snap, f)
# Analyse later offlineตรวจสอบอย่างรวดเร็ว
ค่าทั้งสองค่าที่ tracemalloc.get_traced_memory() ส่งคืนแทนอะไร
สรุปทบทวน
ใช้ tracemalloc.start() ร่วมกับภาพสถานะเพื่อค้นหาหน่วยความจำรั่ว เปรียบเทียบภาพสถานะด้วย compare_to() ใช้ memory_profiler เพื่อดูการใช้หน่วยความจำทีละบรรทัด และใช้ memray เพื่อสร้างแผนภาพเปลวไฟ ลดการใช้หน่วยความจำด้วยตัวสร้างค่า __slots__ และอาร์เรย์ NumPy
คำถามที่พบบ่อย
บทเรียน “การวิเคราะห์การใช้หน่วยความจำด้วย tracemalloc” ฟรีหรือไม่
ใช่ — ข้อความเต็มของ “การวิเคราะห์การใช้หน่วยความจำด้วย tracemalloc” ฟรีให้อ่านที่นี่บนเว็บ เพื่อปฏิบัติแบบโต้ตอบ (ตัวแก้ไขโค้ดในตัวและติวเตอร์ AI ตลอด 24/7) และปลดล็อคส่วนที่เหลือของคอร์ส Python Academy ให้อัปเกรดเป็น CoddyKit PRO คอร์ส Python Academy มีบทเรียนทั้งหมด 4 บทเรียน
คุณจะเรียนรู้อะไรในบทเรียน “การวิเคราะห์การใช้หน่วยความจำด้วย tracemalloc”
ติดตามการจัดสรรหน่วยความจำและค้นหาหน่วยความจำรั่วด้วย tracemalloc คุณปฏิบัติ Python Academy ด้วยโค้ดที่ใช้งานได้จริงที่คุณเรียกใช้โดยตรงในเบราว์เซอร์ และติวเตอร์ AI ตลอด 24/7 ตอบคำถามของคุณขณะที่คุณไปผ่านบทเรียน
คุณต้องมีประสบการณ์ก่อนที่จะเริ่มเรียน Python Academy หรือไม่
ไม่จำเป็นต้องมีประสบการณ์มาก่อน Python Academy บน CoddyKit ออกแบบมาสำหรับผู้เริ่มต้นไปจนถึงผู้เรียนขั้นสูง คุณสามารถเริ่มต้นที่นี่หรือเริ่มจากตัวแรกและเรียนด้วยความเร็วของคุณเอง นี่คือบทเรียนที่ 4 จากทั้งหมด 4 บทเรียน
บทเรียน “การวิเคราะห์การใช้หน่วยความจำด้วย tracemalloc” ใช้เวลานานแค่ไหน
บทเรียน CoddyKit ส่วนใหญ่ใช้เวลาประมาณ 5–10 นาที แต่ละบทเรียนจึงสั้นและเป็นแบบโต้ตอบ คุณสามารถก้าวหน้าอย่างต่อเนื่องและกลับมาเรียนต่อจากตรงที่เพิ่งหยุดบนเว็บและแอปได้เลย
ฉันเขียนและรันโค้ดในบทเรียน Python Academy นี้ได้ไหม
ได้ บทเรียน Python Academy ทุกบทมีตัวแก้ไขโค้ดในตัว คุณจึงเขียนและรันโค้ดจริงได้เลยในเบราว์เซอร์ และได้รับข้อเสนอแนะจาก AI ในทันที — ไม่ต้องติดตั้งในเครื่องของคุณ
บทเรียนทั้งหมดในหลักสูตรนี้
- การนับจำนวนการอ้างอิงของ CPython
- ตัวเก็บขยะและการอ้างอิงแบบวนรอบ
- การวิเคราะห์ประสิทธิภาพด้วย cProfile และ line_profiler
- การวิเคราะห์การใช้หน่วยความจำด้วย tracemalloc