2014-04-21 5 views
-1

8 * 10^9 int 배열이 필요합니다 .... 얼마나 많은 메모리가 프로그램에 malloc (SIZE_MAX)의 메모리가 한계가 있다는 것을 알고 있지만 그것을 변경하는 방법이 있습니까? gcc 4.6 (mingw)을 사용하고 있습니다. Thx 사전에.8 * 10^9 int 메모리를 어떻게 malloc 할 수 있습니까?

#include <stdio.h> 
#include <stdlib.h> 
int main() 
{ 
int i,j; 
int m=2000*2000,n=2000; 
int ** matrix; 

matrix = malloc(m * sizeof(int *)); 
for (i = 0; i < m; i++) 
matrix[i] = malloc(n * sizeof(int)); 
puts("check point1\n"); 
for (i = 0; i < m; i++) 
    for (j = 0; j < n; j++) 
     matrix[i][j]=5000; 
puts("check point2\n"); 
int * matrix2; 
matrix2 = malloc(m * sizeof(int)); 
return 0; 
} 
+0

여러 부분으로 나눌 수 있습니까? – Brian

+5

32GB의 RAM이 있다는 것을 알고 있습니까? – KeatsPeeks

+0

네,하지만 그것을 피하고 싶습니다 방법이 있다면 – user1740587

답변

0

할 수 있습니다하지 mallocSIZE_MAX 이상을. 시스템이 실제로 그 양보다 많은 양을 할당하는 프로세스를 실제로 지원한다면 malloc에 대한 복수 호출을 통해 처리해야합니다. 각각 SIZE_MAX을 요청합니다.

물론 더 큰 SIZE_MAX을 가진 다른 컴파일러를 사용할 수도 있습니다.

NB. calloc()의 인수가 SIZE_MAX을 초과하도록 허용되는지 여부와보다 큰 청크를 할당해야하는지 여부에 대한 C 표준은 명확하지 않습니다. 그것이 명확하지 않기 때문에, IMO는 이것을 시도하지 않는 것이 가장 좋을 것입니다. 일부 C 라이브러리 구현에서는 size_t을 사용하여 인수를 곱한다고 들었습니다.

+1

글쎄, 당신은 확실히'malloc'을 사용하지 않고'mmap'을 사용함으로써'SIZE_MAX '이상을 할당 할 수 있습니다. 32GiB 파일 매핑은 64 비트 시스템에서는 문제가되지 않습니다. 그게 합리적이든간에 (성능면에서는) 다른 문제입니다. – Damon

+0

@Damon OP만이 malloc을 사용하여이를 수행 할 수 없다고 말했지만 정확합니다. – this

+0

'size_t '는 어떤 객체의 크기를 표현할 수있는 유형이기 때문에'calloc'은 더 많은 것을 할당해서는 안됩니다; 'calloc'에 의해 얻어지는 객체에 대한 표현 배열은'unsigned char [nmemb * size]'타입을 갖는다. –

0

문제는 그것보다 기본적인 것입니다. 컴퓨터에 RAM에 배열을 저장할 수있는 충분한 메모리가 있다고 가정하면 (그렇지 않으면 디스크에 페이징/스 래싱됩니다) 주소를 지정할 수 있어야합니다. 64 비트 OS 및 환경이 필요합니다. 시도하십시오 MinGW-w64.

64 비트 시스템을 사용하는 가장 큰 동기는 주소 공간 증가입니다. 예, 64 비트 시스템에서는 하위 32 비트와 상위 32 비트를 처리하는 대신 하나의 명령어에 2 개의 64 비트 피연산자를 추가 할 수 있습니다. 따라서 두 개의 64 비트 피연산자를 추가하기 위해 32 비트 시스템에서 두 가지 명령어가 필요합니다 ... 큰 문제는 아닙니다. 그러나 32 비트 이상의 주소 공간, 즉 게임을 변경하면 이제는 32 비트 시스템에서 해결할 수없는 큰 문제를 해결할 수 있습니다.

컴퓨터에 128GB RAM이있을 수 있으며 32 비트 응용 프로그램을 실행하는 경우 주소 지정할 수있는 가상 주소는 32GB 어레이의 크기보다 4GB ... 많아야 32 비트입니다 !

1

사용 가능한 충분한 주소 공간 블록이있는 경우 (32 비트 코드 가능성 없음) 많은 메모리를 할당 할 수 있습니다 (스왑 공간을 사용할 수도 있음).
문제는 SIZE_MAX이 최대 주소 인 size_t이며 전체 주소 공간을 포괄하는 데 거의 항상 충분합니다.

이 그런 경우가 아니라면 그것에 대해 이동하는 여러 가지 방법 :

  1. 사용 malloc() : 할당 페이지의 일부 특정 수보다 많은 경우 많은 malloc() -implementations 직접 페이지를 손.
  2. 직접 플랫폼 api로 직접 이동하십시오. mmap() 또는 무엇인가 필요한 것입니다.
  3. 데이터가 이미 사용 가능한 형식의 파일에있는 경우 해당 파일을 주소 공간에 직접 매핑하는 것을 고려하십시오. (방법 2의 변형 일 수 있음)
    • 데이터를 변경할 필요가없는 경우 읽기 전용으로 설정하십시오.
    • 파일을 변경하고 싶지 않지만 데이터를 수정해야하는 경우 copy-on-write를 사용하십시오.
    • 원본 파일을 수정하려면 읽기/쓰기로 매핑하십시오.프로그램을 테스트하기 전에 백업을 만드는 것을 고려하십시오.

그것이 사실 인 경우에, 모두를 잡고 당신은 실제로 단지 다음 사용하는 부분에 대한 전망을지도하기에 충분히 큰 일부 파일을 만듭니다.

1

RAM이 충분하면 이 64 비트 시스템에 있으므로 큰 덩어리로 할당 할 수 있어야합니다. 두 조건 중 하나라도 충족되지 않으면 문제가 발생합니다. 32 비트 시스템에서 이와 같은 대형 어레이를 조작하는 것은 합리적인 방법이 아니며 메모리에 맞지 않는 어레이에서 작동하려고 시도하는 것은별로 의미가 없습니다. SIZE_MAX이 충분히 크지 않은 경우 SIZE_MAX은 증상 일 뿐이며 원인이 아닙니다.