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.pymemray
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 stackMengurangi 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 timesys.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 offlinePemeriksaan 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
- Penghitungan Referensi CPython
- Pengumpul Sampah dan Referensi Siklik
- Pembuatan Profil dengan cProfile dan line_profiler
- Pembuatan Profil Memori dengan tracemalloc