2009-07-18 4 views
3

크기가 4GB를 넘는 이미지를로드하려고 시도 할 때 예외를 throw하는 이미지 조작 라이브러리를 사용하고 있습니다. 그것은 64 비트라고 주장하지만 64 비트 라이브러리는 이미지를로드하는 것을 허용하지 않습니다. 필자는 64 비트 메모리 모델/컴파일러를 사용하여 C 라이브러리를 다시 컴파일했지만 여전히 부호없는 정수를 사용하고 64 비트 유형을 사용하는 업그레이드에 실패했다고 생각합니다.64 비트 라이브러리는 4GB로 제한됩니까?

그게 합당한 결론입니까?

편집 - 나중에 생각해 보면 OS 메모리가 너무 커지므로 큰 덩어리 할당이 더 이상 가능하지 않습니다. (재부팅 한 직후에는 작동하지 않지만 이상하게 생각할 수도 있습니다.) .NET에서 무엇을 할 수 있습니까? .NET 관리 메모리가 너무 많은 조각이 할당되지 않도록 조각화 될 수 있습니까?

+0

거기에는 32 비트 엔 테리아가 많이 있습니다. 80 년대 이후로 쓰고 있습니다. 진정한 64 비트 지원은 사람들이 OS, 라이브러리 및 파일 시스템의 일부를 다시 작성함에 따라 서서히 발생합니다. – NoMoreZealots

+0

궁금한 점 : 4GB가 넘는 이미지를 어떤 종류로로드하고 있습니까? – jkeys

+2

후크 : 압축되지 않은 고해상도 비트 맵은 매우 클 수 있습니다. –

답변

4

정확한 원인은 여러 가지 일 수 있습니다. 예를 들어 어떤 OS를 실행하고 있습니까? 얼마나 많은 RAM/스왑을 가지고 있습니까? 응용 프로그램/OS가 가상 메모리를 과도하게 커밋하지 않아 이미지를 여는 데 4GB 이상의 여유 공간이 필요합니다.

관심이 있으신 분은 4GB 경계에서 확실히 멈추는 것 같습니다. 즉, 3.99GB 이미지는 성공하지만 4GB 하나는 실패합니다. 그렇다면 32 비트 크기의 확실한 사용을 제안하는 것입니다. 라이브러리 데이터 구조.

업데이트 안부

두 번째 질문 - 정말. 거의 모든 최신 OS는 가상 메모리를 사용하므로 각 프로세스는 자신의 인접한 주소 공간을 갖습니다. 프로세스의 주소 공간에있는 하나의 인접한 영역은 인접한 물리적 RAM에 의해 뒷받침 될 필요가 없으며 인접한 것처럼 보이도록 여러 개의 RAM 물리적 영역으로 구성 될 수 있습니다. 그래서 OS는 4GB의 덩어리를 응용 프로그램에주기 위해 4GB의 RAM 덩어리가 필요하지 않습니다.

응용 프로그램이 인접한 4GB 영역을위한 공간이 없도록 가상 주소 공간을 조각 낼 수는 있지만 64 비트 주소 공간의 크기를 고려하면 시나리오에서는 거의 불가능합니다.

+0

네, 이미지가 실제로 4GB 이하로로드됩니다. WinXP 64에서 8GB RAM을 사용하고 있습니다. –

+0

@roygbiv : 어떤 경우에는 돈을 가지고 있다고 생각합니다. '64 비트 라이브러리 '이지만 일부 데이터 구조는 사물을 4GB로 제한하고 있습니다. – DaveR

1

예, 바이너리 파일 형식 자체가 이미지 크기를 제한하지 않는 한 가능합니다.

1

당신의 후속 답변에 답하기 위해 최근에 this 기사를 읽고 재미있었습니다.

그리고 네, .NET은 memory fragmentation에 문제가있을 수 있습니다.

+0

@colithium - 뛰어난 독서력! 고맙습니다. –