2017-02-19 6 views
-1

큰 배열의 문제로 싸우고 있습니다. 나는 csv 파일을 많이 읽고 그것들과 함께 작업해야한다 (테이블을 만들어서 저장하라). 나는이 방법C#에서 생성되는 대형 (거대한) 배열

String[,,] pole = new string[5000, 10251, 100]; 
... 

String[] proz = File.ReadAllText("@/../../History/201" + r + "-" + m1 + m2 + "-" + d1 + d2 + "_00/variables_ens.csv").Split(';'); 

      for (int k = 0; k < 10251; k++) 
      { 

       int l = k/99; 
       int lk = l * 99; 
       int b = k - lk; 
       pole[n, l, b] = proz[k]; 
      } 

하려고하지만 첫 번째 행

String[,,] pole = new string[5000, 10251, 100]; 

에서이 범위 예외 밖으로 말한다,하지만 난 그 많은 공간을 필요합니까. 내가 쓸 때

String[,,] pole = new string[100, 10251, 100]; 

그것은 작동하지만, 그 파일의 백에 대해서만. 제안 사항 있으십니까?

+0

배열 대신 List <>를 사용할 수 있습니다. 모든 CSV가 같은 양의 콘텐츠를 가지고있는 것은 아닙니다. 목록이 커질 수 있고 하드 코딩 된 색인 범위가 없습니다. –

+3

당신이 말한 것이 "IndexOutOfRangeException"과 같은 경우, 크기가 문제가 아니므로 존재하지 않는 요소에 액세스하고 있으므로 동적 데이터 구조를 사용해야합니다. List –

+0

x64로 프로젝트를 다시 빌드 한 다음 다시 시도하십시오. 그래도 작동하지 않으면 더 많은 메모리를 확보하십시오. – dasblinkenlight

답변

1

음, 전체 전략을 다시 생각하고 스트리밍을 IEnumerable<T>File.ReadLines으로 구현해야한다고 생각합니다.

현재 구현을 통해 달성하려는 것을 완전히 이해할만큼 요소가 충분하지 않지만 조작하려는 데이터의 크기가 너무 많아서 처리 할 수 ​​없다는 것을 확신합니다. 메모리에.

무엇을해야합니까? 어떤 데이터를 조작하고 있습니까? 각각 1025100 라인의 5000 파일? 모든 파일의 크기는 같습니다. 정말로, 모든 것을 한 번에로드해야합니까?

이 질문에 대한 답은 올바른 방향으로 가리켜 야합니다. 데이터를보다 관리하기 쉬운 형식 (데이터베이스와 같은)으로 효율적으로로드하려면 스트리밍을 사용해야한다고 말합니다.

1

명세서에 5000 * 10251 * 100 요소의 배열을 선언하십시오. 이것은 5,125,500,000 개의 요소로 하나의 블록 (적어도 32 비트 시스템에서)의 메모리 할당 범위를 벗어난 숫자입니다. 2 개 또는 3 개의 다른 배열로 데이터를 분할하거나 List <>과 같은 동적 할당 구조를 사용할 수 있습니다.