Annonce

>>> Bienvenue sur codelab! >>> Première visite ? >>> quelques mots sur codelab //// une carte des membres//// (apéros) codelab


#1 2012-12-27 16:29:52 OutOfMemoryError sur chargement d'images

chrisjo
membre
Date d'inscription: 2012-12-26
Messages: 22

OutOfMemoryError sur chargement d'images



Bonjour,
je réalise un programme qui utilise le chargement aléatoire d'images d'une bibliothèque. Je présente ici une version type diaporama. Les chargements se succèdent dans le même conteneur PImage. Progressivement la mémoire disponible se sature : les images précédentes ne sont donc pas supprimées de la mémoire.
Nouveau sur Processing (je viens d'AS2) j'ai choisi de de m'investir tout de suite sur les versions les plus récentes 2.0b6-7.
Y a-t-il un bug sur la mémoire, est-ce que je procède mal?
Je précise que même si cela peut sembler beaucoup d'images chargées quand même, le principe de mon programme est de pouvoir tourner "indéfiniment" et que je ne souhaite disposer en mémoire que d'1 ou 2 images simultanément.
merci de vos conseils

Hors ligne

 

#2 2012-12-29 08:18:47 Re : OutOfMemoryError sur chargement d'images

cgiles
membre
Lieu: Est de la France
Date d'inscription: 2005-05-25
Messages: 329

Re: OutOfMemoryError sur chargement d'images



dans les options tu as une fonction "increase maximum memory" tu peux mettre le montant que tu veux

Hors ligne

 

#3 2012-12-29 18:51:13 Re : OutOfMemoryError sur chargement d'images

chrisjo
membre
Date d'inscription: 2012-12-26
Messages: 22

Re: OutOfMemoryError sur chargement d'images



Oui, j'ai essayé "increase maximum memory" : cela permet de retarder le phénomène de "bourrage mémoire" mais pas de le supprimer (or mon projet étant de faire une sorte de programme perpétuel cela est bien gênant).

Petite atténuation : dans la dernière version complète de mon programme j'ai changé les dimensions de la fenêtre et le phénomène est moindre. Comme la différence joue sur le redimensionnement 'resize' des images chargées c'est peut-être ce 'resize' qui pose problème...

Hors ligne

 

#4 2013-01-11 14:18:18 Re : OutOfMemoryError sur chargement d'images

oyster_twiter
membre
Lieu: saint-herblain
Date d'inscription: 2008-04-01
Messages: 444
Site web

Re: OutOfMemoryError sur chargement d'images



Salut,

je me dis que tu devrais essayer avec le multi-threading ?
http://wiki.processing.org/w/Threading

Hors ligne

 

#5 2013-01-12 18:37:20 Re : OutOfMemoryError sur chargement d'images

emoc
@#@*$
Lieu: Quimper
Date d'inscription: 2008-01-28
Messages: 1576
Site web

Re: OutOfMemoryError sur chargement d'images



Salut,

Si je comprends bien ton code, tu charges une image par seconde avec Sc=new Img() dans la boucle draw, mais en faisant ça, tu crées un nouvel objet à chaque fois, c'est probablement pour ça que la mémoire s'encombre, les objets ne sont pas détruits?
Tu pourrais créer un tableau de 3 objets, charger 3 images, en afficher une puis l'autre, etc, tout en rechargeant de nouvelles images dans ceux qui ne sont pas affichés.

Deux trucs qui peuvent t'intéresser :

http://wiki.processing.org/w/Asynchrono … ge_loading
http://processing.org/reference/requestImage_.html

Hors ligne

 

#6 2013-01-12 20:03:49 Re : OutOfMemoryError sur chargement d'images

chrisjo
membre
Date d'inscription: 2012-12-26
Messages: 22

Re: OutOfMemoryError sur chargement d'images



Merci oyster_twiter, je vais me plonger un peu plus sur ce "threading", cela semble intéressant (je ne suis pas sûr d'avoir bien compris encore) pour avoir des actions indépendantes du rythme de draw() et ça m'intéresse aussi, mais pour l'instant je ne vois pas en quoi cela interviendrait sur ce problème de mémoire...

Hors ligne

 

#7 2013-01-12 20:27:09 Re : OutOfMemoryError sur chargement d'images

chrisjo
membre
Date d'inscription: 2012-12-26
Messages: 22

Re: OutOfMemoryError sur chargement d'images



Salut Emoc,
cela crée effectivement un nouvel objet PImage enfant de mon objet Sc = Sc.pict ; mais justement le nouvel objet image Sc.pict ne remplace-t-il pas le précédent ne serait-ce que par l'action new Img() ?

J'ai déjà essayé une autre version où je ne repasse pas par new Img()   j'effectue directement : pict=loadImage(nomImg); (et même en effectuant removeCache(pict) auparavant car il n'existe pas de clear() pour cet objet, en vérifiant pict devient alors "null") :
cela ne change rien.
Se peut-il que la mémoire conserve en dissociant du nom d'objet la version pict n°1, n°2 etc...?
Je ne comprends pas...

Hors ligne

 

#8 2013-01-12 22:23:29 Re : OutOfMemoryError sur chargement d'images

emoc
@#@*$
Lieu: Quimper
Date d'inscription: 2008-01-28
Messages: 1576
Site web

Re: OutOfMemoryError sur chargement d'images



chrisjo a écrit:

le nouvel objet image Sc.pict ne remplace-t-il pas le précédent ne serait-ce que par l'action new Img() .

Ah oui, tu as raison, ça parait logique que de recréer une nouvelle instance de l'objet efface l'ancienne. Mais, je ne sais pas exactement comment fonctionnent les mécanismes de destruction d'objet en java, en théorie c'est le «garbage collector» qui s'en charge, mais pour les objets descendants d'objets... Peut-être que c'est lié à la gestion de la mémoire de processing avec loadImage? Je crois que j'ai atteint ma limite smile

Le code source de la fonction loadImage est ici, à partir de la ligne 5378 : http://code.google.com/p/processing/sou … pplet.java

Hors ligne

 

#9 2013-01-13 19:41:07 Re : OutOfMemoryError sur chargement d'images

chrisjo
membre
Date d'inscription: 2012-12-26
Messages: 22

Re: OutOfMemoryError sur chargement d'images



citation :

emoc a écrit :
en théorie c'est le «garbage collector» qui s'en charge, mais pour les objets descendants d'objets...

J'ai également essayé de mettre mon objet "pict" PImage en variable globale (hors la classe) et le résultat reste le même...

Merci pour le lien... cela fait un peu beaucoup de code à comprendre : on y voit quand même qu' "ils" créent des objets images-java  intermédiaires locaux et donc si le «garbage collector» ne supprime pas ces objets...  cela peut s'entasser de la même façon que dans mon programme.

Cependant je retrouve ici "removeCache()" : je l'avais déjà inclus récemment  en effectuant :
removeCache(pict);
avant le rechargement d'une nouvelle image
mais j'avais oublié un objet PGraphics  que j'utilise de la même façon, je lui ai appliqué :
removeCache(obj_PGraphics);
de la même façon et cette fois cela marche !!!!
La mémoire utilisée monte puis se stabilise, redescend même en fonction du poids de l'image (plusieurs vérifs avec et sans me confirment sur la différence de comportement). Reste à voir sur une journée ou plus... puisque c'est mon but.
A noter l'info sur cette page :
Advanced users please note that createImage() should be used instead of
* the syntax   new PImage() .

Dans le guide de référence il est même indiqué de ne pas utiliser   new PImage().

Je confirmerai sur une grande durée,
merci à ceux qui se sont intéressés au PB !

Hors ligne

 

#10 2013-01-16 20:59:37 Re : OutOfMemoryError sur chargement d'images

chrisjo
membre
Date d'inscription: 2012-12-26
Messages: 22

Re: OutOfMemoryError sur chargement d'images



En conclusion : après un fonctionnement pendant 3 jours ininterrompus, il n'y a plus de problème mémoire avec l'introduction de removeCache()  c'est donc la solution!
Difficile de comprendre comment un nouvel loadImage() répétitif sur un même objet ne libère pas à chaque fois la place mémoire du chargement précédent mais c'est ainsi...

Hors ligne

 

#11 2013-01-19 11:38:27 Re : OutOfMemoryError sur chargement d'images

oyster_twiter
membre
Lieu: saint-herblain
Date d'inscription: 2008-04-01
Messages: 444
Site web

Re: OutOfMemoryError sur chargement d'images



Bonjour chrisjo,

Super que tu ai trouvé la solution.
C'est vrai que c'est curieux que loadImage() ne fasse pas ça d'emblée...
Peut-être tu peux signaler ça comme une 'issue' sur le dépot du code de Processing ?
https://code.google.com/p/processing/issues/list

Hors ligne

 

#12 2013-01-19 20:25:18 Re : OutOfMemoryError sur chargement d'images

chrisjo
membre
Date d'inscription: 2012-12-26
Messages: 22

Re: OutOfMemoryError sur chargement d'images



Peut-être que ce serait bien de le signaler, en effet, mais mon anglais est un peu hésitant, j'ai peur d'être incompréhensible...

Hors ligne

 

#13 2013-01-20 10:50:16 Re : OutOfMemoryError sur chargement d'images

cgiles
membre
Lieu: Est de la France
Date d'inscription: 2005-05-25
Messages: 329

Re: OutOfMemoryError sur chargement d'images



je crois que ça s'appelle une fuite de cache ou de ram, c'est le soft qui libère pas la ram qu'il utilise
En anglais, ils disent "memory leak"

Bon petite recherche dans leur issue : http://code.google.com/p/processing/iss … %20Summary

Hors ligne

 

#14 2013-01-20 17:28:05 Re : OutOfMemoryError sur chargement d'images

chrisjo
membre
Date d'inscription: 2012-12-26
Messages: 22

Re: OutOfMemoryError sur chargement d'images



citation :

Cgiles a écrit :
Bon petite recherche dans leur issue : http://code.google.com/p/processing/iss … %20Summary

donc, ce problème est déjà signalé et la même solution que la mienne est proposée en attendant que le bug soit réglé, très bien.

Hors ligne

 

#15 2013-01-20 19:24:03 Re : OutOfMemoryError sur chargement d'images

cgiles
membre
Lieu: Est de la France
Date d'inscription: 2005-05-25
Messages: 329

Re: OutOfMemoryError sur chargement d'images



je pense qu'il faut que tu le signales en donnnant le numero de version et la machine/os que tu utilises, en commentant a la suite du report

Hors ligne

 

fil rss de cette discussion : rss

Pied de page des forums

Powered by FluxBB

codelab, graphisme & code : emoc / 2008-2024