우리 시스템은 많은 양의 큰 비트 맵 (System.Drawing.Bitmap)을 사용하고 때때로 메모리가 부족하여 "매개 변수가 유효하지 않습니다"라는 오류가 발생합니다. 대용량의 연속 된 메모리를 할당하기가 어려울 수 있기 때문에 이는 의미가 있습니다.64 비트 시스템의 GDI +
문제는 ... 시스템을 64 비트로 업그레이드하면이 문제가 사라질까요?
우리 시스템은 많은 양의 큰 비트 맵 (System.Drawing.Bitmap)을 사용하고 때때로 메모리가 부족하여 "매개 변수가 유효하지 않습니다"라는 오류가 발생합니다. 대용량의 연속 된 메모리를 할당하기가 어려울 수 있기 때문에 이는 의미가 있습니다.64 비트 시스템의 GDI +
문제는 ... 시스템을 64 비트로 업그레이드하면이 문제가 사라질까요?
이것은 큰 개체 힙의 조각화로 인해 20 개가 넘는 이미지가로드 된 후 100MB 청크를 할당하는 데 어려움이있을 수 있습니다. 64 비트로 이동하는 것이 도움이 될 것입니다. 훨씬 더 큰 주소 공간은 힙에 충분한 작업 공간을 제공해야하며 따라서 증상을 완화시켜야합니다.
메모리 문제로 인해 OutOfMemoryException이 발생해야하지만, .net의 비트 맵 처리 코드가이를 catch하여 InvalidParameterException으로 효과적으로 변환 될 수 있습니다. 그러나 이미지의 크기/형식과 관련하여 또 다른 문제가있을 수 있으며 실제로는 잘못된 매개 변수입니다.
I ju st testet을 64 비트 시스템에서 사용했고 각각 20000x20000 픽셀의 6 비트 맵을 만들 수있었습니다. (~ 1.5GB 이미지) 이것은 32 비트 시스템에서 가능한 한 가까이 있지 않습니다. – LaZe
얼마 전에 비스타 64 비트 시스템에서 Visual Studio 2008로 개발할 때 종종 이런 종류의 오류가 발생했습니다. 그래서 64Bit로 옮겨 가면 성공할 확률이 높아지고 오류 발생 빈도는 줄어들지 만, 64 비트로 옮겨 가면 완전히 치유된다고 추측하지는 않습니다.
이 링크 나를 도와이었다 무엇: http://confluence.jetbrains.net/display/ReSharper/OutOfMemoryException+Fix
그것은 메모리 할당 정책을 대체하는 래퍼를 s.t. 당신은 큰 연속적인 메모리 덩어리를 얻는 경향이 있습니다. 어쩌면 응용 프로그램에서 유사한 메모리 할당 정책을 사용할 수도 있습니다. 왜냐하면이 응용 프로그램은 Visual Studio 만 랩핑하기로되어 있기 때문입니다.
시스템에서 만들 수있는 비트 맵의 크기에는 제한이 있습니다.
시스템 제한을 표시 할 수있는 프로그램에 대해 http://www.efg2.com/Lab/Graphics/VeryLargeBitmap.htm을 확인하십시오.
아마 당신은 그 한도를 치고 있습니다.
큰 비트 맵을 할당하기 전에 GC.Collect()를 호출 해 볼 수 있습니다. 나는 최근에이 문제가 정확히 있었고, 그것이 도움이되었습니다. (내 첫 반응은 64 비트로 이동했지만 한 줄의 코드를 추가하는 것이 조금 더 간단했습니다 .-)
안녕하세요, 저는 실제로 그렇게했고, 도움이되었습니다 ...하지만 문제는 다시 돌아 왔습니다. – LaZe
일반적으로 메모리에서 거대한 비트 맵으로 재생을 시작하면 항상 이런 종류의 발행물. 이 문제를 피하는 가장 좋은 방법은 이미지를 배열이나 비슷한 것으로 분할하여 그리드를 생성하는 것입니다.
부터는 많은 메모리를 절약 할 수있는 화면 만로드하거나로드해야합니다.
나는 약간의 시간을 죽일 작은 게임을 만들기로 결정했을 때 이런 일이 일어났습니다.
나는 Maze/Pipe 게임을 만들기로 결정했고 사용자는 열과 행의 수를 선택할 수있었습니다. 10000px로 이미지를 제한하기로 결정했습니다.
내 첫 번째 시도, 나는 당신의 문제를 정확히했습니다. 오류 발생 후 오류, 주로 메모리 문제.
내가 원하는 것을 수행하는 방법에 대한 연구를하기로 결심했다.내가 무슨 짓을
내가 (I 1000 1000의 최대를 제한하기로 결정) 동적 2 차원 배열을 생성하고 난 그냥 그들에 사용자가 결정하는 작은 10 × 10 픽셀 이미지 또는 무엇이든을 넣어이다.
이 완료되었을 때, 메모리/로딩 속도/등의 문제가 ... 간단하게 사라졌다. 내 수정이 공연을 통해 쉽게 전에 당신이 그것을 시도이 다운로드에 찾아 가고 싶은 경우에 당신이 한계를
를 사용할 때
메모리 사용은 응용 프로그램의 현재 메모리 사용량은 150 사이 225 메가 램입니다 my little games
비트 맵이 어떻게 생성되었는지에 따라 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를 얻을 수있을 것이다하지만 실행하기 위해)
팁 주셔서 감사. 그것은 GdipCreateBitmapFromScan0을 사용하는 것으로 보이므로 시스템 메모리를 사용합니다. – LaZe
이전 비트 맵 (Scan0)에서 비트 맵을 생성하므로 비트 맵은 메모리가 할당 된 위치입니다. –
얼마나 큰 이야기입니까? 또한 메모리가 부족하여 "매개 변수가 유효하지 않습니다"오류가 발생 했습니까? –
안녕하세요. 비트 맵은 쉽게 5000x5000이 될 수 있습니다. 오류를 재현 할 수 있습니다. 샌드 박스 응용 프로그램은, 나의 추측은 메모리 문제입니다.이 C#을 -question 이유 – LaZe
당신이 그냥 뷰어 응용 프로그램에서 비트 맵을 개방하고 있습니까? 우리에게 수 또는 비트 맵 코드를 개발하거나 시각적 당신에게 열려있는 비트 맵을해야합니까된다 스튜디오 ...? –