2012-03-09 2 views
0

거대한 관리되지 않는 행렬 구조 (즉, std::vector<std::vector<T> >)를 동일한 관리 구조 (cli::array<T,2>)로 재 할당하기 위해 노력하고있는 코드를 얻으려고했습니다. 한 번에 두 구조를 모두 메모리에 보관할 수 없기 때문에 파일에 쓰고 구조를 다시 읽는 방법을 선택했습니다. 문제는 일단 원래의 행렬을 삭제하면 행렬에 대한 관리 메모리를 할당하려는 메모리가 실패합니다.행렬을 관리되지 않음에서 관리로 재 할당

I 이미지에는 다른 런타임의 힙과 관련이있을 수 있습니다. cpp vs clr. 그러나 구체적인 세부 사항을 찾을 수 없습니다. cpp 런타임이 힙 공간을 유지하고, clr 힙이 행렬을 다시 할당하지 못하게 할 수 있습니까? 그렇다면, clr 힙을위한 공간을 만들기 위해 cpp 런타임이 힙 공간을 정리하도록 강제 할 수 있습니까?

이제 명확하게하기 위해 대상 행렬은 가변 배열이 아닌 2 차원 배열이어야합니다. 이 크기를 조정할 수없는 문제가 있음을 알고 있습니다. 그렇지 않으면 작은 덩어리로 행렬을 이동할 수 있습니다.

미리 감사드립니다.

+0

지그재그 배열을 사용할 수없는 것은 인위적인 제한입니다. 확실히 주소 공간 조각화 문제를 해결합니다. 64 비트 운영 체제가 간단한 해결 방법입니다. –

답변

0

동시에 메모리에 둘 모두를 가질 수 없다면 배열의 크기가 기가 바이트 이상인 것 같습니다. 이를 관리되는 직사각형 (지그재그가 아닌) 배열에 넣으려면 CLR이 기가 바이트의 인접한 메모리를 찾아야합니다 ... 쉽게 실패 할 수 있습니다.

"큰 주소 인식"으로 선언 된 64 비트 버전 또는 32 비트 버전을 실행 해 보셨습니까? 후자는 64 비트 Windows 컴퓨터에서 실행되는 경우 4 기가 바이트의 주소 공간을 제공합니다.

+0

나는 실제로 플래그/largespaceaware와 연결하고있다. 현재 64 비트로 전환하는 것을 고려하고 있지만, 실행중인 모든 기계가 64 비트가되는 것은 아닙니다. CLR에 지속적인 메모리가 필요합니까? 비록 가상 주소 시스템이 벡터 을 방금 해방 시켰을 때처럼 그것을 처리 할 것이다. – fprades

+0

양방향 배열은 메모리에서 연속적입니다 (앱 주소 공간에서). 귀하의 C + + 코드에서 귀하의 주소 공간을 할당하여 조각 수 있습니다. C++ 코드를 별도의 프로세스에서 실행하는 것을 고려하십시오. 당신은 어쨌든 데이터를 전송하기위한 파일을 만들고 있습니다. –