|
Trouver une ressource
Vous ne trouvez pas de réponse à votre problème ? Alors posez la question dans le forum. Souvenez-vous qu'il n'y a jamais de question bête, mais rester dans l'ignorance parce que l'on n'ose pas poser une question, ça c'est une erreur !
Sujet : Comment optimiser la mémoire [ Divers / Aide et documentation ] (jnmchl)
Informations & options pour cette discussion
lundi 23 juin 2008 à 21:51:47 |
Comment optimiser la mémoire

jnmchl
|
Bonjour, J'ai une application qui semble nécessiter beaucoup de mémoire : je pense celà car chez moi j'ai 1Go de RAM et il tourne sans problème alors que au travail mes collègues qui n'ont que 256 Mo ça rame énormément. Alors plutôt que d'appeller au secours à tous vents, je me pose quelques questions où vous pourriez me donner votre avis ou conseils. Voilà ce que j'observe : * Mon appli fait 1,4 Mo fichier .exe c'est surtout parce qu'il y a beaucoup de form (une quizaine). Ces forms se chargent en mémoire alors que certaines ne sont utilisées que très rarement. Ne peut-on pas économiser cette mémoire en ne chargeant ces forms en mémoire qu'au moment de leur appel et peut-on restituer la mémoire après fermeture ? * L'appli utilise beaucoup de tableaux (array) la plupart sont dynamiques et ne servent que ponctuellement, est-ce qu'un setlength(MonTableau,0); suffit à libérer cette mémoire ? * Si j'en crois le gestionnaire de tâches : plus j'utilise mon appli et plus sa mémoire utilisée augmente : au démarrage : 7Mo puis ça peut monter progressivement jusqu'à 70Mo, si je réduis dans la barre des tâches 500ko seulement, si je réaggrandis je repars à 7Mo, y'a-t-il une fonction qui permette de revenir à 7Mo règulièrement ? Merci votre aide, et si vous pensez que je peux avoir d'autres gouffres à mémoire, merci d'émettre vos hypothèses. Jean-Michel
|
|
|
mardi 24 juin 2008 à 09:51:58 |
Re : Comment optimiser la mémoire

florenth
|
Réponse acceptée !
Salut ! Pour les forms chargées dynamiquement, tu peux les changer dans Projet>Options>Fiches. Il faut les changer de colonne pour qu'elles ne soient plus crées par Delphi (ça modifie en fait le code du .dpr) Après, pour t'en servir, tu peux faire : 1: si c'est une fiche modale : F := TMyModalForm.Create(nil); try F.ShowModal; // traitement des données reçues ici finally F.Free; end; 2: sinon: F := TMyForm.Create(Application); F.Show; et dans TMyForm tu mets dans l'évènement OnClose: Action := caFree; Pour les tableaux, normalement ça suffit. Tu peux aussi utiliser Finalize(Array). Pour l'histoire de la variation énorme de la consommation de mémoire: c'est que tu dois allouer pas mal de trucs que tu ne libères pas au moment opportun (voire que tu ne libères pas !). Exemple commun: les objets GDI comme GetDC qui doit être suivi d'un ReleaseDC,... De plus si tu réduits dnas la barre des tâches il n'est pa simpossible que Windows transfère la RAM dans la mémoire d'échange sur le disque dur, ce qui te donnerait l'impression que ton application consomme moins alors que ce n'est pas le cas. Sinon, tu peux utiliser MemCheck (google) pour vérifier qu'a la fermeture de ton application tu n'as pas oublié de libérer des variables, des objets. Si c'est le cas, une inspection minutieuse s'impose ! Voila, tu as déjà la base ici. A+ Flo Ressources Delphi, sources, tutoriaux, actu, ...: www.mx-dev.net [ Lien ]
|
|
|
vendredi 27 juin 2008 à 17:23:19 |
Re : Comment optimiser la mémoire

christophedlr
|
Pour compléter Florenth, pour les variables ce que tu peux faire suivant tes besoins bien sur, c'est en utiliser moins mais plus souvent.
Par exemple, si tu dois lire 4 informations différentes, si tu t'en sert de suite, au lieux d'allouer 4 variables, tu en alloue qu'une puis tu t'en sert, tu libère et alloue (ou realloue au lieu de libérer), puis tu t'en sert de nouveau pour une fois fini les 4 fois, la libérer.
Maintenant cela dépend des besoins, des fois on peut le faire des fois ce serait trop complexe de ne pas en utiliser plusieurs. Dans le cas où en utiliser qu'une plutôt que plus, cela réduit la mémoire utilisé vu qu'il faut allouer pour une seule, ensuite c'est toi qui alloue la taille requise et qui libère.
Par contre, effectivement comme dit Florenth, faut pas oublier de libérer quand tu t'en sert plus, cela réduit la RAM utilisé. Je te souhaite de réussir ton optimisation ;)
|
|
|
vendredi 27 juin 2008 à 17:28:50 |
Re : Comment optimiser la mémoire

florenth
|
"c'est en utiliser moins mais plus souvent." Je ne sais pas à quel type de variable tu fais allusion mais j'en profite pour poser une petite question: procedure Example; var X, Y, FileNumber, TileNumber: Integer; begin for X := 0 to [...] do Bla1(X); for Y := 0 to [...] do Bla2(Y); for FileNumber := 0 to [...] do Bla3(FileNumber); for TileNumber := 0 to [...] do Bla4(TileNumber); end; On voit bien que les 4 variables Integer ne servent pas toutes en même temps et qu'on pourrait n'en utiliser qu'une seule. Est-ce que pour autant il vaut mieux en déclarer une seule ? Réponse: non ! Car Delphi et son super compilateur remarque très bien qu'on n'utilise X uniquement à la première ligne, etc... Et il va en réalité allouer une seule variable ! C'es-y pas magique ça ? Ressources Delphi, sources, tutoriaux, actu, ...: www.mx-dev.net [ Lien ]
|
|
|
vendredi 27 juin 2008 à 17:31:26 |
Re : Comment optimiser la mémoire

florenth
|
Bon, j'ai oublié le point important de l'histoire: Tout ça fait gagner de la lisibilité au code et limite les bugs. En effet, quand on écrit TileNumber au lieu de I (nom courant de la variable de boucle) on sait exactement à quoi on fait référence. Voila, c'était le message du jour. [ Lien ]
|
|
|
samedi 28 juin 2008 à 11:02:16 |
Re : Comment optimiser la mémoire

jnmchl
|
Merci pour vos réponses qui contribuent et élargisse mon domaine de connaissance. Je vois en étudiant mon code que j'ai fais des erreurs de jeunesse (bien que je sois encore assez jeune ...). ex : je déclarais un string qui ne prenait qu'une valeur 'X' ou rien '' : pour fair des tests if s='X' then ... remplacé de fait par un booléen.
A ce sujet, si j'ai un ordre d'idée de la longueur d'une chaine entre 4 et 12 caractères, celà fait-il gagner de la mémoire (et/ou du temps) de déclarer s:string[12]; plutôt que s:string; ? (car sizeof ne me parait pas cohérent).
Mon thème est vaste ... merci pour les contributions.
Jean-Michel
|
|
|
samedi 28 juin 2008 à 11:14:57 |
Re : Comment optimiser la mémoire

christophedlr
|
Pour te répondre je serais tenté de dire que oui, dans certains langages (je sais pas si c'est le cas du Delphi), la variable quand elle est initialisé dans la mémoire, prend moins de place en définissant un nombre de cases maximum que ne rien spécifié, mais je n'en suis pas sur.
|
|
|
samedi 28 juin 2008 à 11:35:17 |
Re : Comment optimiser la mémoire

florenth
|
Mouais, ça dépend. Les strings, c'est très spécial - ça doit bien être le type le plus difficile à maîtriser.
Pour ma part, je dirai que "string" tout court convient à peu près partout. Sa taille est automatiquement ajustée, les copies (S2 := S1) ne sont que des copies de pointeur, infiniment plus rapide que si S1 et S2 étaient de string[12].
Par contre, si tu sais calculer la taille que doit faire ta chaîne pour lui faire un traitement, il vaut mieux allouer d'un coup la mémoire.
Exemple:
function MyUpperCase(const S: string): string; var I: Integer; begin for I := 1 to Length(S) do Result := Result + UpCase(S[I]); end;
est infiniment plus lent que :
function MyUpperCase(const S: string): string; var I: Integer; begin SetLength(Result, Length(S)); for I := 1 to Length(S) do Result[I] := UpCase(S[I]); end;
Et c'est logique, car l'opérateur "+" (concaténation de chaînes) est très gourmand en temps et en mémoire ! Mais très pratique aussi dans certaines circonstances.
Bref, faut bien comprendre les rouages internes et surtout, tester et retester...
|
|
|
Cette discussion est classé dans : appli, mo, mémoire, optimiser, 7mo
Répondre à ce message
Sujets en rapport avec ce message
Décharger une DLL de la mémoire [ par EricDD ]
Bonjour,Je travaille avec une appli ecommerce en asp, qui fait appel à une DLL Delphi, enregistrée comme composant COM+ : Je n'ai pas d'exe.Je suis a
exécuter 2 appli console en mm tps [ par mounjetado ]
bonjour,j'ai deux appli console que je souhaite faire communiquer via des événements (mais si vous avez mieux à me proposer...), pour accéder tour à t
partager de la mémoire [ par mounjetado ]
bonjour,existe-t-il un cours complet et détaillé, avec des exemples, sur l'utilisation des objets de synchronisation , tels que mutex, sémaphores, sec
Caractère Arabe [ par nci ]
Bonjour Tt le monde,Je developpe une Appli avec Delphi 2005 + SQL Serveur 2000. Certaines de mes tables contiennent des caractères arabes.Dans SQL ser
Lecture et écriture en mémoire [ par PHIL63 ]
Bonjour à tous et à toutes,Mon souci :J'ai des adresses mémoire pour un logiciel donné et j'aurais besoin d'accèder directement à ces zones mémoire en
Acces directe à la mémoire d'une carte SD [ par godardth ]
Bonjour,Voici mon problème : je développe une petite application electronique qui utilise une carte SD pour stocker un fichier son (format wave). Ce f
vista - controle d'utilisateur [ par simonpelloquin ]
Bonjour,Sur Vista, je rencontre des problèmes avec une appli programmée sous delphi5. Le problème est lié à la fonctionnalité de contrôle de compte ut
Lire du HTML dans une appli console [ par XBOX116_4ever ]
Serait-il possible de pouvoir lire du HTML à partir d'un programme console. En fait, sur mon serveur, une application me retourne une page blanche ave
Redemmarer mon application automatiquement [ par BernieNoel68 ]
Bonjour a tous, Je suis a la recherche d'une solution permettant à mon application de s'arreter et de se relancer automatiquement.En gros j'ai une app
numéro de série de USB flash mémoire [ par med1112 ]
salut à tous,y a t il un moyen pour obtenir le numéro de série de USB flash mémoire, j'utilise Delphi7.merci
Livres en rapport
|
Téléchargements
Logiciels à télécharger sur le même thème :
Comparez les prix Nouvelle version

HTC Touch HD
Entre 25€ et 605€
|