2011-01-27 6 views
14

상당히 큰 두 배 배열 12000ish x 55000ish를 만들어야합니다. 불행히도 메모리 부족 예외가 발생합니다. 자바로 개발하고 메모리 설정을 변경할 수있었습니다. C#으로 가능합니까 아니면 불가능합니까? VS2008을 사용하고 있습니다.큰 배열 선언시 OutOfMemoryException

+1

A * 상당히 * 큰 배열? :) – Groo

+0

"기본 메모리 부족"데이터 구조 (예 : 데이터베이스)를 고려해 보시기 바랍니다. 왜 그렇게 큰 double array를 저장해야합니까? – bitxwise

+0

나는 "공정하게"단어의 선택에 너무 웃었다. –

답변

25

double은 8 바이트이므로 5GB가 넘는 단일 배열을 할당하려고합니다. CLR은 64 비트 CLR의 경우에도 개체 당 제한이 약 2GB IIRC입니다. 즉, 사용 가능한 메모리의 총량이 문제가되지는 않습니다 (비록 에 충분한 메모리가있는이 아니라면 분명히 문제가 발생할 수 있지만).

작은 배열로 분할하는 것이 좋습니다 (아마도 몇 가지 설명의 외관 뒤에). 단일 배열에 대한 한계를 해결할 방법이 없다고 생각합니다.

편집 : 당신은 배열의 배열에 갈 수 - 가변 배열 일명 :

double[][] array = new double[12000][]; 
for (int i = 0; i < array.Length; i++) 
{ 
    array[i] = new double[55000]; 
} 

가 당신에게 허용 할 것인가?

(당신은 그 같은 당 개체 크기가 문제가있는 것처럼 직사각형 배열 (double[,])를 사용할 수 없습니다.)

+0

+1을 실제 크기로 설정했을 때 문제를 해결할 수도 있습니다. 나는 게으르면 안된다. – Ian

+0

고마워. 그래서 그것은 가상 메모리를 사용할 수 없었다? – cs0815

+1

두 배의 단일 배열 대신에 그는 2D 배열을 의미한다고 생각합니다. – bitxwise

0

음, 메모리가 부족합니다 (일부 프로그램 닫기) 또는 메모리 할당 제한 (약 2Gb)에 도달했습니다.이 메모리는 인접한 블록이어야합니다. 64 비트 컴퓨터를 사용하면 더 많은 메모리를 사용할 수 있습니다. 또는 응용 프로그램을 대용량 주소로 인식 할 수 있다고 생각합니다.이 경우 가능한 경우이를 수행하는 방법을 알려줍니다.

큰 주소 인식을 위해/3GB 스위치를 Boot.ini 파일에 추가 했으리라 믿습니다.

9

을 사용하면 2GB의보다 큰 개체를 만들 수 없기 때문에 당신이 MemoryMappedFile를 사용하려고 할 수 있습니다 필요한 크기의 메모리 덩어리로 작업하십시오.

 

var data = MemoryMappedFile.CreateNew("big data", 12000L * 55000L); 
var view = data.CreateViewAccessor(); 
var rnd = new Random(); 

for (var i = 0L; i < 12000L; ++i) 
{ 
    for (var j = 0L; j < 55000L; ++j) 
    { 
     var input = rnd.NextDouble(); 
     view.Write<double>(i * 55000L + j, ref input); 
    } 
}