Muistiprofilointi tracemallocilla
Seuratkaa muistinvarauksia ja etsikää vuotoja tracemallocilla.
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.pymemray
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 stackMuistinkä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 timesys.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 offlinePikatarkistus
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.
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
- CPythonin viitelaskenta
- Roskienkerääjä ja sykliset viittaukset
- Profilointi cProfilella ja line_profilerilla
- Muistiprofilointi tracemallocilla