Google Groups no longer supports new Usenet posts or subscriptions. Historical content remains viewable.
Dismiss

comment reduire l'utilisation de la ram par les applis python

234 views
Skip to first unread message

Seo-Kyeong KIM-BOUDOT

unread,
Apr 17, 2004, 2:45:00 PM4/17/04
to
Bonjour,

J'ai un petit programme en python qui tourne sur une machine linux, j'ai
remarqué que chaque pid consomme environ 10 mo de ram ! (et pour chaque
thread lancé dans mon appli, un pid est créé...) C'est énorme, comment
puis-je optimiser tout ca ?

D'avance merci pour vos reponses :)

fb


Wilk

unread,
Apr 17, 2004, 3:09:57 PM4/17/04
to
"Seo-Kyeong KIM-BOUDOT" <boudo...@wanadoo.fr> writes:

> Bonjour,
>
> J'ai un petit programme en python qui tourne sur une machine linux, j'ai
> remarqué que chaque pid consomme environ 10 mo de ram ! (et pour chaque
> thread lancé dans mon appli, un pid est créé...) C'est énorme, comment
> puis-je optimiser tout ca ?

c'est une illusion d'optique, ce que tu vois affiché n'est pas la
consomation réelle, d'une part la mémoire n'est pas forcément libérée
même si elle est disponible (voir messages plus haut), d'autre part pour
chaque thread il réaffiche la mémoire totale.

--
Wilk - http://flibuste.net

Seo-Kyeong KIM-BOUDOT

unread,
Apr 17, 2004, 3:33:30 PM4/17/04
to
vas expliquer ca a mon hebergeur lol :)

en tous cas ca voudrait donc dire que mon programme de 100 lignes consomme
10 mo de ram.
je peux optimiser ca ? (en incluant des modules, j'ai le souvenir d'un truc
fait par un mec du mit qui boostait la vitesse d'execution d'un script
python par exemple, dans le meme esprit)

fb

"Wilk" <wilk...@OUTflibuste.net> a écrit dans le message news:
874qri7...@blakie.riol...

Wilk

unread,
Apr 17, 2004, 4:13:53 PM4/17/04
to
"Seo-Kyeong KIM-BOUDOT" <boudo...@wanadoo.fr> writes:

> vas expliquer ca a mon hebergeur lol :)

bha, normalement ça devrait être des spécialistes en la matière...
si tu as un accès ssh, fait un ps aux, tu verras que c'est pareil avec
apache, named, mysql...

>
> en tous cas ca voudrait donc dire que mon programme de 100 lignes consomme
> 10 mo de ram.

fait voir

> je peux optimiser ca ? (en incluant des modules, j'ai le souvenir d'un truc
> fait par un mec du mit qui boostait la vitesse d'execution d'un script
> python par exemple, dans le meme esprit)

tout dépend de ton script, le nombre de lignes ne veux pas dire grand
chose...
tu parles peut-être de psyco ? ça optimise la vitesse mais pas la mémoire...

Seo-Kyeong KIM-BOUDOT

unread,
Apr 17, 2004, 4:55:39 PM4/17/04
to
ouais je parlais de psyco..

pour le reste, si tu veux je t'envois mon script..


Benoît Dejean

unread,
Apr 17, 2004, 10:15:10 PM4/17/04
to
Le Sat, 17 Apr 2004 22:55:39 +0200, Seo-Kyeong KIM-BOUDOT a écrit :

> ouais je parlais de psyco..

ben avec ta consommation mémoire va encore augmenter

> pour le reste, si tu veux je t'envois mon script..

je vois pas le problème : python est un interpréteur, il y a un surcout
minime à l'exécution, par rapport aux milliers de lignes C que tu
devrais te taper pour avoir un programmer correcte équivalent. je crois
que tu n'a vraiment pas à t'inquiéter pour ça ... c'est un petit
surcout inhérent et toi tu nous fais un peu d'avarice :D

Wilk

unread,
Apr 18, 2004, 5:16:18 AM4/18/04
to
"Seo-Kyeong KIM-BOUDOT" <boudo...@wanadoo.fr> writes:

> ouais je parlais de psyco..
>
> pour le reste, si tu veux je t'envois mon script..

poste ici la partie critique
et regarde déjà la mémoire occupée par ton script par rapport à la
mémoire occupée en lançant l'interpréteur seul.

mais 10mo c'est pas énorme, j'ai une appli qui dépasse les 100mo et je
n'arrive toujours pas à la freiner :-((( pourtant gc.collect() et
gc.garbage ne donnent rien...

Michel Claveau/Hamster

unread,
Apr 18, 2004, 2:34:27 PM4/18/04
to
Bonjour !

Pareil chez moi ; 10 Mo pour l'interpréteur (et 10/13 Mo pour une appli). Le
problème, c'et que j'ai fait un serveur COM, en Python. Et, chaque fois
qu'un autre logiciel appelle une fonction du serveur, une instance est
créée. résultat, chez les clients, j'ai souvent entre 30 et 50 Mo qui sont
consommés "en attente".

Mais je ne vois pas trop comment faire autrement, et, finalement, ça ne me
gène pas trop.

@-salutations
--
Michel Claveau


Benoît Dejean

unread,
Apr 18, 2004, 7:34:23 PM4/18/04
to
Le Sun, 18 Apr 2004 11:16:18 +0200, Wilk a écrit :

> mais 10mo c'est pas énorme, j'ai une appli qui dépasse les 100mo et je
> n'arrive toujours pas à la freiner :-((( pourtant gc.collect() et
> gc.garbage ne donnent rien...

c'est que tu as des fuites voilà tout

Wilk

unread,
Apr 19, 2004, 3:36:40 AM4/19/04
to
Benoît Dejean <bnetN...@ifrance.com> writes:

je suppute une fuite au niveau de mysql, mais vu que gc.collect() renvoi
zéro et gc.garbage est vide, j'en déduis que mes objets sont bien libérés...

Que (et où) puis-je chercher d'autre ?

Benoît Dejean

unread,
Apr 19, 2004, 4:29:56 PM4/19/04
to
Le Mon, 19 Apr 2004 09:36:40 +0200, Wilk a écrit :

> je suppute une fuite au niveau de mysql, mais vu que gc.collect() renvoi
> zéro et gc.garbage est vide, j'en déduis que mes objets sont bien libérés...
>
> Que (et où) puis-je chercher d'autre ?

essaie le tralala

gc.set_debug(gc.DEBUG_LEAK)

appeler gc.collect() ne sert à pas grand chose sauf à consommer du temps
CPU, je le sais d'expérience.
à toi de voir si tu n'a pas non plus des cycles. tu peux aussi être
victime de fuites d'une de tes bibliothèques en C pour lesquelles tu as
fait un wrapper. j'ai aussi de mauvaises expériences avec :D

Wilk

unread,
Apr 19, 2004, 5:22:14 PM4/19/04
to
Benoît Dejean <bnetN...@ifrance.com> writes:

Quand je regarde gc.get_objects(), je ne vois pratiquement aucun de mes
objets, j'en déduit qu'ils sont donc bien tous libérés et qu'il n'y a
pas de problèmes de références...

Benoît Dejean

unread,
Apr 21, 2004, 7:12:42 PM4/21/04
to
Le Mon, 19 Apr 2004 23:22:14 +0200, Wilk a écrit :

>> gc.set_debug(gc.DEBUG_LEAK)

fais ça

> Quand je regarde gc.get_objects(), je ne vois pratiquement aucun de mes
> objets, j'en déduit qu'ils sont donc bien tous libérés et qu'il n'y a
> pas de problèmes de références...

regarde dans gc.garbage

Wilk

unread,
Apr 22, 2004, 3:21:51 AM4/22/04
to
Benoît Dejean <bnetN...@ifrance.com> writes:

gc.garbage est vide...

Benoît Dejean

unread,
Apr 22, 2004, 7:10:33 AM4/22/04
to
Le Thu, 22 Apr 2004 09:21:51 +0200, Wilk a écrit :
>> regarde dans gc.garbage
>
> gc.garbage est vide...
donc a priori t'as soit un problème d'algorithme qui utilise trop
d'objets, soit si tu reposes sur des modules C fait à la main, des fuites
là dedans.

qu'est-ce que c'est comme type d'applications ?

PS:
pour la petite histoire, la dernière application sur laquelle j'ai
constatée une fuite
http://dejean.benoit.free.fr/code/gdesklets/leak/21dec03/
http://dejean.benoit.free.fr/code/gdesklets/leak/21dec03/generation3.png

Wilk

unread,
Apr 22, 2004, 7:43:45 AM4/22/04
to
Benoît Dejean <bnetN...@ifrance.com> writes:

> Le Thu, 22 Apr 2004 09:21:51 +0200, Wilk a écrit :
>>> regarde dans gc.garbage
>>
>> gc.garbage est vide...
> donc a priori t'as soit un problème d'algorithme qui utilise trop
> d'objets, soit si tu reposes sur des modules C fait à la main, des fuites
> là dedans.

J'utilise beaucoup d'objets, mais ils sont bien libérés
normalement... Et pas de modules maison en C.

>
> qu'est-ce que c'est comme type d'applications ?

Un jeu de scrabble en ligne
http://seps.flibuste.net

Benoît Dejean

unread,
Apr 22, 2004, 12:57:17 PM4/22/04
to
Le Thu, 22 Apr 2004 13:43:45 +0200, Wilk a écrit :

>> qu'est-ce que c'est comme type d'applications ?
>
> Un jeu de scrabble en ligne
> http://seps.flibuste.net

avant de mettre les mains dedans pour trouver ce qui consomme ... est-ce
que c'est excessif comme consommation ?

est-ce que tu as pensé à des petites améliorations simple ou choses
telles que le Fly Weight Pattern ?

encore une petite histoire : dans une application graphique, j'avais
défini 2/3 object Couleur par défaut et je me suis rendu compte après
coup que je crée plusieurs centaines d'instances par seconde pour rien
(une Couleur étant immuable)

rien que le fait de passer de

return Couleur('#valeur par défaut')

à

return Couleur.Couleur_par_defaut

ça m'a permis de petites économies, avec ça j'ai nettement moins
pollué ma ram...

Wilk

unread,
Apr 22, 2004, 3:22:51 PM4/22/04
to
Benoît Dejean <bnetN...@ifrance.com> writes:

> Le Thu, 22 Apr 2004 13:43:45 +0200, Wilk a écrit :
>
>>> qu'est-ce que c'est comme type d'applications ?
>>
>> Un jeu de scrabble en ligne
>> http://seps.flibuste.net
>
> avant de mettre les mains dedans pour trouver ce qui consomme ... est-ce
> que c'est excessif comme consommation ?

Ca peut dépasser les 100 méga au bout de quelques jours... Mais j'ai un
script qui surveille et relance le bouzin au cas où, c'est prévu pour
(être relancé) donc pas forcément grave.

>
> est-ce que tu as pensé à des petites améliorations simple ou choses
> telles que le Fly Weight Pattern ?

Non, pas encore car ce qui m'embête surtout maintenant c'est de ne pas
trouver où est l'occupation mémoire.

>
> encore une petite histoire : dans une application graphique, j'avais
> défini 2/3 object Couleur par défaut et je me suis rendu compte après
> coup que je crée plusieurs centaines d'instances par seconde pour rien
> (une Couleur étant immuable)
>
> rien que le fait de passer de
>
> return Couleur('#valeur par défaut')
>
> à
>
> return Couleur.Couleur_par_defaut
>
> ça m'a permis de petites économies, avec ça j'ai nettement moins
> pollué ma ram...
>

c'est peut-être des trucs comme ça effectivement...

Yermat

unread,
Apr 22, 2004, 3:55:55 PM4/22/04
to
Wilk a écrit :

Vous n'êtes même pas obligé de réecrire votre code...
Voir la méthode __new__ du code suivant :
http://www.python.org/cgi-bin/moinmoin/EnumerationProgramming

--
Cordialement,
Yermat

Benoît Dejean

unread,
Apr 22, 2004, 5:34:39 PM4/22/04
to
Le Thu, 22 Apr 2004 21:55:55 +0200, Yermat a écrit :

> http://www.python.org/cgi-bin/moinmoin/EnumerationProgramming
c'est gentil tout ça, mais il faut lire le thread en entier pour
comprendre qu'on ne parle pas du tout de ça.

Benoît Dejean

unread,
Apr 22, 2004, 5:36:35 PM4/22/04
to
Le Thu, 22 Apr 2004 21:22:51 +0200, Wilk a écrit :

>> avant de mettre les mains dedans pour trouver ce qui consomme ... est-ce
>> que c'est excessif comme consommation ?
>
> Ca peut dépasser les 100 méga au bout de quelques jours... Mais j'ai un
> script qui surveille et relance le bouzin au cas où, c'est prévu pour
> (être relancé) donc pas forcément grave.

mouef, c'est sans doute que tu as quelque chose qui garde des références
sur des objets inutilisés ... on peut pas exclure une fuite d'un toolkit
en dessous, mais ça me parait moins probable.


Yermat

unread,
Apr 25, 2004, 6:04:46 AM4/25/04
to
Benoît Dejean a écrit :

Merci mais je sais encore lire !
Votre problème si j'ai bien compris est que vous avez un code existant :


return Couleur('#valeur par défaut')

Or au lieu de créer un nouvel objet, vous aimeriez plutôt réutiliser un
objet déjà existant. Je dis donc qu'il ne sert à rien de modifier vos
sources pour arriver à :
return Couleur.Couleur_par_defaut

Mais qu'il suffit de créer une méthode __new__ adaptée pour avoir le
même effet... Ce qui est la technique utilisée dans le lien que j'ai
envoyé même s'il est utilisé dans un autre contexte !

--
Cordialement,
Yermat

0 new messages