Jump to content
Duart3x

Erro System.OutOfMemoryException: 'Memória esgotada.'

Recommended Posts

Duart3x

Estou a desenvolver um projeto em c# Windows Form com o Visual Studio e quando estou a adicionar imagens a uma ImageList aparece este erro:

System.OutOfMemoryException: 'Memória esgotada.'


            for (int i = 1; i <= 30; i++)
            {
                string imagem;

                imagem = "ima/" + i +".png";

                //MessageBox.Show(imagem);
                imageList.Images.Add(Image.FromFile(imagem));

                Task.Delay(1000);
            }

O que devo fazer para resolver isto?

Share this post


Link to post
Share on other sites
M6

Aumentas a RAM ou fazes uma gestão mais inteligente da mesma, por exemplo, não carregas as imagens para memória exceto no momento em que as tens mostrar e nessa altura vais descartando e carregando as mesmas conforme necessitas.
 

Edited by M6

10 REM Generation 48K!
20 INPUT "URL:", A$
30 IF A$(1 TO 4) = "HTTP" THEN PRINT "400 Bad Request": GOTO 50
40 PRINT "404 Not Found"
50 PRINT "./M6 @ Portugal a Programar."

 

Share this post


Link to post
Share on other sites
Duart3x
6 minutos atrás, M6 disse:

Aumentas a RAM ou fazes uma gestão mais inteligente da mesma, por exemplo, não carregas as imagens para memória exceto no momento em que as tens mostrar e nessa altura vais descartando e carregando as mesmas conforme necessitas.
 

Pois, o programa que estou a a fazer é um Quiz... 

Que tem uma lista de uma classe que eu criei que tem como parâmetros pergunta, 4 respostas para cada Pergunta e o índice da resposta certa. 

Essa lista tem 30 perguntas! 

Depois tenho um método para sortear um número que vai ser o índice de uma pergunta na lista que criei. 

Depois mostro a respectiva pergunta e depois disso elimino da lista essa pergunta que é para não voltar a aparecer aquela pergunta! 

E eu agora queria que ao lado de cada pergunta aparecesse uma imagem alusivo ao tema da pergunta! 

E para isso eu tava a tentar usar o mesmo método que fiz para as perguntas! 

Um número é sorteado, vai buscar a imagem, mostra a imagem e elimina a imagem! 

As imagens ao total só ocupam 2mb. 

 

Já agora como é que eu aumento a memória RAM que o programa pode usar? 

Share this post


Link to post
Share on other sites
M6

Presumo que não mostres as perguntas todas ao mesmo tempo.
Assim podes guardar apenas a localização das imagens, em vez das imagens em si, e carregas a imagem apenas quando necessitas.


10 REM Generation 48K!
20 INPUT "URL:", A$
30 IF A$(1 TO 4) = "HTTP" THEN PRINT "400 Bad Request": GOTO 50
40 PRINT "404 Not Found"
50 PRINT "./M6 @ Portugal a Programar."

 

Share this post


Link to post
Share on other sites
Duart3x

Fiz isso mas mesmo assim dá erro...

 

Criei uma lista de strings para guardar as localizaçoes depois criei esta funçao

List<string> UrlList = new List<string>();

public void AddImages()
        {

            for (int i = 1; i <= 30; i++)
            {
                string imagem;

                imagem = "ima/" + i +".png";

                //MessageBox.Show(imagem);
                UrlList.Add(imagem);

                Task.Delay(1000);
            }
        }
			Image DysplayImage;

			Random numero = new Random();
            temp = numero.Next(0, PERGUNTASLISTA.Count);

            DysplayImage = Image.FromFile(UrlList[temp]);
            pictureBox1.Image = DysplayImage;

            Pergunta.Text = PERGUNTASLISTA[temp].pergunta;
            button1.Text = PERGUNTASLISTA[temp].respostas[0];
            button2.Text = PERGUNTASLISTA[temp].respostas[1];
            button3.Text = PERGUNTASLISTA[temp].respostas[2];
            button4.Text = PERGUNTASLISTA[temp].respostas[3];

 

Mas mesmo assim dá erro de memoria esgotada!

Share this post


Link to post
Share on other sites
M6

Quanta RAM tem a máquina?

É um Windows de 32 ou 64 bits?

Qual a memória que a tua aplicação ocupa em memória?

Edited by M6

10 REM Generation 48K!
20 INPUT "URL:", A$
30 IF A$(1 TO 4) = "HTTP" THEN PRINT "400 Bad Request": GOTO 50
40 PRINT "404 Not Found"
50 PRINT "./M6 @ Portugal a Programar."

 

Share this post


Link to post
Share on other sites
Duart3x
9 horas atrás, M6 disse:

Quanta RAM tem a máquina?

É um Windows de 32 ou 64 bits?

Qual a memória que a tua aplicação ocupa em memória?

Então, a máquina tem 16GB de RAM, processador com 8 núcleos.... 

64 bits como é óbvio 

Ocupa por volta de 20mb 

Share this post


Link to post
Share on other sites
M6
On 4/10/2019 at 6:48 PM, Duart3x said:

Então, a máquina tem 16GB de RAM, processador com 8 núcleos.... 

64 bits como é óbvio 

Ocupa por volta de 20mb 

20Mb parece-me um bocado de mais para o tipo de aplicação que é, mas enfim, já lá vai o tempo em que se fazia magia com 48Kb de RAM :D

Estás a compilar para 64 ou 32 bits?
Em 32 bits existem algumas limitações de RAM, mas mesmo com 20Mb (presumo que seja o somatório dos vários tipos de memória usada pela aplicação) esta-se longe desse limite.

Há ai qualquer coisa mal na aplicação, e não estou confiante de que o problema seja das imagens em si, isso pode ser só o ponto que trás ao de cima o problema.
Lembro-me de há muitos anos atrás ter um problema semelhante em Delphi, e após longas horas de debug, percebi que o que estava a acontece era simples: faltava desalocar um apontador...

Uma situação dessas dificilmente conseguirás ajuda "séria" pelo fórum, apenas podemos discutir hipóteses e dar dicas para procurar o problema.
Assim sendo, liga o debug e tenta compreender o que estás a fazer para fazer crescer a memória e o que podes fazer para a ir libertando. Tenta correr o garbage collector manualmente após operações que são mais intensas a nível de memória, em especial após situações onde deixas de necessitar, ou libertas, objetos.


10 REM Generation 48K!
20 INPUT "URL:", A$
30 IF A$(1 TO 4) = "HTTP" THEN PRINT "400 Bad Request": GOTO 50
40 PRINT "404 Not Found"
50 PRINT "./M6 @ Portugal a Programar."

 

Share this post


Link to post
Share on other sites
Rui Carlos

Alguma razão para limitar a memória a 20MB?

Não trabalho com C#, mas em Java diria que a JVM sozinha usa mais que 20MB, e os GC não se costumam dar bem com pouco memória livre.

Share this post


Link to post
Share on other sites
M6
On 4/20/2019 at 4:03 PM, Rui Carlos said:

Alguma razão para limitar a memória a 20MB?

Não trabalho com C#, mas em Java diria que a JVM sozinha usa mais que 20MB, e os GC não se costumam dar bem com pouco memória livre.

Não há limite algum imposto, a aplicação é que está a usar 20Mb.


10 REM Generation 48K!
20 INPUT "URL:", A$
30 IF A$(1 TO 4) = "HTTP" THEN PRINT "400 Bad Request": GOTO 50
40 PRINT "404 Not Found"
50 PRINT "./M6 @ Portugal a Programar."

 

Share this post


Link to post
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Reply to this topic...

×   Pasted as rich text.   Restore formatting

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.


×
×
  • Create New...

Important Information

By using this site you accept our Terms of Use and Privacy Policy. We have placed cookies on your device to help make this website better. You can adjust your cookie settings, otherwise we'll assume you're okay to continue.