2010-04-16 9 views
0

우리 시스템은 많은 양의 큰 비트 맵 (System.Drawing.Bitmap)을 사용하고 때때로 메모리가 부족하여 "매개 변수가 유효하지 않습니다"라는 오류가 발생합니다. 대용량의 연속 된 메모리를 할당하기가 어려울 수 있기 때문에 이는 의미가 있습니다.64 비트 시스템의 GDI +

문제는 ... 시스템을 64 비트로 업그레이드하면이 문제가 사라질까요?

+0

얼마나 큰 이야기입니까? 또한 메모리가 부족하여 "매개 변수가 유효하지 않습니다"오류가 발생 했습니까? –

+0

안녕하세요. 비트 맵은 쉽게 5000x5000이 될 수 있습니다. 오류를 재현 할 수 있습니다. 샌드 박스 응용 프로그램은, 나의 추측은 메모리 문제입니다.이 C#을 -question 이유 – LaZe

+0

당신이 그냥 뷰어 응용 프로그램에서 비트 맵을 개방하고 있습니까? 우리에게 수 또는 비트 맵 코드를 개발하거나 시각적 당신에게 열려있는 비트 맵을해야합니까된다 스튜디오 ...? –

답변

3

이것은 큰 개체 힙의 조각화로 인해 20 개가 넘는 이미지가로드 된 후 100MB 청크를 할당하는 데 어려움이있을 수 있습니다. 64 비트로 이동하는 것이 도움이 될 것입니다. 훨씬 더 큰 주소 공간은 힙에 충분한 작업 공간을 제공해야하며 따라서 증상을 완화시켜야합니다.

메모리 문제로 인해 OutOfMemoryException이 발생해야하지만, .net의 비트 맵 처리 코드가이를 catch하여 InvalidParameterException으로 효과적으로 변환 될 수 있습니다. 그러나 이미지의 크기/형식과 관련하여 또 다른 문제가있을 수 있으며 실제로는 잘못된 매개 변수입니다.

+1

I ju st testet을 64 비트 시스템에서 사용했고 각각 20000x20000 픽셀의 6 비트 맵을 만들 수있었습니다. (~ 1.5GB 이미지) 이것은 32 비트 시스템에서 가능한 한 가까이 있지 않습니다. – LaZe

0

얼마 전에 비스타 64 비트 시스템에서 Visual Studio 2008로 개발할 때 종종 이런 종류의 오류가 발생했습니다. 그래서 64Bit로 옮겨 가면 성공할 확률이 높아지고 오류 발생 빈도는 줄어들지 만, 64 비트로 옮겨 가면 완전히 치유된다고 추측하지는 않습니다.

이 링크 나를 도와이었다 무엇

: http://confluence.jetbrains.net/display/ReSharper/OutOfMemoryException+Fix

그것은 메모리 할당 정책을 대체하는 래퍼를 s.t. 당신은 큰 연속적인 메모리 덩어리를 얻는 경향이 있습니다. 어쩌면 응용 프로그램에서 유사한 메모리 할당 정책을 사용할 수도 있습니다. 왜냐하면이 응용 프로그램은 Visual Studio 만 랩핑하기로되어 있기 때문입니다.

0

시스템에서 만들 수있는 비트 맵의 ​​크기에는 제한이 있습니다.

시스템 제한을 표시 할 수있는 프로그램에 대해 http://www.efg2.com/Lab/Graphics/VeryLargeBitmap.htm을 확인하십시오.

아마 당신은 그 한도를 치고 있습니다.

0

큰 비트 맵을 할당하기 전에 GC.Collect()를 호출 해 볼 수 있습니다. 나는 최근에이 문제가 정확히 있었고, 그것이 도움이되었습니다. (내 첫 반응은 64 비트로 이동했지만 한 줄의 코드를 추가하는 것이 조금 더 간단했습니다 .-)

+0

안녕하세요, 저는 실제로 그렇게했고, 도움이되었습니다 ...하지만 문제는 다시 돌아 왔습니다. – LaZe

1

일반적으로 메모리에서 거대한 비트 맵으로 재생을 시작하면 항상 이런 종류의 발행물. 이 문제를 피하는 가장 좋은 방법은 이미지를 배열이나 비슷한 것으로 분할하여 그리드를 생성하는 것입니다.

부터는 많은 메모리를 절약 할 수있는 화면 만로드하거나로드해야합니다.

나는 약간의 시간을 죽일 작은 게임을 만들기로 결정했을 때 이런 일이 일어났습니다.

나는 Maze/Pipe 게임을 만들기로 결정했고 사용자는 열과 행의 수를 선택할 수있었습니다. 10000px로 이미지를 제한하기로 결정했습니다.

내 첫 번째 시도, 나는 당신의 문제를 정확히했습니다. 오류 발생 후 오류, 주로 메모리 문제.

내가 원하는 것을 수행하는 방법에 대한 연구를하기로 결심했다.내가 무슨 짓을

내가 (I 1000 1000의 최대를 제한하기로 결정) 동적 2 차원 배열을 생성하고 난 그냥 그들에 사용자가 결정하는 작은 10 × 10 픽셀 이미지 또는 무엇이든을 넣어이다.

이 완료되었을 때, 메모리/로딩 속도/등의 문제가 ... 간단하게 사라졌다. 내 수정이 공연을 통해 쉽게 전에 당신이 그것을 시도이 다운로드에 찾아 가고 싶은 경우에 당신이 한계를

를 사용할 때

메모리 사용은 응용 프로그램의 현재 메모리 사용량은 150 사이 225 메가 램입니다 my little games

1

비트 맵이 어떻게 생성되었는지에 따라 DDB인지 DIB 비디오 메모리인지 또는 시스템 메모리인지 (DDB는 비디오 메모리, DIB의 시스템 메모리를 사용함) 사용됩니다. 당신은 당신이 갈 때 DDB가 생성 예를 들어, 사용하는 생성자 ...에 따라 각 하나가 생성 될 때 결정하기 위해 DotNet reflector를 사용해야합니다 :

var bmp = new Bitmap(width, height, pixelDepth) 

을하고이 5000x5000의 크기 제한을 할 수 있습니다 작은 비디오 카드가 장착 된 컴퓨터에서 당신은 내가 어떻게 알아내는 많은 행운이 없었어요 당신이

var bmp = new Bitmap(pathToLargeFilename); 

와 10000x10000 비트 맵을로드 할 수 있습니다 찾을 수있는 반면, (당신이 웹 서비스를 실행 할 수있는 즉, 서버) 강제로 생성 DIB in Dotnet (제 추측은 가장 쉬운 방법은 비트 맵 구조의 수동 생성, 메모리, 그런 다음 어떻게 든 비트 맵으로 캐스팅합니다. 아니면 가장 좋은 건 (비디오 메모리를 사용하지 않는 다른 이미지 라이브러리로 이동하는 것입니다 거기에 꽤 몇 가지 오픈 소스 사람 FreeImage, ImageMagick, Cairo (당신은 적어도 그것을 위해 모노에서 GTK packages를 얻을 수있을 것이다하지만 실행하기 위해)

+0

팁 주셔서 감사. 그것은 GdipCreateBitmapFromScan0을 사용하는 것으로 보이므로 시스템 메모리를 사용합니다. – LaZe

+0

이전 비트 맵 (Scan0)에서 비트 맵을 생성하므로 비트 맵은 메모리가 할당 된 위치입니다. –

관련 문제