OVH Cloud OVH Cloud

Liérer 1 maximum de ressources

8 réponses
Avatar
Stéphane L.
Bonjour,

J'ai 1 application avec 1 fenêtre père qui appelle des fenêtres filles.

L'1 de ces fenêtres consomment beaucoup de ressources :
utilisation de nombreux tableaux à plusieurs dimensions.
pour économiser le plus possible de mémoire, je dimensionne la dernière à 0,
et je la redimensionne si je connais la limite haute ou je la redimensionne
en préservant au fur et à mesure si je ne connais pas la limite haute (ca
ralenti, mais ca économise de la mémoire)
sur le closing de cette fenetre, je lance la commande erase de tous les
tableaux, et lance la commande dispose (j'ai essayé aussi dispose(true))
si j'ouvre 1 2e fois cette fenetre, cela fonctionne normalement.
si j'ouvre 1 3e fois, je n'ai plus de mémoire et 1 message out of memory
apparait.


que pouvez vous me conseiller pour consommer moins de mémoire ? et pour
libérer d'avantage de mémoire ?


Merci d'avance.

Cordialement,
Stéphane

8 réponses

Avatar
Stéphane L.
Je viens de faire 1 test et il se passe quelque chose de bizarre.
Je m'explique.
Avant de commencer le test, j'ai compilé mon application (exe de 2.37 mo).
J'ai ensuite éteint quelques secondes le pc pour bien vider la mémoire.
Après reboot, j'ouvre le gestionnaire de taches et je lance l'application
La première petite fenêtre pour me connecter, l'application fait 15 mo en
mémoire.
Une fois connecté, j'arrive sur l'écran principal, j'en suis à 28 mo.
Je lance la commande qui ouvre la fenêtre gourmande en ressources, j'en suis
à 173 mo.
Je ferme cette fenêtre, l'application prend 41 mo (soit 13 mo n'ont pas été
libérés sur les 145 mo)
J'ouvre 1 deuxième fois la même fenêtre, j'en suis de nouveau à 173 mo (pas
plus... apparement les 13 mo ressources non libérées sont écrasées)
Je referme la fenetre, et l'application reste bizarrement à 173 mo, aucune
ressource n'est libérée
Je rouvre 1 troisième fois cette même fenêtre, et 1 erreur mémoire apparait
avant l'affichage de la fenêtre, mais l'application etait à 175 mo au moment
de l'erreur.

Pourtant, mon pc à 1 giga de mémoire vive.

Merci d'avance de votre aide

Cordialement,
Stéphane


"Stéphane L." a écrit dans le
message de news:
Bonjour,

J'ai 1 application avec 1 fenêtre père qui appelle des fenêtres filles.

L'1 de ces fenêtres consomment beaucoup de ressources :
utilisation de nombreux tableaux à plusieurs dimensions.
pour économiser le plus possible de mémoire, je dimensionne la dernière à
0, et je la redimensionne si je connais la limite haute ou je la
redimensionne en préservant au fur et à mesure si je ne connais pas la
limite haute (ca ralenti, mais ca économise de la mémoire)
sur le closing de cette fenetre, je lance la commande erase de tous les
tableaux, et lance la commande dispose (j'ai essayé aussi dispose(true))
si j'ouvre 1 2e fois cette fenetre, cela fonctionne normalement.
si j'ouvre 1 3e fois, je n'ai plus de mémoire et 1 message out of memory
apparait.


que pouvez vous me conseiller pour consommer moins de mémoire ? et pour
libérer d'avantage de mémoire ?


Merci d'avance.

Cordialement,
Stéphane



Avatar
Stéphane L.
Personne ne peut m'aider ? svp


Stéphane


"Stéphane L." a écrit dans le
message de news: %
Je viens de faire 1 test et il se passe quelque chose de bizarre.
Je m'explique.
Avant de commencer le test, j'ai compilé mon application (exe de 2.37 mo).
J'ai ensuite éteint quelques secondes le pc pour bien vider la mémoire.
Après reboot, j'ouvre le gestionnaire de taches et je lance l'application
La première petite fenêtre pour me connecter, l'application fait 15 mo en
mémoire.
Une fois connecté, j'arrive sur l'écran principal, j'en suis à 28 mo.
Je lance la commande qui ouvre la fenêtre gourmande en ressources, j'en
suis à 173 mo.
Je ferme cette fenêtre, l'application prend 41 mo (soit 13 mo n'ont pas
été libérés sur les 145 mo)
J'ouvre 1 deuxième fois la même fenêtre, j'en suis de nouveau à 173 mo
(pas plus... apparement les 13 mo ressources non libérées sont écrasées)
Je referme la fenetre, et l'application reste bizarrement à 173 mo, aucune
ressource n'est libérée
Je rouvre 1 troisième fois cette même fenêtre, et 1 erreur mémoire
apparait avant l'affichage de la fenêtre, mais l'application etait à 175
mo au moment de l'erreur.

Pourtant, mon pc à 1 giga de mémoire vive.

Merci d'avance de votre aide

Cordialement,
Stéphane


"Stéphane L." a écrit dans
le message de news:
Bonjour,

J'ai 1 application avec 1 fenêtre père qui appelle des fenêtres filles.

L'1 de ces fenêtres consomment beaucoup de ressources :
utilisation de nombreux tableaux à plusieurs dimensions.
pour économiser le plus possible de mémoire, je dimensionne la dernière à
0, et je la redimensionne si je connais la limite haute ou je la
redimensionne en préservant au fur et à mesure si je ne connais pas la
limite haute (ca ralenti, mais ca économise de la mémoire)
sur le closing de cette fenetre, je lance la commande erase de tous les
tableaux, et lance la commande dispose (j'ai essayé aussi dispose(true))
si j'ouvre 1 2e fois cette fenetre, cela fonctionne normalement.
si j'ouvre 1 3e fois, je n'ai plus de mémoire et 1 message out of memory
apparait.


que pouvez vous me conseiller pour consommer moins de mémoire ? et pour
libérer d'avantage de mémoire ?


Merci d'avance.

Cordialement,
Stéphane







Avatar
Mehdi
On Fri, 22 Jul 2005 19:29:26 +0200, Stéphane L. wrote:

Personne ne peut m'aider ? svp



Je ne peux pas vraiment t'aider, tout ce que je peux te dire qu'il est
inutile d'utiliser le gestionnaire de taches de Windows pour surveiller
l'utilisation mémoire de ton appli. Ce que tu vois dans le gestionnaire de
taches est la mémoire utilisé par ton appli plus plein d'autre choses. Donc
meme si il affiche 120 Mo, cela ne veux pas dire que ton appli utilise 120
Mo de mémoire. Voir cet article par exemple qui explique un peu ce qui se
passe:
http://getdotnetco.web101.discountasp.net/GdncStore/free/Articles/The%20Memory%20Mystery.htm

Utilise perfom a la place (menu Start -> Run... -> perfmon). Et en
particulier le compteur .NET CLR Memory. Et utilise un profiler pour voir
en détails ce qui coince dans ton code.
Avatar
Oleane
Pour forcer le Garbage Collector à libérer la mémoire inutilisée par le .NET
Framework, on peut appeller la méthode Collect de la classe GC.

System.GC.Collect()


http://plasserre.developpez.com/vd1-1.htm

Je crois qu'il n'est pas trop recommandée par Microsoft d'utiliser GC, il
faut etre prudent
GC on peut aussi lui donner des paramettres Int (GC.Collect(5000))
Avatar
Stéphane L.
Merci.

J'ai pris tous les compteurs de la mémoire CLR .NET, et à chaque étape de
mon test précédent, les valeurs changeaient.
Par contre, au moment de la 2e fermeture, strictement aucun compteur ne
changeait de valeur.

Por qué ?

No sé :x.


Stéphane



"Mehdi" a écrit dans le message de news:
10fl73gl2e7lp$
On Fri, 22 Jul 2005 19:29:26 +0200, Stéphane L. wrote:

Personne ne peut m'aider ? svp



Je ne peux pas vraiment t'aider, tout ce que je peux te dire qu'il est
inutile d'utiliser le gestionnaire de taches de Windows pour surveiller
l'utilisation mémoire de ton appli. Ce que tu vois dans le gestionnaire de
taches est la mémoire utilisé par ton appli plus plein d'autre choses.
Donc
meme si il affiche 120 Mo, cela ne veux pas dire que ton appli utilise 120
Mo de mémoire. Voir cet article par exemple qui explique un peu ce qui se
passe:
http://getdotnetco.web101.discountasp.net/GdncStore/free/Articles/The%20Memory%20Mystery.htm

Utilise perfom a la place (menu Start -> Run... -> perfmon). Et en
particulier le compteur .NET CLR Memory. Et utilise un profiler pour voir
en détails ce qui coince dans ton code.


Avatar
Stéphane L.
Merco Orleane,

Je viens d'essayer cette commande magique, et maintenant, cela fonctionne
tout le temps.


Stéphane.


"Oleane" a écrit dans le message de news:
dc24cq$5cg$
Pour forcer le Garbage Collector à libérer la mémoire inutilisée par le
.NET Framework, on peut appeller la méthode Collect de la classe GC.

System.GC.Collect()


http://plasserre.developpez.com/vd1-1.htm

Je crois qu'il n'est pas trop recommandée par Microsoft d'utiliser GC, il
faut etre prudent
GC on peut aussi lui donner des paramettres Int (GC.Collect(5000))



Avatar
Mehdi
On Mon, 25 Jul 2005 12:16:06 +0200, Stéphane L. wrote:

Merco Orleane,

Je viens d'essayer cette commande magique, et maintenant, cela fonctionne
tout le temps.



Je ne suis pas un spécialiste donc je ne vais certainement pas de te dire
quoi faire et ne pas faire mais je pense qu'il est important de comprendre
comment marche le GC et ne surtout pas croire que GC.Collect est une
commande "magique" a appeler au petit bonheur la chance quand quelque chose
ne tourne pas rond. Il y a des cas (et ton cas en fait peut etre parti) ou
appeler GC.Collect peut peut-etre etre justifié. Mais en général, il vaut
mieux d'abord comprendre pourquoi la mémoire pose probleme et voir si il
n'y a pas quelque chose d'autre a faire (appeler Dispose sur tous les
objects implémentant IDisposable par exemple et implémenter cette interface
dans ses propres objects si ils contiennent des ressources a libérer a la
fin de leur boulot...). Un peu de lecture assez intéressante:

http://codebetter.com/blogs/steve.hebert/archive/2005/07/21/129634.aspx

http://blogs.msdn.com/ricom/archive/2003/12/02/40780.aspx

http://blogs.msdn.com/ricom/archive/2004/11/29/271829.aspx
Avatar
Stéphane L.
aie ... ca fait trop pour mon anglais ca :/

"Mehdi" a écrit dans le message de news:
dn7wht0qjf3x.1iuxpr2l2d04m$
On Mon, 25 Jul 2005 12:16:06 +0200, Stéphane L. wrote:

Merco Orleane,

Je viens d'essayer cette commande magique, et maintenant, cela fonctionne
tout le temps.



Je ne suis pas un spécialiste donc je ne vais certainement pas de te dire
quoi faire et ne pas faire mais je pense qu'il est important de comprendre
comment marche le GC et ne surtout pas croire que GC.Collect est une
commande "magique" a appeler au petit bonheur la chance quand quelque
chose
ne tourne pas rond. Il y a des cas (et ton cas en fait peut etre parti) ou
appeler GC.Collect peut peut-etre etre justifié. Mais en général, il vaut
mieux d'abord comprendre pourquoi la mémoire pose probleme et voir si il
n'y a pas quelque chose d'autre a faire (appeler Dispose sur tous les
objects implémentant IDisposable par exemple et implémenter cette
interface
dans ses propres objects si ils contiennent des ressources a libérer a la
fin de leur boulot...). Un peu de lecture assez intéressante:

http://codebetter.com/blogs/steve.hebert/archive/2005/07/21/129634.aspx

http://blogs.msdn.com/ricom/archive/2003/12/02/40780.aspx

http://blogs.msdn.com/ricom/archive/2004/11/29/271829.aspx