Gambas France BETA


Pas de compte ? Incription

Vider la RAM

Ce sujet est résolu.

12
AuteurMessages
Foromus#1 Posté le 31/10/2018 à 13:11:08
Bonjour,

Sur un projet de contrôle d'images, il y a, assez rapidement, une saturation de la RAM, et ça, ça m'ennuie... J'ai un petit contrôle visuel dans mon tableau de bord, ce qui me permet de suivre. Je me suis fait avoir, j'ai lancé le projet, puis fait autre chose (contrôler tous les fichiers d'un répertoire, ça prend du temps), et je me suis retrouvé avec la machine bloquée : RAM pleine, et SWAP de même ! Bigre ! Depuis je fais attention et il m'est difficile de traiter deux répertoires de suite, par crainte de saturation. Il faut que je ferme le programme, là, la RAM se vide normalement, et que je le relance.
Donc, je cherche simplement une commande qui me vide la RAM dès que l'opération sur un répertoire est terminée. Et je ne trouve pas...
Si quelqu'un a une idée...

Merci à vous !
linuxos#2 Posté le 31/10/2018 à 21:59:56
Un peu de sel, de poivre et la crevette sera... Bonjour,

Peux tu donner plus d'info, sans trop rentrer dans détails forcement, pour que l'on comprenne comment tu remplis la memoire stp ?

Olivier
Lorsqu'on s'occupe d'informatique, il faut faire comme les canards... Paraître calme en surface et pédaler comme un forcené par en dessous.
Foromus#3 Posté le 1/11/2018 à 10:23:16
Bonjour,

Un peu ennuyé pour répondre... Disons :
Je sélectionne un répertoire, je le parcours par une boucle for each files, à chaque occurrence je teste la taille de l'image, si c'est conforme, je passe à la suivante, si ce n'est pas conforme, j'affiche un message.warning.
Comme ça, ça marche, simplement, quand je passe sur un autre répertoire et lance le contrôle, la RAM n'a pas été vidée, et les nouveaux besoins s'empilent sur les besoins devenus inutiles, mais toujours présents... Et ça sature assez vite...
Après, comment je remplis la mémoire, je ne sais pas trop, c'est le gambas qui s'en charge...
Au fond, mon besoin, c'est de vider la RAM à la fin de la boucle for each.
La commande quit s'acquitte très bien de cette fonction, le souci, c'est qu'il faut relancer l'application...
spheris#4 Posté le 1/11/2018 à 10:35:44
Foromus,
En général, quand une RAM est saturée, c'est que la prog n'est pas bonne.
Peut être que ce sont tes 'message.warning' qui bloquent tout.
As tu essayé plutot de t'afficher les warning dans la console au moyen de print, ou de t'afficher les warning dans une string, puis de t'afficher le résultat final dans un message.warning.
Cela soulagerait la RAM, isn't it?
En ce qui concerne la gestion de la RAM par gambas, c'est plutôt du ressort de *nux de la faire, je ne vois pas la commande qui va bien.
;)
Foromus#5 Posté le 1/11/2018 à 13:23:10
Foromus,
En général, quand une RAM est saturée, c'est que la prog n'est pas bonne.

Tout à fait d'accord, et c'est bien pour ça que je demande de l'aide !

Peut être que ce sont tes 'message.warning' qui bloquent tout.

Non ! Pour la bonne raison que, lorsque, aucune anomalie n'est décelée, le souci est le même. Argument refusé !
As tu essayé plutot de t'afficher les warning dans la console au moyen de print, ou de t'afficher les warning dans une string, puis de t'afficher le résultat final dans un message.warning.
Cela soulagerait la REn

Non, logiquement d'après ci-dessus...

En ce qui concerne la gestion de la RAM par gambas, c'est plutôt du ressort de *nux de la faire, je ne vois pas la commande qui va bien.

Et c'est pour ça aussi que je cherche !
"Quit" vide la mémoire et ferme le programme, quelle instruction vide la mémoire SANS fermer le programme ?...
didier18#6 Posté le 1/11/2018 à 18:59:33
Bonjour

Je sélectionne un répertoire, je le parcours par une boucle for each files, à chaque occurrence je teste la taille de l'image, si c'est conforme, je passe à la suivante, si ce n'est pas conforme, j'affiche un message.warning.

Normalement ce n'est pas cela qui va saturer la RAM...
Ou alors tous les "message warning" ne sont pas validés.
D'autant plus que :
Peut être que ce sont tes 'message.warning' qui bloquent tout.

Non ! Pour la bonne raison que, lorsque, aucune anomalie n'est décelée, le souci est le même. Argument refusé !

Donc il reste à voir comment tu teste "la taille de l'image"... Pour cela j'utiliserai cette commande (cliquer sur moi), mais là encore pas de quoi saturer la mémoire...

Peut être que tu peux utiliser cette commande (cliquer sur moi) ou encore cette commande (cliquer sur moi) avant de passer au répertoire suivant... (il te faudra l'intégrer dans un "exec" ou un "shell")

En tout cas, je pense qu'il faut que tu vois en priorité pourquoi la mémoire se remplis aussi vite...

J'espère que ça t'aidera...
Bonne journée.
Foromus#7 Posté le 2/11/2018 à 08:54:35
Bonjour à tous,

Bon, la RAM, elle se remplit bien, je vous assure... Et c'est forcément mon code qui la remplit !
Comment je teste ? Simple !
Sur ma form, je pose un contrôle image NON visible, dimensionné assez limité. A chaque occurrence, je colle l'image dedans, et le contrôle prend donc la cote de l'image. Je récupère cette cote (largeur x hauteur) et je compare à mes valeurs de référence. Ensuite, j'annule l'image pour l'occurrence suivante.
En relisant ce que je viens d'écrire, je me demande que fait mon contrôle après avoir été chargé de l'image à tester, et retirée ensuite ? Est-ce qu'il ne serait pas judicieux de le remettre aux cotes initiales ?
Après, la méthode utilisée n'est probablement pas la meilleure. Comme mon code n'est pas directement accessible pour l'instant, je vais voir plus tard les suggestions de didier.
En attente....

Merci pour l'aide !
spheris#8 Posté le 2/11/2018 à 22:31:44
Je pense que tu devrais poster ton bout de code ici. On y verrait plus clair pour te donner des pistes de réflexions.
;)
linuxos#9 Posté le 3/11/2018 à 02:01:36
Un peu de sel, de poivre et la crevette sera... En effet je pense qu'il faudrait pouvoir examiner ton code pour nous rendre compte et t'aider.
Olivier
Lorsqu'on s'occupe d'informatique, il faut faire comme les canards... Paraître calme en surface et pédaler comme un forcené par en dessous.
Foromus#10 Posté le 5/11/2018 à 16:58:11
Bonjour à tous,

voilà, je me suis penché sérieusement sur le problème, en fait, ça s'empile à la ligne 8 (c'est assez logique)

Voici le code de la partie concernée :

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
.............
.............
FOR EACH NomFich IN Dir(MonRepertoire)
NbreFich += 1
lblNbTotImages.Text = "Image" & NbreFich & "/" & NbTotImages
ProgressBar1.Value = NbreFich / NbTotImages
picImage.Picture = NEW Picture
picImage.Picture = Picture[MonRepertoire & "/" & NomFich]
IF Minia = 1 THEN picMinia.Picture = NEW Picture
IF Minia = 1 THEN picMinia.Picture = Picture[MonRepertoire & "/" & NomFich]
lblLargeurImage.Text = " Largeur Image = " & picImage.Width
lblHauteurImage.Text = " Hauteur Image = " & picImage.Height

WAIT Vitesse / 1000

IF Flag.........
...................

Pour info : picImage.visible = false
Après, la méthode de test n'est peut-être pas la meilleure. J'ai fait plein d'essais, rien de concret au niveau résultat. Maintenant, si il y a un autre moyen de tester une image, je suis preneur...
didier18#11 Posté le 6/11/2018 à 09:19:13
Bonjour Foromus

Oui car tu créé un nouvel objet "picture" à chaque itération de la boucle for each...
Or ce nouvel objet n'est pas détruit.
Donc effectivement, selon le nombre et la taille des images cela conduit à remplir la mémoire.
Ne serait-il pas judicieux de créer un seul objet "picture" (avant d'entrer dans la boucle) puis dans la boucle, une fois le test effectué "nettoyer" l'objet ou écraser l'ancien contenu par le nouveau test ?
Il y a peut être des solutions plus élégantes, mais je pense que c'est un début de piste.

Bonne journée
Foromus#12 Posté le 6/11/2018 à 10:38:19
Bonjour,

Ne serait-il pas judicieux de créer un seul objet "picture"


Ça, si je savais faire, je l'aurais fait...
Désolé pour cette limitation....
Merci !
spheris#13 Posté le 18/11/2018 à 18:26:36
Tu n'es pas limité Foromus, j'ai cherché la réponse à ta question une bonne après midi sans pour autant trouver la réponse.
Une petite idée serait d'ouvrir une nouvelle form avec une picturebox, et tu fermes la form après ton message.warning.

petite remarque : Dans ton bout de code Minia est toujours à 1, je ne le vois jamais changer.
Donc à chaque itération de for each tu crées toujours une picture.
regarde où dans ton code Minia change d'état, ou alors, complète ta boucle ligne 9 :
1
IF Minia = 1 THEN picMinia.Picture = NEW Picture
par un else.
;)
Flachy Joe#14 Posté le 18/11/2018 à 21:39:02
Iguane : Il Gambas Uniquement pour Activer ses NEuronesPourquoi ne pas utiliser une commande qui-va-bien qui fourni la dimension de l'image sans avoir à la charger dans Gambas ?
Par exemple https://imagemagick.org/script/identify.php avec une expression régulière sur le résultat pour récupérer uniquement la taille.

J'ai fait un petit test avec 100 images JPEG (~500 Mo) ça prend 1,5s pour tout scanner.
Et ce n'est pas obligé de lancer autant de fois la commande qu'il y a d'image :
f@pc: cd machin
f@pc: identify *.JPG
IMGP6542.JPG JPEG 4288x2848 4288x2848+0+0 8-bit sRGB 5.463MB 0.010u 0:00.019
IMGP6543.JPG JPEG 4288x2848 4288x2848+0+0 8-bit sRGB 5.541MB 0.020u 0:00.019
IMGP6544.JPG JPEG 4288x2848 4288x2848+0+0 8-bit sRGB 5.09MB 0.020u 0:00.019
IMGP6545.JPG JPEG 4288x2848 4288x2848+0+0 8-bit sRGB 5.694MB 0.010u 0:00.010
IMGP6546.JPG JPEG 4288x2848 4288x2848+0+0 8-bit sRGB 4.996MB 0.020u 0:00.019
IMGP6547.JPG JPEG 4288x2848 4288x2848+0+0 8-bit sRGB 5.556MB 0.020u 0:00.010
...
;) Flachy Joe ;)
Foromus#15 Posté le 21/11/2018 à 19:04:59
Tu n'es pas limité Foromus, j'ai cherché la réponse à ta question une bonne après midi sans pour autant trouver la réponse.
Une petite idée serait d'ouvrir une nouvelle form avec une picturebox, et tu fermes la form après ton message.warning.

petite remarque : Dans ton bout de code Minia est toujours à 1, je ne le vois jamais changer.
Donc à chaque itération de for each tu crées toujours une picture.
regarde où dans ton code Minia change d'état, ou alors, complète ta boucle ligne 9 :
1
IF Minia = 1 THEN picMinia.Picture = NEW Picture
par un else.
;)


Bonjour spheris,

Une nouvelle form ? Je n'y avais pas pensé... A voir...
Concernant la variable "a", c'est un booleen, qui me permet d'afficher, ou pas, l'image testée. Peut être utile si je veux faire, en plus, un contrôle visuel. Mais là, en l'occurrence, ce n'est pas la cause de mon souci puisque mis à "0" (donc, pas d'affichage de la miniature), ça sature quand même...
Réflexion que je me faisais l'autre nuit, est-ce que, justement, ce ne serait pas ce foutu "new picture" qui me charge la Ram ? Je comptais faire un essai, puis j'ai fait autre chose et n'ai pas testé. Maintenant, est-ce que, en remplaçant une image par une autre sans le "new", est-ce que ça va coller ? Je vais essayer...

Pour Flachy

Bonjour également !
Si je comprends un peu, ce sont deux commandes en console ?..

Merci à vous deux
12