3 votes

Échec de l'allocation d'octets dans les grandes images OpenCV

Je traite de très grandes images mais je reçois une exception qui m'informe que "Failed to allocate 991623040 bytes".

Je dispose de Win7 64 bits et de 8 Go de RAM. N'est-il pas ridicule d'échouer lorsque la taille est inférieure à 1 Go ?

Comment puis-je résoudre ce problème ?

public bresenhamCircle()
    {
        if (path != null) //path is a string represents the file path
        {
            using (IplImage orgImg = new IplImage(rc.imgeYolu, LoadMode.GrayScale))
            {
                if (rc.sekizBit)
                {
                    orgImg.ToBitmap();
                }
                else
                {
                    //binary image
                }

                using (IplImage imgLabel = new IplImage(orgImg.Size, BitDepth.F32, 1))
                {
                    using (CvBlobs blobs = new CvBlobs())
                    {

                        uint result = blobs.Label(orgImg, imgLabel);
                        blobs.FilterByArea(10, 130);
                    }
                }

            }
        }
        else
        {
            throw new Exception("smtg..");
        }

    }

Je reçois le message d'erreur à cette ligne : using (IplImage imgLabel = new IplImage(orgImg.Size, BitDepth.F32, 1))

1voto

rossb83 Points 818

Il peut y avoir plusieurs raisons ; le plus probable est que vous avez des fuites de mémoire. Nous aurions besoin de voir votre code, le code ci-dessus semble que vous ne déclarez pas les images comme des pointeurs en utilisant l'opérateur "*", mais c'est probablement une faute de frappe. De plus, ce n'est pas parce que vous avez un Windows 64 bits et 8 Go de RAM, que si vous utilisez une version 32 bits d'opencv, vous n'avez accès qu'à 2 Go de RAM. Je vous recommande de télécharger la dernière version SVN d'opencv, de construire en mode 64 bits et d'activer tbb.

1voto

Vipin Kumar Points 114

Si vous n'exécutez pas votre application en mode 64 bits, vous n'utilisez pas 8 Go de RAM. De plus, le manque de mémoire est dû à l'insuffisance d'espaces d'adresses virtuelles contiguës, et non d'espaces d'adresses physiques (voir article). http://vpnchoudhary.blogspot.com/2011/03/out-of-memory-exception-simple.html pour plus de détails sur la gestion de la mémoire d'une application 32 bits.

Vérifiez d'abord si votre application fonctionne en 64 ou non. Ouvrez task mgr et voyez si votre application est accompagnée de *32 à la fin. Si oui, votre application fonctionne en mode 32 bits. Compilez votre application pour 64 bits. Cela devrait résoudre votre problème. Si votre application est déjà exécutée en 64 bits, alors votre application perd de la mémoire, mais j'en doute fortement car vous utilisez "using" qui devrait s'occuper de l'élimination des objets. De plus, avec une application 64 bits, vous avez d'énormes espaces d'adressage virtuels qui sont difficiles à épuiser, votre application commencera à se battre (très lentement) mais sera rarement à court de mémoire.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X