2014-11-06 4 views
0

나는이 답변을 알고 있지만 맹세코 잊었습니다.많은 이미지가로드되면 메모리가 부족합니다.

이 기능이 있습니다. 비트 맵을로드하고 그립니다. 그것은 연속적으로 빠르게 호출 될 수 있습니다. 300 비트 정도가 지난 후에 System.OutOfMemoryException으로 응용 프로그램이 충돌합니다.

private void PaintPicture() 
    { 
     string FullPath = Global.RunttimePath + EditType.FilePath; 

     if (File.Exists(FullPath)) 
     { 
      Image i = Image.FromFile(FullPath); 
      //DrawImage(i, pnlPicture, pbColor.BackColor); //I disabled this so the problem is not here 
      i.Dispose(); 
      //GC.Collect(); //I know I know... I should never call GC. So disabled it :) 
     } 
     else 
     { 
      //DrawImage(Properties.Resources.Fail800, pnlPicture, Color.White, true); 
     } 
    } 
+1

을 당신은 당신의 예제 코드에서 아무런 일도하지 않았다. 문제의 원인은 다른 곳에 있으며이 코드는 단지 "St 원래 낙타를 부러 뜨 렸습니다. "또는 문제는 여기에 질문을 게시하기 위해 제거한 코드에 있습니다. –

+0

이미지는 GDI 리소스이며 어쨌든 GC가 없습니다. – TaW

답변

3

Image.FromFile의 문서에 따르면, 당신은 OutOfMemoryException를 얻을 수 있습니다. 응용 프로그램이 사용하려는 모든 이미지를 안전하게로드하고 동일한 이미지에서 항상 충돌하는지 확인하십시오.

항상 동일한 이미지라면 Photoshop 또는 Paint.Net 또는 다른 무료 도구를 사용하여 지원되는 픽셀 형식으로 이미지를 다시 저장해보십시오. 그러면 응용 프로그램을 손상시키는 특정 이미지가 수정됩니다.

또한 드로잉 논리 주위에 예외 처리기를 추가하여 잘못된 이미지가 실행될 때 응용 프로그램이 중단되지 않도록하십시오. GDI +는 비교적 적은 수의 이미지 형식 만 지원합니다.

실제로 메모리가 부족한 경우 (누수가있는 경우) 응용 프로그램이 실행되는 동안 메모리 사용을 모니터링하려면 확인하십시오. 메모리 누수의 징조가 보이면 문제는 다른 곳에서 발생할 가능성이 큽니다.

편집 :

Image.FromStream를 사용하는 대신 FromFile()에 대해 조언을 이러한 질문/답변을 읽기 - 그렇게 오랜 시간 동안 파일 잠금 피한다 :

File.Delete failing when Image.FromFile was called prior it, despite making copy of loaded image and destroying original one

out of memory Image.FromFile

+0

오 ~ 음 ... 알아요. 나는 이것을 체크해야했습니다. 4623 개의 이미지 중 12 개의 이미지가 손상되었습니다. 쓰레드 로더 때문에 나는 그것들 중 하나에 충돌했다. 모든 사람의 도움에 감사드립니다 :) – user2888973

+0

@ user2888973 그게 뭔지 알지만, 나는 과거에 비슷한 문제에 부딪쳤다. 거대한 폴더에서 불량 이미지를 찾아내는 것은 어렵습니다. – xxbbcc

+0

@ user2888973'FromStream()'이'FromFile()'보다 나은 이유를 설명하는 링크를 추가했습니다. – xxbbcc

1

이 가능성이 문제가 해결되지 않습니다 : 내가 잘못 다시 뭐하는 거지 말해,하지만 이미지 클래스는 IDisposable 구현하십시오. 그것은 USING 문에서 래핑 할 수 있음을 의미합니다. 이는 내부의 객체가 범위 밖으로 나 가면서/더 적은 객체가 L2 가비지 수집에서 생존하게 만듭니다 (사용 대 처형에서 래핑하는 것 사이에 차이를 만들어서는 안되지만 실제로 메모리 프로파일 링을 통해 찾았습니다). 비트 맵은 알 수없는 형식 인 경우

if (File.Exists(FullPath)) 
    { 
     using(Image i = Image.FromFile(FullPath)) 
     { 
      DrawImage(i, pnlPicture, pbColor.BackColor); //I disabled this so the problem is not here 
      //GC.Collect(); //I know I know... I should never call GC. So disabled it :) 
     } 
    } 
    else 
    { 
     //DrawImage(Properties.Resources.Fail800, pnlPicture, Color.White, true); 
    } 
} 
+0

+1 내 코드 능률화를 위해 – user2888973

관련 문제