0Pricing
Python Academy · Pelajaran

Pembuatan Profil Memori dengan tracemalloc

Lacak alokasi memori dan temukan kebocoran dengan tracemalloc.

Pembuatan Profil Memori dengan tracemalloc adalah pelajaran Python Academy gratis di CoddyKit. Ini adalah pelajaran 4 dari 4. Kamu bisa membaca pelajaran lengkapnya di bawah secara gratis — lalu praktikkan langsung di browser dengan editor kode bawaan dan tutor AI 24/7. Ini adalah bagian dari jalur belajar Python Academy, dan progresmu tersinkronisasi di web dan aplikasi CoddyKit. Kursus Python Academy mencakup 4 pelajaran total.

Apa Itu tracemalloc?

tracemalloc adalah modul pustaka standar yang melacak alokasi memori Python berdasarkan file dan nomor baris.

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")

Mengambil Snapshot

Snapshot merekam semua alokasi saat ini pada suatu titik waktu. Bandingkan dua snapshot untuk menemukan alokasi yang terjadi di antara keduanya.

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)

Memfilter Snapshot

Filter statistik agar hanya menampilkan kode aplikasi Anda dan mengecualikan pustaka standar.

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)

Alokasi Memori Terbesar

Gunakan snapshot.statistics("lineno") atau "traceback" untuk melihat penggunaan memori terbesar berdasarkan baris atau traceback lengkap.

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)

Menemukan Kebocoran Memori

Ambil dua snapshot di sekitar kebocoran yang dicurigai, lalu bandingkan. Statistik yang meningkat di antara snapshot menunjukkan adanya kebocoran.

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() mengembalikan jumlah byte (current, peak)—berguna untuk pemeriksaan ringan sebelum dan sesudah.

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 menyediakan penggunaan memori baris demi baris, serupa dengan line_profiler untuk 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 (oleh Bloomberg) adalah profiler memori Python yang cepat dan menghasilkan keluaran flamegraph.

# 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

Mengurangi Penggunaan Memori

Teknik yang umum meliputi penggunaan generator sebagai pengganti daftar, __slots__, modul array untuk data numerik, larik numpy, serta menghindari penyimpanan objek besar tetap hidup di dalam closure.

# 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) mengembalikan memori yang digunakan objek dalam satuan byte (dangkal—tidak mencakup objek yang dirujuk).

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__")
    )

Pembuatan Profil di Produksi

Jalankan tracemalloc dengan nframes terbatas di lingkungan produksi untuk meminimalkan overhead. Simpan snapshot ke file untuk dianalisis secara luring.

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

Pemeriksaan Cepat

Apa yang direpresentasikan oleh dua nilai yang dikembalikan tracemalloc.get_traced_memory()?

Ringkasan

Gunakan tracemalloc.start() dan snapshot untuk menemukan kebocoran memori. Bandingkan snapshot dengan compare_to(). Gunakan memory_profiler untuk penggunaan baris demi baris dan memray untuk flamegraph. Kurangi penggunaan memori dengan generator, __slots__, dan larik NumPy.

Pertanyaan yang Sering Diajukan

Apakah pelajaran “Pembuatan Profil Memori dengan tracemalloc” gratis?

Ya — teks lengkap “Pembuatan Profil Memori dengan tracemalloc” gratis dibaca di sini di web. Untuk praktiknya secara interaktif (editor kode bawaan dan tutor AI 24/7) dan buka sisa kursus Python Academy, upgrade ke CoddyKit PRO. Kursus Python Academy mencakup 4 pelajaran total.

Apa yang akan aku pelajari di “Pembuatan Profil Memori dengan tracemalloc”?

Lacak alokasi memori dan temukan kebocoran dengan tracemalloc. Kamu berlatih Python Academy dengan kode praktik yang langsung kamu jalankan di browser, dan tutor AI 24/7 menjawab pertanyaanmu saat kamu mengerjakan pelajaran ini.

Apakah aku perlu pengalaman untuk memulai Python Academy?

Tidak diperlukan pengalaman sebelumnya. Python Academy di CoddyKit dirancang untuk pemula hingga pelajar tingkat lanjut, jadi kamu bisa memulai di sini atau dari awal dan belajar sesuai kecepatan kamu sendiri. Ini adalah pelajaran 4 dari 4.

Berapa lama pelajaran “Pembuatan Profil Memori dengan tracemalloc” memakan waktu?

Sebagian besar pelajaran CoddyKit memakan waktu sekitar 5–10 menit. Setiap pelajaran ringkas dan interaktif, jadi kamu membuat kemajuan stabil dan melanjutkan dari tempat kamu tinggalkan di web dan aplikasi.

Bisakah aku menulis dan menjalankan kode dalam pelajaran Python Academy ini?

Ya. Setiap pelajaran Python Academy menyertakan editor kode bawaan, jadi kamu menulis dan menjalankan kode nyata langsung di browser dan mendapatkan umpan balik AI instan — tidak diperlukan penyiapan lokal.

Semua pelajaran dalam kursus ini

  1. Penghitungan Referensi CPython
  2. Pengumpul Sampah dan Referensi Siklik
  3. Pembuatan Profil dengan cProfile dan line_profiler
  4. Pembuatan Profil Memori dengan tracemalloc
← Kembali ke Python Academy