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
> 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
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...
> 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...
pour le reste, si tu veux je t'envois mon script..
> 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
> 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...
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
> 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
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 ?
> 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
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...
>> 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
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
> 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
>> 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...
> 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...
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
> 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.
>> 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.
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