Top 5 Python Memory Profilers

vuoden 2019 Stackoverflow-tutkimuksen mukaan Python-ohjelmointikieli sai 73,1% hyväksynnän kehittäjien keskuudessa. Se sijoittuu toiseksi ruosteen jälkeen ja hallitsee edelleen Datatiedettä ja koneoppimista(ML).

Python on kehittäjien suosikki. Se on korkean tason kieli, joka tunnetaan vankkuudestaan ja perusfilosofiastaan―yksinkertaisuudestaan kompleksisuuden sijaan. Python-sovelluksen suorituskyky on kuitenkin toinen juttu. Aivan kuten mikä tahansa muu sovellus, sillä on osansa suorituskykyyn liittyvistä kysymyksistä.

useimmiten APM-työkalut, kuten Retrace, voivat auttaa sovellusten suorituskykyyn liittyvien ongelmien ratkaisemisessa. Mutta, mitä jos Python-sovellus on ollut käynnissä neljä tuntia ja palvelimen muisti on loppu? Tämä on erityinen muistiresursseihin liittyvä ongelma.

sitä kutsutaan muistivuodoksi. Kehittäjien on löydettävä syyllinen. Silloin tulee Python-muistiprofiloijia.

tutkitaan tarkemmin.

Mitä ovat Python-muistiprofiloijat?

Profilointisovelluksiin liittyy aina asioita, kuten suoritin, muisti jne. Python-sovellukset ovat kuitenkin alttiita muistinhallintaongelmille. Tämä johtuu ennen kaikkea siitä, että Pythonia sovelletaan Datatieteisiin ja ML-sovelluksiin ja se toimii valtavien tietomäärien kanssa. Myös Python luottaa oletusarvoisesti Muistinhallintajärjestelmäänsä sen sijaan, että se jätettäisiin käyttäjälle.

koska Python-koodi toimii konteissa hajautetun prosessointikehyksen kautta, jokainen säiliö sisältää kiinteän määrän muistia. Jos koodin suoritus ylittää muistirajan, säiliö päättyy. Tällöin kehitys kokee muistivirheitä.

näin ei kuitenkaan aina ole. On tapauksia, joissa kehittäjät eivät tiedä, mitä on tekeillä. Ehkä esine roikkuu referenssissä, kun sen ei pitäisi olla ja kerääntyy ajan myötä. Kun se saavuttaa huippunsa, tulee muistiongelmia.

pikaratkaisuna on lisätä muistinvarausta. Se ei kuitenkaan ole käytännöllistä, koska se voi johtaa resurssien tuhlaamiseen. Lisäksi se voi vaarantaa sovelluksen vakauden arvaamattomien muistipiikkien vuoksi.

siksi tarvitsemme Python-muistiprofiloijien apua. Python-muistiprofiloijien tarkoituksena on löytää muistivuotoja ja optimoida muistin käyttö Python-sovelluksissa. Tämäntyyppiset Python-muistiprofiloijat ymmärtävät käytetyn koodin ja pakettien tilatehokkuuden.

Top Python-Muistiprofiloijat

vaikka Python hallinnoi muistia automaattisesti, se tarvitsee työkaluja, koska pitkään käynnissä olevat Python-työt kuluttavat paljon muistia. Useimmissa tapauksissa nämä työt eivät palauta muistia käyttöjärjestelmään ennen prosessin päättymistä, vaikka se suorittaisi asianmukaisesti roskien keräämisen.

tässä on luettelo tunnetuista Python-muistiprofiloijista:

Pympler

Jean Brouwers, Ludwig Haehne ja Robert Schuppenies rakensivat Pymplerin elokuussa 2008. He ottivat käyttöön prosessin pympling, jossa Pympler saa yksityiskohtia koon ja eliniän Python esineitä.

Pymplerin Python-muistiprofiloija analysoi Python-objektin muistin käyttäytymistä käynnissä olevan sovelluksen sisällä. Se tarjoaa täydellisen ja itsenäisen Python-muistiprofilointiratkaisun. Myös, se projisoi mahdollinen virhe runtime käyttäytymistä, kuten muistin paisunut ja muut ” pymples.”

pymplerin sisällä on kolme erillistä moduulia.

  • asizeof-moduuli antaa Python-olion kokotiedot.
  • muppy-moduuli palvelee Python-sovelluksen online-seurantaa.
  • Class Tracker-moduuli tarjoaa off-line-analyysin valittujen Python-objektien elinajasta.

tutkitaan ensin asizeofin avulla, kuinka paljon muistia tietyt Python-objektit kuluttavat.

>>> from pympler import asizeof

>>> obj =

>>> asizeof.asizeof(obj)

>>> print (asizeof.asized(obj, detail=1).format())

size=192 flat=48

(6, 4) size=64 flat=32

”i”size=32 flat=32

3 size=16 flat=16

1 size=16 flat=16

toinen, toteutetaan muppy-moduuli:

>>>iv id=”pympler import muppy

>>>> allobjects = muppy.get_objects()

>>> len(allObjects)

>>> from pympler import summary

>>> I = summary.summary (allObjects)

>>> summary.print_(sum)

types | # objects | total size
========================== | =========== | ============
str | 13262 | 1.01 MB
dict | 2120 | 659.99 KB
code | 3362 | 343.73 KB
list | 2587 | 247.46 KB
type | 639 | 242.61 KB
tuple | 2069 | 58.83 KB
set | 86 | 44.57 KB
wrapper_descriptor | 1247 | 43.84 KB
builtin_function_or_method | 1014 | 35.65 KB
method_descriptor | 937 | 32.94 KB
abc.ABCMeta | 66 | 32.38 KB
weakref | 818 | 28.76 KB
int | 1612 | 24.72 KB
getset_descriptor | 555 | 17, 34 KB
frozenset | 90 | 16, 87 KB

täältä voit tarkastella kaikkia kasassa olevia Python-objekteja muppy-moduulin avulla. Voit soittaa toiseen yhteenvetoon ja vertailla sitä tarkistaaksesi, onko joissakin järjestelmissä muistivuotoja. Lue lisää muppy-moduulista täältä.

pympler-profiloijan kolmas moduuli on Class Tracker. Se seuraa tiettyjen luokkien esineiden elinikää. Thus, it provides insight into instantiation patterns and helps developers understand how specific objects contribute to the memory footprint in the long run.

>>> tr = classtracker.ClassTracker()

>>> tr.track_class(Document)

>>> tr.create_snapshot(description=’Snapshot 1′)

>>> doc = create_document()

>>> tr.create_snapshot(description=’Snapshot 2′)

>>> tr.stats.print_summary ()

— SUMMARY ———————-

tilannekuva 1 aktiivinen 0 b keskimääräinen pct

tilannekuva 2 aktiivinen 0 b keskimääräinen pct

—————————

Jos haluat lisätietoja Class Trackerista, klikkaa tästä.

Guppy3

Guppy3 (tunnetaan myös nimellä Heapy) on Python-ohjelmointiympäristö ja heap-analyysin työkalusarja. Se on paketti, joka sisältää seuraavat osapaketit:

  • jne – Tämä on Tukimoduuli, jossa on Liimaprotokollamoduuli.
  • gsl – alipaketti, joka sisältää Guppy-Määrittelykielen toteutuksen. Se luo asiakirjoja ja testejä yhteisestä lähteestä.
  • heapy-röykkiöanalyysin työkalusarja antaa objektitietoa kasasta ja näyttää tiedot.
  • sarjat – Tämä sisältää Bittisarjoja ja nodesetteja.

Guppy3 on Guppy-PE: n haarukka ja sen rakensi Sverker Nilsson Python 2: lle.

huomautus: Tämän Python-muistiprofiloijan käyttäminen vaatii Python 3.5, 3.6, 3.7 tai 3.8. Tämä paketti toimii vain CPython. Näin ollen PyPy ja muut Python-kääntäjän toteutukset eivät ole tuettuja. Myös, käyttää graafista selainta, se tarvitsee Tkinter. Lisäksi ketjuttaminen on oltava saatavilla, kun käytät etämonitoria.

tässä on kuinka hyödyntää tätä Python-muistiprofiloijaa. Voit ottaa kuvan kasasta ennen ja jälkeen kriittisen prosessin. Sitten vertailla kokonaismuistia ja paikantaa mahdolliset muistipiikit, joita yhteisissä kohteissa on.

>>> from guppy import hpy

>>> h=hpy()

>>> h.heap()

Partition of a set of 34090 objects. Total size = 2366226 bytes.

Index Count % Size % Cumulative % Kind (class / dict of class)
0 10279 30 666873 28 666873 28 str
1 4697 14 259576 11 926449 39 bytes
2 2413 7 251684 11 1178133 50 types.CodeType
3 6825 20 238084 10 1416217 60 tuple
4 448 1 174868 7 1591085 67 type
5 2208 6 150144 6 1741229 74 function
6 448 1 130964 6 1872193 79 dict of type
7 94 0 83532 4 1955725 83 dict of module
8 242 1 56524 2 2012249 85 dict (no owner)
9 1133 3 40788 2 2053037 87 types.WrapperDescriptorType

<118 more rows. Type e.g. ‘_.more’ to view.>

Memory Profiler

Memory Profiler is a pure Python module that uses the psutil module. Se seuraa Python-työprosessin muistinkulutusta. Lisäksi se suorittaa rivi riviltä-analyysin sovelluksen muistinkulutuksesta.

line-by-line-muistinkäyttötila toimii samalla tavalla kuin line_profiler.

  1. se koristaa funktion, jonka haluat profiloida @profile-funktiolla.
  2. voit suorittaa käsikirjoituksen erityisellä käsikirjoituksella. Käytä esimerkiksi Python-tulkkiin erityisiä argumentteja.

seuraavassa esimerkissä käytetään yksinkertaista funktiota nimeltä my_func. Tämä toiminto luo luettelon määritellyllä alueella.

@profile

def my_func():

a=

for i in range(1000):

a.append(i)

my_func()

This outputs:

Line # Mem Usage Increment Line Contents
1 13.859 MiB 13.859 MiB @profile
2 def my_func():
3 13.859 MiB 0.000 MiB a=
4 13.859 MiB 0.000 MiB I in range(1000):
5 13.859 MiB 0.000 MiB a.append(i)

ensimmäinen sarake on profiloidun koodin rivinumero. Mem-käyttö on Python-tulkin muistinkäyttöä jokaisen koodin suorituksen jälkeen. Kolmas sarake (lisäys) kuvaa nykyisen rivin muistin eroa edelliseen. Viimeinen sarake (rivin sisältö) näyttää profiloidut koodit.

To see how this Python memory profiler works, let’s change the range value to 1000000 in the function above and execute it. Here is the output:

Line # Mem usage Increment Line Contents
1 13.844 MiB 13.844 MiB @profile
2 def my_func():
3 13.844 MiB 0.000 MiB a=
4 33.387 MiB 0.016 MiB I in range(1000000):
5 33.387 MiB 0.293 MiB a.append(i)

rivit 4 ja 5 osoittavat muistin käytön lisääntyneen, mikä todistaa, että tämä profiloija suorittaa rivi riviltä-analyysin muistin kulutuksesta.

Fil

Fil profiler on avoimen lähdekoodin Python-muistiprofiloija. Se soveltuu tietojenkäsittelyyn ja tieteellisiin laskentasovelluksiin. Tällä hetkellä se on vielä kehitysvaiheessa ja toimii vain Linuxissa ja macOS: ssa.

useimmat Datatutkijat ja Python-kehittäjät kohtaavat muistiongelmia Python-dataputken kanssa. Kun se käyttää liikaa muistia, on vaikea paikantaa, mihin kaikki muisti tarkalleen ottaen on menossa.

mainitaan esimerkiksi kaksi skenaariota:

palvelimet

koska palvelimet toimivat tauotta, muistivuodot ovat usein syynä suorituskykyvikaan. Kehittäjät laiminlyövät pieniä määriä muistivuotoja, koska useimmat palvelimet käsittelevät pieniä määriä dataa kerrallaan. Nämä voivat kuitenkin lisätä jopa kymmeniätuhansia puheluita. Tämän seurauksena tämä saattaa aiheuttaa vakavia tuotanto-ongelmia ajan myötä.

Dataputket

suuria datapaloja käsiteltäessä piikit muistinkäytössä tuovat valtavia uhkia dataputkille. Esimerkiksi, Jos sovellus käyttää 1GB RAM jo jonkin aikaa ja sitten yhtäkkiä tarvitsee 16GB RAM. On suuri tarve tunnistaa, mistä äkilliset muistipiikit johtuvat.

se on Fil: n tärkein tavoite―diagnosoida muistinkäytön piikkejä riippumatta käsiteltävän datan määrästä. Se osoittaa, missä tarkalleen huippumuistin käyttö on ja mikä koodi on vastuussa tästä piikistä.

vaikka on olemassa Python-muistiprofiloijia, jotka mittaavat muistin käyttöä, sillä on rajoituksia. Yksi niistä käsittelee valtavia määriä tietoja-erän käsittely. Python-sovellukset ovat enimmäkseen eräkäsittelysovelluksia, joissa ne lukevat jatkuvasti tietoja, käsittelevät niitä ja tulostavat tuloksen.

siihen ongelmaan vastaa seuraava profiloijamme.

Blackfire

Pythonin kaltaiselle erittäin dynaamiselle kielelle useimmat kehittäjät kokevat muistiongelmia käyttöönoton aikana. Tämä aiheuttaa jonkin verran epäselvyyttä siitä, mitä tapahtuu muistin käytölle. Kehittäjät yleensä suorittaa optimointeja, mutta ei ole oikeita työkaluja käyttää.

Blackfire on patentoitu Python-muistiprofiloija (ehkä ensimmäinen. Se käyttää Pythonin muistinhallintaa jokaisen Pythonin osoittaman muistilohkon jäljittämiseen, mukaan lukien C-laajennukset. Blackfire on alalle uusi ja pyrkii ratkomaan asioita muistivuodoissa, kuten:

  • suuret muistissa olevat kohteet, joita ei ole julkaistu
  • referenssisyklit
  • virheellinen viitelaskenta C-laajennuksissa aiheuttaa muistivuotoja
  • äkillisiä muistipiikkejä

näillä käyttötapauksilla Blackfire vakuuttaa käyttäjille, että sillä on hyvin rajalliset yleiskustannukset eikä se vaikuta loppukäyttäjiin, koska se mittaa Python-sovelluksen muistinkulutusta funktiokutsutasolla.

Blackfire Python-muistiprofiloija käyttää pymem_setallocator-sovellusliittymää muistinjakojen jäljittämiseen kuten tracemalloc. Tällä hetkellä Blackfire tukee Python-versioita 3.5 Ja up. Voit vierailla sen sivustolla lisätietoja.

profilointi Retrace

Jos työskentelet Pythonin kanssa, koet jotenkin, ettei se vapauta muistia heti takaisin käyttöjärjestelmään. Siksi, suoritat sen erillisessä prosessissa varmistaa, että muisti vapautuu suorittamisen jälkeen pala koodia. Tämä tapahtuu hyödyllisellä lähestymistavalla, jota kutsutaan ”pieneksi testitapaukseksi.”Tämä prosessi mahdollistaa vain kyseisen muistivuotokoodin ajamisen.

kun käsitellään suuria tietomääriä, käytetään satunnaisesti otettujen tietojen osajoukkoa. Suorita myös muistipainotteisia tehtäviä erillisissä prosesseissa ja lisää debuggereiden avulla viittauksia esineisiin. Kuitenkin, harkita, että käyttämällä keskeytyspisteen debuggeri kuten pdb sallii kaikki objektit luotu ja viitataan manuaalisesti debuggeri pysyy muistiprofiiliin. Tämä johtaa virheelliseen muistivuodon tunteeseen, sillä esineitä ei vapauteta ajoissa. Harkitse myös sellaisten pakettien tutkimista, jotka voivat vuotaa. On olemassa Python-kirjastoja, joissa voi olla muistivuotoja.

nyt tiedät jo, miten Python-muistiprofiloijat toimivat ja kuinka yleisiä muistiongelmia Pythonilla on. Mutta työkalut, kuten Retrace, jossa on keskitetty kirjaus, virheiden seuranta ja koodin profilointi, voivat auttaa sinua diagnosoimaan Python-ongelmia laajemmassa mittakaavassa. Stackifyn Retrace auttaa sinua käsittelemään kaikenlaisia suorituskyvyn sudenkuoppia ja pitämään koodisi käynnissä hyvin.

Aloita 14 päivän ilmainen Retrace-kokeilusi tänään!

Vastaa

Sähköpostiosoitettasi ei julkaista.