Gestion de la mémoire

cs_laurentl2000 Messages postés 33 Date d'inscription samedi 22 février 2003 Statut Membre Dernière intervention 9 novembre 2003 - 22 juil. 2003 à 12:51
cs_damrod Messages postés 7 Date d'inscription vendredi 12 mars 2004 Statut Membre Dernière intervention 8 octobre 2004 - 15 sept. 2004 à 17:22
Bonjour,

J'ai créé un programme qui exécute de très longues boucles... Seulement, après un certain temps d'exécution, un message EOutOfMemory ("Out of memory") apparait.

Quelqu'un pourrait-il m'aider dans l'utilisation de la gestion de la mémoire utilisée ? Comment "vider" la mémoire que le logiciel a requis alors qu'elle n'est plus utilisée ? Et comment localiser la partie de la mémoire concernée ?

Faut-il employer sysFreeMem ? Et comment ?

Si quelqu'un a une info sur la gestion de la mémoire ou une éventuelle réponse à une de mes questions, cela m'intéresse !

Merci ! ;-)

Trash

12 réponses

sablor Messages postés 58 Date d'inscription jeudi 19 décembre 2002 Statut Membre Dernière intervention 1 octobre 2004
22 juil. 2003 à 13:02
Deja as tu verifier dans ta boucle que tu liberes bien la memoire des objets dont tu n'as plus besoin...Pour liberer la memoire des objets qui ne sont plus utilier il faut utiliser la fonction Free : MyObject.Free;

Pour chercher a quel endroit tu a le probleme tu peux essayer avec MemCheck(unite a mettre et a configurer dans ton projet) ou bien avec le logiciel MemorySleuth de TurboPower, ou encore BoundChecker...

C'est quand meme bizarre ton truc... Tu As combien de memoire???

Sablor
0
cs_laurentl2000 Messages postés 33 Date d'inscription samedi 22 février 2003 Statut Membre Dernière intervention 9 novembre 2003
22 juil. 2003 à 14:21
La méthode Free supprime l'objet concerné de la mémoire... Mais je réemploie tous les objets dans les boucles suivantes, je ne peux donc pas les supprimer...

Je vais tester les logiciels que tu me proposes...

Pour info technique, j'ai une barrette SDRAM PC-133 256Mo...

Bien à toi,

Trash
0
sablor Messages postés 58 Date d'inscription jeudi 19 décembre 2002 Statut Membre Dernière intervention 1 octobre 2004
22 juil. 2003 à 14:36
Tu reemploies les objets au fur et à mesure mais comment avec 256 Mo de RAM tu peux tout remplir ...

Si tu as besoin d'un coup de main donne un peu plus d'explication sur ton algo et l'allocation de tes objets...
Je pense que tu as besoin d'optimiser l'utilisation de tes objets!

A+
Sablor
0
cs_laurentl2000 Messages postés 33 Date d'inscription samedi 22 février 2003 Statut Membre Dernière intervention 9 novembre 2003
22 juil. 2003 à 15:11
Voici la partie de mon code source contenant les boucles qui posent problème... Cela te sera sûrement utile de savoir que c'est un programme de recherche brute force d'une chaine chiffrée (txtCasseurEntree)...

var
boucle: integer;
a: integer;
b: integer;
c: integer;
d: integer;
e: integer;
f: integer;
g: integer;
h: integer;
i: integer;
j: integer;
k: integer;
l: integer;
m: integer;
n: integer;
o: integer;
valeura: integer;
valeurb: integer;
valeurc: integer;
valeurd: integer;
valeure: integer;
valeurf: integer;
valeurg: integer;
valeurh: integer;
valeuri: integer;
valeurj: integer;
valeurk: integer;
valeurl: integer;
valeurm: integer;
valeurn: integer;
valeuro: integer;
chaine: string;
nombre: integer;
caracteresMinuscules: string;
caracteresMajuscules: string;
caracteresNumeros: string;
caracteresSpeciaux: string;
multiple: integer;
valu: integer;
value: integer;
test: string;
begin
if Length(txtCasseurEntree.Text) <> 32 then
exit;
marche := True;
stabStatus.Panels[0].Text := 'Casseur : démarré';
stabStatus.Refresh;
cmdCasseurDemarrer.Enabled := False;
cmdCasseurArreter.Enabled := True;
lblCasseurSortieChaineValeur.Font.Color := clSilver;
lblCasseurSortieChaineValeur.Caption := '';
lblCasseurSortieNombreValeur.Caption := '';
nombre := 0;
if chkCasseurCaracteresMinuscules.Checked then
caracteresMinuscules := 'abcdefghijklmnopqrstuvwxyzéèêëàù';
if chkCasseurCaracteresMajuscules.Checked then
caracteresMajuscules := 'ABCDEFGHIJKLMNOPQRSTUVWXYZÉÈÊËÀÙ';
if chkCasseurCaracteresNumeros.Checked then
caracteresNumeros := '1234567890';
if chkCasseurCaracteresSpeciaux.Checked then
caracteresSpeciaux := '³²&|@"#''(§^!{})°-_<>\?,;.:/=+~^s[$*]%Zµ£` ';
chaine := caracteresMinuscules + caracteresMajuscules + caracteresNumeros + caracteresSpeciaux;
valeura := 1;
valeurb := 1;
valeurc := 1;
valeurd := 1;
valeure := 1;
valeurf := 1;
valeurg := 1;
valeurh := 1;
valeuri := 1;
valeurj := 1;
valeurk := 1;
valeurl := 1;
valeurm := 1;
valeurn := 1;
for boucle := 1 to 15 do
begin
multiple := exposant(Length(chaine),boucle);
gauProgression.Progress := 0;
for a := 1 to valeura do
begin
for b := 1 to valeurb do
begin
for c := 1 to valeurc do
begin
for d := 1 to valeurd do
begin
for e := 1 to valeure do
begin
for f := 1 to valeurf do
begin
for g := 1 to valeurg do
begin
for h := 1 to valeurh do
begin
for i := 1 to valeuri do
begin
for j := 1 to valeurj do
begin
for k := 1 to valeurk do
begin
for l := 1 to valeurl do
begin
for m := 1 to valeurm do
begin
for n := 1 to valeurn do
begin
for o := 1 to Length(chaine) do
begin
application.processmessages;
nombre := nombre + 1;
gauProgression.Progress := StrToInt(CurrToStr(round(nombre / multiple * 100)));
if marche <> True then
begin
break;
exit;
end;
test := substr(chaine[a] + chaine[b] + chaine[c] + chaine[d] + chaine[e] + chaine[f] + chaine[g] + chaine[h] + chaine[i] + chaine[j] + chaine[k] + chaine[l] + chaine[m] + chaine[n] + chaine[o],16-boucle,boucle);
if chkCasseurResultats.Checked then
begin
lblCasseurSortieChaineValeur.Caption := test;
lblCasseurSortieNombreValeur.Caption := IntToStr(nombre);
end;
if txtCasseurEntree.Text = chiffrement(test) then
begin
lblCasseurSortieChaineValeur.Caption := test;
lblCasseurSortieNombreValeur.Caption := IntToStr(nombre);
stabStatus.Panels[0].Text := 'Casseur : trouvé [' + test + ']';
lblCasseurSortieChaineValeur.Font.Color := clRed;
gauProgression.Progress := 100;
cmdCasseurDemarrer.Enabled := True;
cmdCasseurArreter.Enabled := False;
exit;
end;
test := '';
if o = Length(chaine) then
valeurn := Length(Chaine);
if n = Length(chaine) then
valeurm := Length(Chaine);
if m = Length(chaine) then
valeurl := Length(Chaine);
if l = Length(chaine) then
valeurk := Length(Chaine);
if k = Length(chaine) then
valeurj := Length(Chaine);
if j = Length(chaine) then
valeuri := Length(Chaine);
if i = Length(chaine) then
valeurh := Length(Chaine);
if h = Length(chaine) then
valeurg := Length(Chaine);
if g = Length(chaine) then
valeurf := Length(Chaine);
if f = Length(chaine) then
valeure := Length(Chaine);
if e = Length(chaine) then
valeurd := Length(Chaine);
if d = Length(chaine) then
valeurc := Length(Chaine);
if c = Length(chaine) then
valeurb := Length(Chaine);
if b = Length(chaine) then
valeura := Length(Chaine);
end;
end;
end;
end;
end;
end;
end;
end;
end;
end;
end;
end;
end;
end;
end;
if marche <> True then
begin
break;
exit;
end;
lblCasseurSortieChaineValeur.Caption := '- min. ' + IntToStr(boucle + 1) + ' caractères -';
end;
stabStatus.Panels[0].Text := 'Casseur : arrêté';
end;

La fonction substr() employée est une sorte de reproduction que j'ai faite à partir de PHP, mais elle fonctionne de la même façon...

Il y a-t-il quelque chose de frappant dans ce code ? Ce n'est que mon premier logiciel en Delphi 7... ;-)

Bien à toi,

Trash
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
sablor Messages postés 58 Date d'inscription jeudi 19 décembre 2002 Statut Membre Dernière intervention 1 octobre 2004
22 juil. 2003 à 15:48
OK ton code a l'air OK mais comme il me manque les trois procedures exposant, substr, chiffrement je ne peux pas definir si il y a un probleme objet...
Si ton code se limite a ce que tu as indique alors je ne vois pas pourquoi tu as ce message...

tu devrais peut etre essayer de mettre ton code dans un try except avec gestion de EOutOfMemory.
A+

Sablor
0
cs_laurentl2000 Messages postés 33 Date d'inscription samedi 22 février 2003 Statut Membre Dernière intervention 9 novembre 2003
22 juil. 2003 à 15:57
Voici les fonctions manquantes :

function exposant(Nombre: integer; Exposant: integer): integer;
var
i: integer;
begin
result := 1;
for i := 0 to Exposant - 1 do
result := result * Nombre;
end;

function substr(Chain: string; Place: integer; Longueur: integer): string;
var
i: integer;
begin
for i := Place + 1 to Place + Longueur do
result := result + Chain[i-1];
end;

La fonction chiifrement(), quant à elle est le résultat de l'utilisation d'un composant qui contient les calculs nécessaires au chiffrement. Je ne pense pas que le problème vienne de là...

Je vais essayer avec un try except, cela me semble être une bonne idée...

Merci pour tes conseils... ;-)

Bien à toi,

Trash
0
sablor Messages postés 58 Date d'inscription jeudi 19 décembre 2002 Statut Membre Dernière intervention 1 octobre 2004
22 juil. 2003 à 16:24
As tu verifier les longueurs que peuvent faire tes string???
Sans la fonction de chiffrement je suis desole mais je pourrais pas debugguer ton code...
A+
Sablor
0
Emandhal Messages postés 194 Date d'inscription dimanche 2 mars 2003 Statut Membre Dernière intervention 10 octobre 2006 3
23 juil. 2003 à 11:11
je vais peut-etre dire une betise, mais je pense ke c à cause de tes for... il doit y en avoir trop
à voir kom ca ton code peut etre mieux optimisé

Tout problème a sa solution... Mais en général, c'est jamais la bonne...
0
jmp77 Messages postés 1119 Date d'inscription lundi 4 février 2002 Statut Membre Dernière intervention 4 octobre 2006 7
23 juil. 2003 à 17:14
Hello,

Comme dis par Emandhal je pense que tout vient d'un problème d'optimisation. Si tu veux vraiment que l'on puisse t'aider envoie nous carrément les sources complètes que l'on puisse le lancer et te dire comment arranger tout ça.

Bonne prog,
jmp.
0
cs_laurentl2000 Messages postés 33 Date d'inscription samedi 22 février 2003 Statut Membre Dernière intervention 9 novembre 2003
23 juil. 2003 à 23:20
Et bien Sablor avait raison de me demander la fonction de chiffrement ! J'avais tout simplement oublié de vider (Free) le composant de calcul dans la fonction !

Que je suis bête quand même j'ai honte... :-p

En tout cas, ça fonctionne impec maintenant, merci de votre aide les gars ! ;-)

Et puis pour les for, c'est comme les variables, ça ne semble pas prendre de mémoire... Du moins, maintenant la mémoire utilisée reste stable durant toute la durée de travail des boucles... Donc tout va bien... ;-)

A bientôt,

Trash
0
sablor Messages postés 58 Date d'inscription jeudi 19 décembre 2002 Statut Membre Dernière intervention 1 octobre 2004
24 juil. 2003 à 11:46
Et bien je suis heureux d'avoir pu t'aider a trouver ton probleme...
A charge de revanche...
A+
Sablor
0
cs_damrod Messages postés 7 Date d'inscription vendredi 12 mars 2004 Statut Membre Dernière intervention 8 octobre 2004
15 sept. 2004 à 17:22
le probleme de gestion de memoire c comme les messages de forums qui font 500 lignes chaque?? :-p

sinon ya un moyen de verifier/liberer la memoire ds le formclose....genre on verifie qu'on a bien libere tous les objets et si y'en a un d'oublie on le libere ds la boucle......;
0
Rejoignez-nous