Blog: Hvordan debugger man effektivt hukommelses-problemer i Python?

Jeg har kodet en del i Python de sidste mange år samt C/C++. Jeg fik dog et spørgsmål på bordet den anden dag, som er af generel interesse – hvordan debugger man effektivt efter hukommelsesproblemer i Python på en Linux-maskine? Hvis man f.eks. ser at et Python pludselig er gået fra 100 MB til 5 GB hukommelsesforbrug. Jeg vil gerne høre jeres gode ideer til at jage dette.

Havde det været et C/C++ program havde jeg kørt “valgrind –tool=massif PROGRAM” og derefter “ms_print massif.out.*”.Se f.eks. her. Det giver et glimrende billede ind i “hvad/hvor” problemerne stammer fra.

Jeg har ikke til Python fundet et tilsvarende sejt værktøj. Jeg ved ikke om man kan køre Cython på Python-koden, oversætte det hele og derefter “valgrind –tool=massif…”. Det ligger ikke lige til højrebenet, men det er noget jeg vil prøve.

Mht. ren Python-kode så faldt jeg over “Meliae“, som ser interessant ud. Det fungerer glimrende og man kan med minimale ændringer få oversigter over hvilke typer elementer optager hvor meget hvor meget hukommelse. Det er relevant, men ikke godt nok. Jeg savner to ting. Dels at man kan få “snapshots” af hukommelsen over tid, men også hvilke “dicts” er det værste.

Min ven Finn pegede mig til dette link.
Ideen er at indføje “@profile” til de funktioner man mistænker er dårlige og så kører man Python med argument “-m memory_profiler”.
Det er også mere interessant, men det er umiddelbart irriterende at man skal fjerne/indsætte “@profile” i koden alt efter om man vil profilere.

Som testprogram kan f.eks. anvendes

I eksemplet er det nemt af afgøre at my_func2() koster en del, men hvordan gør man det i praksis, når der er 10.000 linier kode?

Har I erfaringer med dette område af Python, så skriv meget gerne om dette nedenfor.

/pto

Posted in computer.

Leave a Reply

Your email address will not be published. Required fields are marked *

You may use these HTML tags and attributes: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>