Plantage à cause de TIFFRepresentation
Salut.
J'ai une boucle qui traite des images PNG d'environ 6-10 Mo.
Le code est le suivant :
Tout marche bien pendant environ 8 à 10 images, et puis boom, ça tombe en carafe ....
Voilà le message que j'ai dans le LOG :
J'ai pu voir que c'était la ligne NSData *toto = [imageCarte TIFFRepresentation]; qui faisait planter ....
Mais alors pourquoi ça marche un temps ? Est-ce un problème de mémoire ?
J'ai une boucle qui traite des images PNG d'environ 6-10 Mo.
Le code est le suivant :
NSImage *imageCarte = [[NSImage alloc]initWithContentsOfFile:pathFichierImage];<br /> <br />NSSize imageSize;<br />imageSize.width = [[imageCarte bestRepresentationForDevice:nil] pixelsWide];<br />imageSize.height = [[imageCarte bestRepresentationForDevice:nil] pixelsHigh];<br />[imageCarte setScalesWhenResized:YES];<br />[imageCarte setSize:imageSize];<br />[carte setImage:imageCarte];<br />NSData *toto = [imageCarte TIFFRepresentation];<br />NSBitmapImageRep *imageRep = [NSBitmapImageRep imageRepWithData:toto];<br />//NSBitmapImageRep *imageRep = [NSBitmapImageRep imageRepWithData:[imageCarte TIFFRepresentation]];<br />NSData *imageJpeg = [imageRep representationUsingType:NSJPEGFileType properties:nil];<br />[carte setImageData:imageJpeg];
Tout marche bien pendant environ 8 à 10 images, et puis boom, ça tombe en carafe ....
Voilà le message que j'ai dans le LOG :
Discoway(3357,0xa000d000) malloc: *** vm_allocate(size=67108864) failed (error code=3)<br />Discoway(3357,0xa000d000) malloc: *** error: can't allocate region<br />Discoway(3357,0xa000d000) malloc: *** set a breakpoint in szone_error to debug
J'ai pu voir que c'était la ligne NSData *toto = [imageCarte TIFFRepresentation]; qui faisait planter ....
Mais alors pourquoi ça marche un temps ? Est-ce un problème de mémoire ?
Connectez-vous ou Inscrivez-vous pour répondre.
Réponses
Oh oui, ça put la saturation de la mémoire.
1. tu manipules des objets gourmands en mémoire.
2. ces objets sont tous en autorelease pool.
3. tu mets tout ça dans une boucle.
Conclusion, l'autorelease pool n'a pas le temps de se vider dans ta boucle, d'où, peu à peu, saturation de la mémoire.
créé un autorelease pool au début de ta boucle, puis, détruit le en fin de boucle.
.
Pourquoi la mémoire se sature alors que la mémoire virtuelle permet d'acceder a des quantités de mémoire supplémentaire ? Pourquoi ne pas allouer de la mémoire dans cet espace ?
Super, c'est nickel ! Merci Bru.
Et pour répondre à fouf au passage, j'ai même gagné sensiblement en vitesse d'exécution. Ce qui veux dire que j'utilisais déjà la mémoire virtuelle ... Je devais vraiment être au taqué !
En fait, je ne connais pas les détails du mécanisme de swap sous OS X (mécanisme qui libère de la ram en transférant son contenu sur disque), mais généralement, les pages mémoires swappées sont celles qui sont "inutilisées" depuis un certain temps.
Ici, avec une boucle dans une appli active, je pense que le "inutilisée depuis un certain temps" est dépassé par la demande de mémoire due à l'allocation des objets.
.