0Pricing
Python Academy · บทเรียน

การวิเคราะห์การใช้หน่วยความจำด้วย 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.py

memray

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 time

sys.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 ในทันที — ไม่ต้องติดตั้งในเครื่องของคุณ

บทเรียนทั้งหมดในหลักสูตรนี้

  1. การนับจำนวนการอ้างอิงของ CPython
  2. ตัวเก็บขยะและการอ้างอิงแบบวนรอบ
  3. การวิเคราะห์ประสิทธิภาพด้วย cProfile และ line_profiler
  4. การวิเคราะห์การใช้หน่วยความจำด้วย tracemalloc
← กลับไปที่ Python Academy