none
Mémoire insuffisante RRS feed

  • Question

  • Bonjour

    J'obtiens cette erreur après quelques affichages d'images avec cette instruction :

            Me.Affiche.Image = System.Drawing.Image.FromFile(Me.Jpg.Text)
    



    Alain D
    lundi 21 novembre 2011 09:32

Réponses

  • Il manque sans doute "Imports System.Drawing" (ou une référence à la DLL) mais ce code en particulier n'apportera pas grand chose.

    Je voulais juste dire que l'on peut faire :

    Dim img As Image=Image.FromFile(MonFichier)

    Image est simplement le nom de la classe. On appelle FromFile directement sur la classe (et non pas sur un objet Image) car FromFile ne fonctionne pas sur un objet Image en particulier mais charge un bitmap et retourne une nouvelle image.

    Je me disais qu'effectivement il faudrait poster le code le plus simple possible qui montre le problème. Pour l'instant je n'arrive pas à reproduire ce problème de mon côté donc soit il s'agit d'un problème particulier à tel fichier ou à XP/.NET 2.0/3.5 soit il y a qq chose d'autres dans le code qui coince ?


    Please always mark whatever response solved your issue so that the thread is properly marked as "Answered".
    • Marqué comme réponse papyx mercredi 23 novembre 2011 07:59
    mardi 22 novembre 2011 12:55
    Modérateur

Toutes les réponses

  • Bonjour,

    Pouvez vous nous donner le message d'erreur dans son intégralité ?

    C'est quoi le type de votre objet "Affiche" ?

     

    Cordialement. 

    lundi 21 novembre 2011 11:30
    Auteur de réponse
  • Bonjour Alain,

    Me.Jpg.text doit correspondre a un textbox qui contient le chemin de l'image ?

    Affiche.Image doit être une PictureBox ?

    ce que vous recherchez a faire c'est afficher une image dans une picturebox ?

     

    A bientot


    Cordialement,
    Xavier TALOUR
    Alias Troxsa SendMail
    Voir le profil de Xavier TALOUR sur LinkedIn
    lundi 21 novembre 2011 11:36
    Auteur de réponse
  • Bonjour,

    Le plus probable est que l'on recrée sans arrêt des images sans jamais désallouer correctement la mémoire qu'elles utilisent.

    Mon premier mouvement serait d'essayer qq chose comme :
    If Not Me.Affiche.Image Is Nothing Then Me.Affiche.Image.Dispose() ' Désallouer l'image précédente
    Me.Affiche.Image=System.Drawing.Image.FromFile(Me.Jpg.Text)


    Please always mark whatever response solved your issue so that the thread is properly marked as "Answered".
    • Proposé comme réponse TroxsaEditor lundi 21 novembre 2011 14:39
    lundi 21 novembre 2011 11:49
    Modérateur
  • Patrice,

    J'avais fait un petit programme pour rechercher les doublons d'image, il m'affichait le résultat dans une pictureBox uniquement les doublons et bien souvent je me retrouverais aussi en mémoire insuffisante. javais bien essayé le Dispose sur le picture mais cela n'avais pas fonctionner, par la suite j'ai utilisé le GC ce fut le même résultât.

    Il n'existerait il pas d'autre méthode pour forcer la libération de mémoire ?


    Cordialement,
    Xavier TALOUR
    Alias Troxsa SendMail
    Voir le profil de Xavier TALOUR sur LinkedIn
    lundi 21 novembre 2011 11:59
    Auteur de réponse
  • A Mourad

    L'exception System.OutOfMemoryException n'a pas été gérée

      Message="Mémoire insuffisante."

      Source="System.Drawing"

      StackTrace:

           à System.Drawing.Image.FromFile(String filename, Boolean useEmbeddedColorManagement)    à System.Drawing.Image.FromFile(String filename)    à Rechercher_des_films.Form2.affichage(Object ima) dans C:\Documents and Settings\Admin.XPSP2-46E31CF49\Mes documents\Visual Studio 2008\Projects\Films\Rechercher des films\Rechercher des films\Form2.vb:ligne 222    à Rechercher_des_films.Form2.ListBox1_DoubleClick(Object sender, EventArgs e) dans C:\Documents and Settings\Admin.XPSP2-46E31CF49\Mes documents\Visual Studio 2008\Projects\Films\Rechercher des films\Rechercher des films\Form2.vb:ligne 130    à System.Windows.Forms.Control.OnDoubleClick(EventArgs e)    à System.Windows.Forms.ListBox.WndProc(Message& m)    à System.Windows.Forms.Control.ControlNativeWindow.OnMessage(Message& m)    à System.Windows.Forms.Control.ControlNativeWindow.WndProc(Message& m)    à System.Windows.Forms.NativeWindow.DebuggableCallback(IntPtr hWnd, Int32 msg, IntPtr wparam, IntPtr lparam)    à System.Windows.Forms.UnsafeNativeMethods.DispatchMessageW(MSG& msg)    à System.Windows.Forms.Application.ComponentManager.System.Windows.Forms.UnsafeNativeMethods.IMsoComponentManager.FPushMessageLoop(Int32 dwComponentID, Int32 reason, Int32 pvLoopData)    à System.Windows.Forms.Application.ThreadContext.RunMessageLoopInner(Int32 reason, ApplicationContext context)    à System.Windows.Forms.Application.ThreadContext.RunMessageLoop(Int32 reason, ApplicationContext context)    à System.Windows.Forms.Application.Run(Form mainForm)    à Rechercher_des_films.Form2.Main() dans C:\Documents and Settings\Admin.XPSP2-46E31CF49\Mes documents\Visual Studio 2008\Projects\Films\Rechercher des films\Rechercher des films\Form2.designer.vb:ligne 2    à System.AppDomain._nExecuteAssembly(Assembly assembly, String[] args)    à System.AppDomain.ExecuteAssembly(String assemblyFile, Evidence assemblySecurity, String[] args)    à Microsoft.VisualStudio.HostingProcess.HostProc.RunUsersAssembly()    à System.Threading.ThreadHelper.ThreadStart_Context(Object state)    à System.Threading.ExecutionContext.Run(ExecutionContext executionContext, ContextCallback callback, Object state)    à System.Threading.ThreadHelper.ThreadStart()

      InnerException: 


    Alain D
    lundi 21 novembre 2011 12:38
  • A Patrice

    Pas plus de succès avec "Dispose"


    Alain D
    lundi 21 novembre 2011 12:39
  • On n'avait qu'un seul PictureBox ou on affichait tous les doublons en même temps dans plusieurs PictureBox ? A priori c'est prévu pour donc au pire il faut peut-être s'y prendre légèrement différemment (la récupérer, affecter nothing au picture box et appeler dispose ?) mais je ne vois pas spécialement de méthode fondamentalement différente.

    Je crois me souvenir avoir vu qq avec un pb de ce style sur une image en particulier (je crois me souvenir que c'est l'image qui était un peu hors norme style avec une résolution immense).

    Un autre point qui me vient à l'esprit est que si on affiche par exemple tous les doublons dans des picturebox de taille réduite, on peut occuper tout de même beaucoup de mémoire si on affiche les images originales (elles sont réduites à l'affichage mais présentes en mémoire avec leur résolution d'origine). Dans ce cas, le mieux est peut-être de créer des "vignettes" qui ne garderont en mémoire qu'une image nécessaire et suffisante pour l'affichage voulu.

    Ah, si l'image vient d'un fichier voir peut-être ce que donne ImageLocation ? Sinon il faudrait que je reproduise le problème... Une seule picturebox qui affiche successivement et automatiquement toutes les images présentes sur un PC repoduit il le problème ?


    Please always mark whatever response solved your issue so that the thread is properly marked as "Answered".
    lundi 21 novembre 2011 12:52
    Modérateur
  • Pour ce qui concerne la dernière question : Oui (en tout cas pour moi)

    Mais le problème d'Alain n'est peut être pas le même problème que le miens ...


    Cordialement,
    Xavier TALOUR
    Alias Troxsa SendMail
    Voir le profil de Xavier TALOUR sur LinkedIn
    lundi 21 novembre 2011 13:16
    Auteur de réponse
  • Cela ne plante pas sur une image en particulier ? J'essaierai de voir ce que cela donne de mon côté tout à l'heure...
    Please always mark whatever response solved your issue so that the thread is properly marked as "Answered".
    lundi 21 novembre 2011 14:06
    Modérateur
  •  

    Voila un bout code simple ou le problème ce produit chez moi (poste du travail)

        Private img() = Directory.GetFiles("C:\Users\Public\Pictures\Sample Pictures", "*.jpg", SearchOption.TopDirectoryOnly)
        Dim i As Integer = 0
        Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
            PictureBox1.Image = Image.FromFile(img(i))
    
            If img.Count - 1 = i Then
                i = 0
            End If
            i += 1
        End Sub
    

    Par contre quand je fais avec l'idée de Patrice Scribe cela ce produit quand même mais avec des fluctuantes beaucoup moins importante que le premier exemple, j'ai même l'impression qu'il fini par ce stabiliser a un moment donné

       Private img() = Directory.GetFiles("C:\Users\Public\Pictures\Sample Pictures", "*.jpg", SearchOption.TopDirectoryOnly)
        Dim i As Integer = 0
        Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
            If Not PictureBox1.Image Is Nothing Then PictureBox1.Image.Dispose()
            PictureBox1.Image = Image.FromFile(img(i))
    
            If img.Count - 1 = i Then
                i = 0
            End If
            i += 1
    
        End Sub
    


    donc l'idée de Patrice me semble être la bonne ... 

    Je pourrais amélioré mon petit programme avec cette solution


    Cordialement,
    Xavier TALOUR
    Alias Troxsa SendMail
    Voir le profil de Xavier TALOUR sur LinkedIn
    lundi 21 novembre 2011 14:39
    Auteur de réponse
  • Le "quelque" me fait plutôt penser que c'est une image en particulier (cela ne serait pas un fichier avec une extension JPG mais qui n'est pas au format JPG ?). J'ai créé un fichier qui liste tous les fichiers JPG de mon PC et je boucle dix fois sur la liste en chargeant l'image via Image.FromFile et j'ai arrêté le traitement à 3,5 Go (ce qui est donc plus que ne peux gérer une application .NET 32 bit donc pour moi la mémoire se libère bien).

    Pour info le code est (et je suis en .NET 4) :

        Private Sub Button1_Click(sender As System.Object, e As System.EventArgs) Handles Button1.Click
            Dim TotalSize As Long
            Dim c As Long
            For i = 1 To 10
                Using s As New IO.StreamReader("c:\jpg.txt", System.Text.Encoding.GetEncoding(850))
                    Dim Fichier As String = s.ReadLine
                    Do While Not Fichier Is Nothing
                        TotalSize += New IO.FileInfo(Fichier).Length
                        c += 1
                        Text = c & ", " & (TotalSize / 1024 / 1024).ToString("n1") & " Mo"
                        PictureBox1.Image = Image.FromFile(Fichier)
                        Fichier = s.ReadLine
                    Loop
                End Using
            Next
            Debug.WriteLine(c)
        End Sub
    
    

    D'ailleurs, Dispose ne fait qu'anticiper la libération de la mémoire donc sans Dispose cela devrait fonctionner aussi contrairement à ma première réponse. Soit donc on garde plutôt des références sur toutes ces images (ou d'autres structures volumineuses ce qui empêche leur libération, soit on a ce souci sur un fichier précis dont le format n'est pas reconnu ?)

     


    Please always mark whatever response solved your issue so that the thread is properly marked as "Answered".
    lundi 21 novembre 2011 14:40
    Modérateur
  • Ce qui me laisse perplexe c'est que j'ai déjà réalisé mon application sous Access; et je ne rencontre pas ce problème de mémoire insuffisante. (version 2003)

     Voici ce que je veux faire.

    Afficher une image de film (jpg) à partir de 2 fichiers:

    - le 1er est une liste de tous les titres de films (environ 700).

    - le 2 ème est un fichier archive (zip) contenant toutes les affiches correspondantes (ou presque).

    Le principe est celui qui j'ai trouvé sur un post de Gilles Tourreau, pour gérer une action à partir d'un fichier de commandes (.cmd).

    Donc je liste une partie des titres suivant un certain critère; et c'est depuis cette liste (listbox) que je sélectionne celui dont je veux voir l'affiche.

     


    Alain D
    lundi 21 novembre 2011 16:17
  • Désolé d'insister mais ce n'est pas sur un fichier en particulier ? Cela arrive par exemple au bout de combien de clicks ?

    Comme il faut cliquer j'imagine que cela arrive rapidement donc en réalité on ne sature pas la mémoire. Par contre, FromFile génère également OutOfMemoryException lorsque le fichier n'est pas reconnu (dommage, je pense qu'une exception plus spécifique aurait été préférable, je ne sais pas pourquoi MS a jugé bon de réutiliser cette exception pour un problème de format).

    Chez moi c'est ok avec les 8 fichiers par défaut de Windows et en cliquant 200 fois...

     


    Please always mark whatever response solved your issue so that the thread is properly marked as "Answered".
    lundi 21 novembre 2011 16:48
    Modérateur
  • Cela n'arrive pas sur un fichier en particulier ? Pour l'instant tous les essais que je fais semblent ok. Quel est le format des affiches ? Cela ne serait pas un super grand format style 4000 x 8000 ou qq chose comme cela ?
    Please always mark whatever response solved your issue so that the thread is properly marked as "Answered".
    lundi 21 novembre 2011 17:08
    Modérateur
  • le format est en général aux environs de 300/600.

    Le fichier est reconnu car la 1 ère fois il s'affiche et c'est après plusieurs affichages de fichiers différents que le problème se pause.

    C'est après 3 ou 4 affichages environ que ça part en erreur.

    Un message me signale une erreur d"exception; je fais continuer puis redemande l'affiche.

    Et cette fois, elle s'affiche ?????

    J'ai remarqué dans votre code (Patrice & Xavier) que vous utilisez "image.fromfile(fichier)"

    Comment avez-vous déclaré "Image"? 


    Alain D

    • Modifié papyx lundi 21 novembre 2011 19:50
    lundi 21 novembre 2011 17:39
  • Impossible de reproduire ce problème chez moi.

    Je suis sous Windows 7, .NET 4 (et non pas XP SP2, .NET 2.0 ou 3.5). Avec les 8 images par défaut de Windows en 1024x768 je peux cliquer 200 fois pour les afficher en boucle l'une après l'autre sans soucis. FromFile est une méthode statique donc on peut l'appeler directement sur la classe Image (http://msdn.microsoft.com/fr-fr/library/stf701f5.aspx).

    Si vous postez du code merci de le simplifier au maximum avant (ce qui vous permet soit de trouver le souci, soit de faciliter l'examen du code qui pose problème).

     


    Please always mark whatever response solved your issue so that the thread is properly marked as "Answered".
    mardi 22 novembre 2011 11:46
    Modérateur
  • Bonjour Patrice

    Je suis allé voir le post pour classe Image et j'ai voulu essayer la démo; mais je bloque sur "as Image"

    et "As PropertyItem".  Ceux-ci ne sont pas valides pour ma version.

     

    Je n'ai pas mis de code dans ce post; faut-il en mettre?


    Alain D
    • Modifié papyx mardi 22 novembre 2011 12:16
    mardi 22 novembre 2011 12:11
  • Il manque sans doute "Imports System.Drawing" (ou une référence à la DLL) mais ce code en particulier n'apportera pas grand chose.

    Je voulais juste dire que l'on peut faire :

    Dim img As Image=Image.FromFile(MonFichier)

    Image est simplement le nom de la classe. On appelle FromFile directement sur la classe (et non pas sur un objet Image) car FromFile ne fonctionne pas sur un objet Image en particulier mais charge un bitmap et retourne une nouvelle image.

    Je me disais qu'effectivement il faudrait poster le code le plus simple possible qui montre le problème. Pour l'instant je n'arrive pas à reproduire ce problème de mon côté donc soit il s'agit d'un problème particulier à tel fichier ou à XP/.NET 2.0/3.5 soit il y a qq chose d'autres dans le code qui coince ?


    Please always mark whatever response solved your issue so that the thread is properly marked as "Answered".
    • Marqué comme réponse papyx mercredi 23 novembre 2011 07:59
    mardi 22 novembre 2011 12:55
    Modérateur
  • Je constate qu'après l'affichage d'une image, je n'ai pas de problème si je là rappelle.

    Ex. j'affiche une 10 ne d'images avec "continuer" (comme j'ai indiqué plus haut); puis je peux les rappeler autant de fois que je veux, sans problème.

    Voila une partie de mon code:

     

        Sub affichage(ByVal ima As String)
            Me.Affiche.Image = Image.FromFile(ima)
            If Not Me.Affiche.Image Is Nothing Then Me.Affiche.Show()
            Dim fx As New System.IO.FileInfo(ima)
            Label7.Text = Str(fx.Length) & " octets"
        End Sub
    


    PS. je viens de transférer l'appli sur un autre PC et je n"est plus d'erreur.

    Faut-il fermer ce post et le considérer comme résolu?


    Alain D
    • Modifié papyx mardi 22 novembre 2011 15:29
    mardi 22 novembre 2011 15:12
  • Bonjour, Alain,

     

    Si vous considérez que votre problème a été résolu, vous pouvez utiliser l’option « Marquer comme réponse » pour les messages qui vous ont aidé à trouver la solution.

     

    Cordialement,

     

    Cipri


    Suivez MSDN sur Twitter   Suivez MSDN sur Facebook


    Ciprian DUDUIALA, MSFT  
    •Nous vous prions de considérer que dans le cadre de ce forum on n’offre pas de support technique et aucune garantie de la part de Microsoft ne peut être offerte.

    mercredi 23 novembre 2011 07:41
  • Bonjour Patrice

    J'ai trouvé la raison de mon problème.

    Comme je fais une extraction de mes images depuis un fichier archive, au moyen d'un fichier de commande (.cmd); laquelle est exécuté de façon asynchrone par mon applic.

    Celles-ci ne sont pas encore disponibles, au moment de l'affichage. Il a suffit que je temporise, juste avant

    (500 millisecondes) pour que cela fonctionne impécablement.

    Donc cela explique que lorsque j'avais déjà affiché une image, le rappel de celle-ci ne donnait plus d'erreur.


    Alain D
    jeudi 1 décembre 2011 09:49
  • Très bien et merci de nous avoir donné l'explication de ce mystère ;-)
    Please always mark whatever response solved your issue so that the thread is properly marked as "Answered".
    jeudi 1 décembre 2011 09:52
    Modérateur