Python Academy · Les

Geheugenprofilering met tracemalloc

Houd geheugentoewijzingen bij en vind lekken met tracemalloc.

Les 4 van 413 stappen

Geheugenprofilering met tracemalloc is een gratis Python Academy-les op CoddyKit. Dit is les 4 van 4. Je kunt de volledige les hieronder gratis lezen en daarna in de browser praktisch oefenen met een ingebouwde code-editor en een AI-begeleider die 24/7 beschikbaar is. Deze les maakt deel uit van het leertraject Python Academy. Je voortgang wordt gesynchroniseerd op het web en in de CoddyKit-app. De cursus Python Academy bevat in totaal 4 lessen.

Wat is tracemalloc?

tracemalloc is een module uit de standaardbibliotheek die geheugentoewijzingen in Python bijhoudt per bestand en regelnummer.

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

Momentopnamen maken

Een momentopname legt alle huidige geheugentoewijzingen op een bepaald moment vast. Vergelijk twee momentopnamen om te vinden wat ertussen is toegewezen.

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)

Momentopnamen filteren

Filter de statistieken zodat alleen de code van je toepassing wordt getoond, zonder de standaardbibliotheek.

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)

Grootste geheugengebruikers

Gebruik snapshot.statistics("lineno") of "traceback" om de grootste geheugengebruikers per regel of volledige traceback te zien.

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)

Geheugenlekken vinden

Maak twee momentopnamen rond een vermoedelijk lek en vergelijk ze. Groeiende statistieken tussen de momentopnamen wijzen op een lek.

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() retourneert (current, peak) bytes — nuttig voor eenvoudige controles vóór en na.

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 biedt geheugengebruik per regel, vergelijkbaar met line_profiler voor de processor.

# 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 (van Bloomberg) is een snelle geheugenprofiler voor Python met uitvoer als vlamgrafiek.

# 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

Geheugengebruik verminderen

Veelgebruikte technieken zijn generatoren gebruiken in plaats van lijsten, __slots__ gebruiken, de module array gebruiken voor numerieke gegevens, NumPy-arrays gebruiken en voorkomen dat grote objecten in closures actief blijven.

# 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) retourneert het geheugengebruik van een object in bytes (oppervlakkig — objecten waarnaar wordt verwezen zijn niet inbegrepen).

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

Profileren in productie

Voer tracemalloc in productie uit met een beperkt aantal nframes om de overhead te minimaliseren. Sla momentopnamen op in een bestand voor offlineanalyse.

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

Snelle controle

Waar staan de twee waarden voor die tracemalloc.get_traced_memory() retourneert?

Samenvatting

Gebruik tracemalloc.start() en momentopnamen om geheugenlekken te vinden. Vergelijk momentopnamen met compare_to(). Gebruik memory_profiler voor geheugengebruik per regel en memray voor vlamgrafieken. Verminder geheugengebruik met generatoren, __slots__ en NumPy-arrays.

Gratis beginnen

Leer Python met een AI-tutor — gratis

Schrijf echte code en voer die uit in je browser, krijg direct hulp van een AI-tutor die 24/7 beschikbaar is en ga verder waar je gebleven bent op het web of in de app.

Cursussen
76
Lessen
320

Veelgestelde vragen

Is de les “Geheugenprofilering met tracemalloc” gratis?

Ja — de volledige tekst van “Geheugenprofilering met tracemalloc” kun je hier gratis op het web lezen. Als je interactief wilt oefenen met een ingebouwde code-editor en een AI-begeleider die 24/7 beschikbaar is, en de rest van de cursus Python Academy wilt ontgrendelen, kun je upgraden naar CoddyKit PRO. De cursus Python Academy bevat in totaal 4 lessen.

Wat leer ik in “Geheugenprofilering met tracemalloc”?

Houd geheugentoewijzingen bij en vind lekken met tracemalloc. Je oefent met Python Academy door code rechtstreeks in de browser uit te voeren. Een AI-begeleider die 24/7 beschikbaar is beantwoordt je vragen terwijl je de les doorwerkt.

Heb ik ervaring nodig om met Python Academy te beginnen?

Ervaring vooraf is niet nodig. Python Academy op CoddyKit is opgebouwd voor beginners tot gevorderden, zodat je hier of bij het begin kunt starten en in je eigen tempo kunt leren. Dit is les 4 van 4.

Hoe lang duurt de les “Geheugenprofilering met tracemalloc”?

De meeste lessen van CoddyKit duren ongeveer 5–10 minuten. Elke les is kort en interactief, zodat je gestaag vooruitgaat en op het web en in de app precies verdergaat waar je was gebleven.

Kan ik code schrijven en uitvoeren in deze les over Python Academy?

Ja. Elke les over Python Academy bevat een ingebouwde code-editor, zodat je rechtstreeks in je browser echte code kunt schrijven en uitvoeren en direct feedback van AI krijgt — lokale installatie is niet nodig.

Alle lessen in deze cursus

  1. Reference counting in CPython
  2. De garbagecollector en cyclische referenties
  3. Profilen met cProfile en line_profiler
  4. Geheugenprofilering met tracemalloc
← Terug naar Python Academy