Plantage à  cause de TIFFRepresentation

UniXUniX Membre
09:04 modifié dans Vos applications #1
Salut.

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&#39;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 ?

Réponses

  • BruBru Membre
    09:04 modifié #2
    dans 1184014833:

    Mais alors pourquoi ça marche un temps ? Est-ce un problème de mémoire ?


    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.

    .
  • fouffouf Membre
    juillet 2007 modifié #3
    A ce sujet, j'ai une question a poser aux personnes qui connaissent les mécanismes d'allocation mémoire :
    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 ?
  • UniXUniX Membre
    juillet 2007 modifié #4
    <3 <br />
    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é !
  • BruBru Membre
    09:04 modifié #5
    dans 1184019144:

    A ce sujet, j'ai un question a poser au personne qui connaissent les mécanismes d'allocation mémoire :
    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 ?


    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.

    .
Connectez-vous ou Inscrivez-vous pour répondre.