Python Academy · Oppitunti

Muistiprofilointi tracemallocilla

Seuratkaa muistinvarauksia ja etsikää vuotoja tracemallocilla.

Oppitunti 4/413 vaihetta

Muistiprofilointi tracemallocilla on ilmainen Python Academy-oppitunti CoddyKitissä. Tämä on oppitunti 4/4. Voit lukea koko oppitunnin alta ilmaiseksi ja harjoitella sen jälkeen käytännössä selaimessa sisäänrakennetulla koodieditorilla ja ympäri vuorokauden käytettävissä olevan tekoälytuutorin avulla. Oppitunti kuuluu Python Academy-oppimispolkuun, ja edistymisesi synkronoituu verkon ja CoddyKit-sovelluksen välillä. Python Academy-kurssilla on yhteensä 4 oppituntia.

Mikä tracemalloc on

tracemalloc on vakiokirjaston moduuli, joka seuraa Pythonin muistivarauksia tiedosto- ja rivinumerokohtaisesti.

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

Tilannevedosten ottaminen

Tilannevedos sisältää kaikki sillä hetkellä tehdyt muistivaraukset. Vertaamalla kahta tilannevedosta löydätte niiden välillä tehdyt varaukset.

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)

Tilannevedosten suodattaminen

Suodattakaa tilastot näyttämään vain sovelluksen oma koodi ja jättäkää vakiokirjasto pois.

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)

Suurimmat muistinkäyttäjät

Käyttäkää snapshot.statistics("lineno")- tai "traceback"-arvoa nähdäksenne eniten muistia käyttävät kohdat rivin tai koko kutsupinon mukaan.

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)

Muistivuotojen löytäminen

Ottakaa kaksi tilannevedosta epäillyn muistivuodon ympäriltä ja verratkaa niitä. Tilastojen kasvaminen tilannevedosten välillä viittaa muistivuotoon.

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() palauttaa (current, peak)-arvon tavuina — tämä on hyödyllinen kevyt tarkistus ennen ja jälkeen toiminnon.

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 näyttää muistin käytön riveittäin samalla tavoin kuin line_profiler näyttää suorittimen käytön.

# 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 (Bloombergin kehittämä) on nopea Pythonin muistiprofiloija, joka tuottaa liekkikaavioita.

# 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

Muistinkäytön vähentäminen

Yleisiä tekniikoita ovat generaattoreiden käyttäminen listojen sijaan, __slots__-määritteen hyödyntäminen, array-moduulin käyttäminen numeeriseen dataan, numpy-taulukkojen käyttäminen sekä suurten objektien säilyttämisen välttäminen sulkeumissa.

# 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) palauttaa objektin käyttämän muistin tavuina (pinnallinen koko — ei sisällä viitattuja objekteja).

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

Profilointi tuotannossa

Suorittakaa tuotannossa tracemalloc rajoitetulla nframes-arvolla yleiskustannusten minimoimiseksi. Tallentakaa tilannevedokset tiedostoon offline-analyysiä varten.

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

Pikatarkistus

Mitä tracemalloc.get_traced_memory()-funktion palauttamat kaksi arvoa tarkoittavat?

Kertaus

Käyttäkää yhdistelmää tracemalloc.start() + tilannevedokset muistivuotojen löytämiseen. Verratkaa tilannevedoksia compare_to()-funktion avulla. Käyttäkää memory_profiler-moduulia rivikohtaiseen muistinkäytön tarkasteluun ja memray-moduulia liekkikaavioihin. Vähentäkää muistinkäyttöä generaattoreilla, __slots__-määritteellä ja NumPy-taulukoilla.

Aloita maksutta

Opi Python tekoälytuutorin avulla — ilmaiseksi

Kirjoita ja suorita oikeaa koodia selaimessa, saa välitöntä apua tekoälytuutorilta ympäri vuorokauden ja jatka siitä, mihin jäit, verkossa tai sovelluksessa.

Kurssit
76
Oppitunnit
320

Usein kysytyt kysymykset

Onko oppitunti ”Muistiprofilointi tracemallocilla” ilmainen?

Kyllä – oppitunnin ”Muistiprofilointi tracemallocilla” koko tekstin voi lukea täällä verkossa ilmaiseksi. Jos haluat harjoitella interaktiivisesti sisäänrakennetulla koodieditorilla ja ympäri vuorokauden käytettävissä olevan tekoälytuutorin avulla sekä avata koko Python Academy-kurssin, päivitä CoddyKit PROhon. Python Academy-kurssilla on yhteensä 4 oppituntia.

Mitä opin oppitunnilla ”Muistiprofilointi tracemallocilla”?

Seuratkaa muistinvarauksia ja etsikää vuotoja tracemallocilla. Harjoittelet Python Academy-aihetta koodilla, jonka suoritat suoraan selaimessa. Ympäri vuorokauden käytettävissä oleva tekoälytuutori vastaa kysymyksiisi oppitunnin aikana.

Tarvitsenko kokemusta aloittaakseni Python Academy-opiskelun?

Aiempi kokemus ei ole tarpeen. CoddyKitin Python Academy-oppimispolku sopii vasta-alkajista edistyneisiin, joten voit aloittaa tästä tai alusta ja edetä omaan tahtiisi. Tämä on oppitunti 4/4.

Kuinka kauan ”Muistiprofilointi tracemallocilla”-oppitunnin suorittaminen kestää?

Useimmat CoddyKitin oppitunnit kestävät noin 5–10 minuuttia. Jokainen oppitunti on lyhyt ja interaktiivinen, joten edistyt tasaisesti ja voit jatkaa siitä, mihin jäit – sekä verkossa että sovelluksessa.

Voinko kirjoittaa ja suorittaa koodia tällä Python Academy-oppitunnilla?

Kyllä. Jokainen Python Academy-oppitunti sisältää sisäänrakennetun koodieditorin, joten voit kirjoittaa ja suorittaa oikeaa koodia suoraan selaimessa ja saada välitöntä palautetta tekoälyltä – paikallista asennusta ei tarvita.

Kaikki tämän kurssin oppitunnit

  1. CPythonin viitelaskenta
  2. Roskienkerääjä ja sykliset viittaukset
  3. Profilointi cProfilella ja line_profilerilla
  4. Muistiprofilointi tracemallocilla
← Takaisin: Python Academy