2011-12-09 4 views
2

DNA 시퀀스에 대한 분석을 수행하는 프로그램을 작성 중입니다. 모든 것은이 일을 제외하고는 잘 작동합니다. 크기 m * n의 2D 배열을 선언하고 싶습니다. 여기서 m과 n은 입력 파일에서 읽습니다. 이제 문제는 m과 n이 너무 커지는 경우입니다. 예를 들어 m = 200 및 n = 50000이면 그러면 배열을 선언하는 줄에서 seg 오류가 발생합니다.큰 2D 배열의 경우 Seg 오류

array[m][n]; 

아이디어를 극복하는 방법. 내 전체 논리는이 배열을 처리하는 방법에 따라 배열과 같은 배열이 필요합니다.

+0

300 메가 바이트 (32 비트 유형이라고 가정)를 요구하고 있습니다 ... 동적으로 새로운 것으로 할당하십시오. –

답변

4

아마도 스택 공간이 부족합니다.
malloc을 사용하여 힙에 배열을 동적으로 할당 할 수 있습니까?

어떻게 해야할지 모르겠 으면 this 답장을 보길 원할 수 있습니다.

+0

안녕하세요, 감사합니다. 힌트를 얻었습니다. –

+0

+1 올바른 답을 얻지 만 링크는 좋지 않습니다. 반복 포인터의 배열로 이동할 필요가 없습니다. 단지'double (* array) [n] = malloc (double [m] [n]);'은 할 것이다. –

0

스택 공간이 부족한 것 같습니다.

예를 들어, Windows는 각 스레드에 1MB 스택을 제공합니다. 배열에 정수가 포함되어 있다고 가정하고 스택에이 배열을 만들면 40MB 스택 변수를 만듭니다.

대신 동적으로 힙에 할당해야합니다.

1

사용중인 유형이 확실하지 않지만 다음 코드에서 int로 가정했습니다.

오히려이 일을보다 :

int array[200][50000]; 

이 일을보십시오 :

int** array = (int**)malloc(200); 
for (int i = 0; i < 200; i++) 
{ 
    array[i] = (int*)malloc(50000); 
} 

이 할당합니다 "힙"메모리보다는 "스택"메모리. 당신은 300MB (32 비트 타입을 사용하는 경우)를 요구하고 있으므로 아마도 "스택"메모리가 많지 않을 것입니다.

for (int i = 0; i < 200; i++) 
{ 
    free(array[i]); 
} 
free(array); 

는 m과 n 대신에 내가 위에서 사용 된 상수를 자유롭게 사용 : 당신이 배열로 완료 후

은 정리해야합니다!

편집 : 원래 C++로 작성하고 C로 변환했습니다. C 메모리 할당/할당 취소로 조금 녹슬었지만 올바르게 작성했다고 생각합니다.

+0

Ahhh 허튼, c 아닙니다 C++. 편집 할 시간을주세요. –

+0

감사합니다. 동일한 방법으로 배열을 역 참조 할 수 있습니까? 배열 [100] [500]에 액세스하려는 경우 일반 2D 배열과 마찬가지로 배열 [100] [500]을 사용할 수 있습니까? –

+0

예. int [] []은 비밀리에 int **입니다. :) –

0

배열 (로컬 인 경우)이 스택에 할당됩니다. 프로세스/스레드의 스택 크기에는 일정한 제한이 있습니다. 스택이 자라면 문제가 발생할 수 있습니다.

그러나 malloc을 사용하여 힙에 배열을 할당 할 수 있습니다. 일반적인 힙 크기는 4GB가 될 수 있습니다 (OS/아키텍처에 따라 다소 차이가 날 수 있음). malloc의 반환 값을 검사하여 배열에 대한 메모리가 올바르게 할당되었는지 확인하십시오.

1

다른 사람들은 스택에 대형 VLA (가변 길이 배열)를 할당하는 것은 좋지 않다고 말한 사람들도 있습니다.malloc으로 할당 :

double (*array)[n] = malloc(sizeof(double[m][n])); 

하고 이전 객체를 가지고, 그 컴파일러가 완벽하게 개별 요소를 해결 array[i][j] 및 할당이 여전히 당신에게 메모리에 하나 개의 연속 덩어리를 제공하는 방법을 알고 있다는 것입니다.

은 그냥 범위의 끝에서

free(array); 

을하는 것을 잊지 마세요.

+0

아마도 C/메모리에 관해 더 많이 알고 있으니 내가 잘못한 부분을 수정 해주십시오. m 값과 n 값 (200, 50000)을 사용하면 대답은 200 메가 바이트의 별도 1.5 메가 바이트 청크를 요구하는 반면, 300 메가 바이트의 메모리 청크를 요구합니다. 메모리 단편화로 인해 작은 덩어리를 얻을 확률이 더 높지 않습니까? –

+0

귀하의 질문을 올바르게 이해하고 있는지 잘 모르겠습니다. 현대 시스템에서는 이와 같은 큰 덩어리가 '익명 매핑'에 의해 할당됩니다. 즉 시스템은 가상 메모리에 주소 범위 만 예약하고 필요에 따라 물리적 페이지를 할당합니다. 해당 배정의 모든 효과를 할당 해제하면 사라집니다. 귀하의 방법에 따라 시스템은 개별 청크를 나중에 재사용 할 수 있습니다. 이것을 반복하면 아마도 조각화가 많이 늘어날 것입니다. 동시에 모든 것이 해제되는 많은 할당을함으로써 불필요하게'malloc' 시스템을 강조합니다. –