Enregistrer à  la volée

CyberbobCyberbob Membre
19:05 modifié dans API AppKit #1
Salut à  tous..

J'ai enfin fini mon premier programme Cocoa ! Ce logiciel s'amuse avec les images TIFF. Bref, du bonheur.

Par contre, j'ai un soucis. Lorsque j'ouvre un fichier très gros, j'ai une erreur du sytle malloc : impossible to allocate memory.
Bref, normal, si je fais une image de 34000 x 25000 pixels en format CMJN ou RVB, ca fait une image monstrueuse à  allouer en mémoire. Pour info, voici le code de création du NSBitmapImageRep :
repDest = [[[NSBitmapImageRep alloc] <br />				initWithBitmapDataPlanes:NULL <br />				pixelsWide:width pixelsHigh:height<br />				bitsPerSample:8 samplesPerPixel:4<br />				hasAlpha:NO isPlanar:NO<br />				colorSpaceName:NSDeviceCMYKColorSpace<br />				bytesPerRow:width*4 bitsPerPixel:32] retain];<br />


En fait, j'aimerais savoir s'il est possible d'écrire les Datas de mon image directement sur le disque dur, plutot que d'allouer toute cette mémoire vive.

J'ai essayé de voir du coté des NSData, mais j'ai pas trouver mon bonheur.

Une idée ?



Réponses

  • schlumschlum Membre
    19:05 modifié #2
    Ah ben ça, ça fait une image de plus de 3 Go ; un peu difficile à  charger en RAM !
    (ça se fait, mais pas d'un seul tenant...)
    Je ne sais pas si les logiciels comme PhotoShop sont capables de traiter ce genre d'images, mais s'ils le font, je pense qu'ils fonctionnent avec des vignettes ou des chargements par morceaux.
  • AntilogAntilog Membre
    19:05 modifié #3
    dans 1202763125:

    Ah ben ça, ça fait une image de plus de 3 Go ; un peu difficile à  charger en RAM !
    (ça se fait, mais pas d'un seul tenant...)
    Je ne sais pas si les logiciels comme PhotoShop sont capables de traiter ce genre d'images, mais s'ils le font, je pense qu'ils fonctionnent avec des vignettes ou des chargements par morceaux.


    Je ne comprends pas?
    Et la mémoire virtuelle, alors?

    S'il y a plus de 3 Go de disque libre, ça devrait marcher, non?
  • valosxvalosx Membre
    19:05 modifié #4
    c'est malheureusement un peu plus compliquer que ca !!
    la mémoire virtuelle a ces limites !
    en l'occurrence sous OSX (32b ) les process sont limites a 4Go (architecture 4Go user/ 4Go kernel)

    d'autre OS (ex: linux) sont limite a 3Go, d'autre a plus

    mais dans tous les cas l'OS fixe une limite. Et donc les soft genre photoshop gère leur propre systeme de tiling/caching des images. (en plus ca permet un redraw plus rapide ...)

    note : ca implique d'avoir quand même l'espace disque ;-)

    par contre c'est plus compliquer a mettre en oeuvre.

  • schlumschlum Membre
    19:05 modifié #5
    dans 1202772551:

    dans 1202763125:

    Ah ben ça, ça fait une image de plus de 3 Go ; un peu difficile à  charger en RAM !
    (ça se fait, mais pas d'un seul tenant...)
    Je ne sais pas si les logiciels comme PhotoShop sont capables de traiter ce genre d'images, mais s'ils le font, je pense qu'ils fonctionnent avec des vignettes ou des chargements par morceaux.


    Je ne comprends pas?
    Et la mémoire virtuelle, alors?

    S'il y a plus de 3 Go de disque libre, ça devrait marcher, non?


    Le problème ce ne sont pas les 3 Go... Ce sont les 3 Go "contigus" !
    Déjà , la mémoire virtuelle est découpée en fichiers de moins de 500 Mo il me semble...
  • valosxvalosx Membre
    19:05 modifié #6
    dans 1202798032:

    dans 1202772551:

    dans 1202763125:

    Ah ben ça, ça fait une image de plus de 3 Go ; un peu difficile à  charger en RAM !
    (ça se fait, mais pas d'un seul tenant...)
    Je ne sais pas si les logiciels comme PhotoShop sont capables de traiter ce genre d'images, mais s'ils le font, je pense qu'ils fonctionnent avec des vignettes ou des chargements par morceaux.


    Je ne comprends pas?
    Et la mémoire virtuelle, alors?

    S'il y a plus de 3 Go de disque libre, ça devrait marcher, non?


    Le problème ce ne sont pas les 3 Go... Ce sont les 3 Go "contigus" !
    Déjà , la mémoire virtuelle est découpée en fichiers de moins de 500 Mo il me semble...

    Les 3Go contigus ne sont pas un problème, ca c'est le job de l'OS... (quelque soit la manièere dont il le fait, disque ou autre )
    par contre allouer 3Go pour un objet, ca c'est un problème (au moins en 32bits ;-). en l'occurence le max c'est 4Go si tout va bien, et comme il faudra bien d'autre allocation que juste l'image ...
  • schlumschlum Membre
    février 2008 modifié #7
    Sur ma machine avec seulement 1 Go de RAM, j'arrive à  allouer 3 Go de mémoire par bouts de 1 Mo (3*1024 fois)
    Par contre, d'un coup, no way...
  • CyberbobCyberbob Membre
    19:05 modifié #8
    Et oui, c'est bien ça le problème. Je ne peux pas allouer autant d'espace à  ma méoire Vive. Je pensais alors à  écrire ses données sur le disque.

    Peut être qu'il faut que je fasse tout à  la main, écirre le Header puis les data de mon image directement sur le disque. Je trouve ça un peu dommage, et surtout, je ne sais pas si j'en suis capable !
  • MacJLMacJL Membre
    19:05 modifié #9
    Bonjour,

    Je ne sais pas sous OS X quelle quantité de RAM un process peut adresser, mais en 32bit, sous les différents OS que je connais, c'est très souvent 2Go. Donc les 3Go ne rentrent pas directement en mémoire pour 1 process.
    Le système gère ensuite la RAM et la mémoire virtuelle comme il le veut, et l'allocation non-contigue ne pose pas de problèmes si le système a une bonne gestion de la mémoire (tous les systèmes actuels savent le faire).
  • CyberbobCyberbob Membre
    19:05 modifié #10
    Bah essaye d'allouer une NSBitmapImageRep comme j'ai mis en exemple, et tu mets 32000 x 40000 en format de l'image. Si tu arrive à  l'enregistrer, dis moi comme tu fais ! ;)
  • MacJLMacJL Membre
    19:05 modifié #11
    dans 1202812978:

    Bah essaye d'allouer une NSBitmapImageRep comme j'ai mis en exemple, et tu mets 32000 x 40000 en format de l'image. Si tu arrive à  l'enregistrer, dis moi comme tu fais ! ;)


    C'est ce que je dis. Tu ne peux pas le faire car dans ce cas, l'occupation mémoire du process serait > 2Go. Tu peux par contre le faire en 64bit (si ton processeur est compatible).
  • CyberbobCyberbob Membre
    19:05 modifié #12
    Nous sommes d'accord. Mais comment je fais alors ?  :o
  • schlumschlum Membre
    19:05 modifié #13
    Compiler en 64 bits... Mais j'y crois pas trop, malloc prend comme argument un size_t qui équivaut à  un "unsigned long"
    Donc jusqu'à  4Go même en 32 bits ça devrait être OK.
  • CyberbobCyberbob Membre
    19:05 modifié #14
    Oui, c'est bizarre. Vous avez pas un exemple pour écrire des données binaires dans un fichier ?
  • CyberbobCyberbob Membre
    19:05 modifié #15
    Bon j'avance un peu sur la lecture du fichier TIFF en binaire. Du coup, je suis en train de me farcir les specs du format TIFF.

    Je vous tiens au courant. Si des personnes sont intéressées par la manipulation de données, je pourrais peut être faire un tutoriel pour le site.
Connectez-vous ou Inscrivez-vous pour répondre.