2012-10-24 5 views
0

나는 약 2 백만 줄과 약 150 칼럼의 데이터를 가진 csv 파일을 가지고있다. 총 파일 크기는 약 1.3GB입니다. 약 3 억 명의 어레이 회원입니다.FORTRAN 프로그램은 모든 데이터를 크기 제한으로 배열로 읽을 수 없습니까?

나는 350 만 개의 라인 파일로 시작했고 시행 착오를 거쳐 은 배열이 390 만 개 이하로 정의되지 않은 이상 컴파일되지 않는다는 것을 알게되었습니다. 400 만, 안돼. 버스 오류/코어 덤프.

어쨌든 200 만 줄의 파일이 작동한다고 생각했습니다. 2GB 제한에 대한 몇 가지 게시물을 읽었습니다. 그러나 데이터를 읽을 때 줄 번호를 인쇄 할 때 끝나기 전에 25 만 개 정도 밖에되지 않습니다. 이상하게도 필자는 거의 동일한 파일 (분할 명령 사용)을 가지고 있으며, 파일을 만들기 전에 85,000 개에 불과합니다. 왜 이렇게 다른, 한 줄에 같은 문자 수를 모르십니까?

이 데이터를 읽으려면 내가 할 수있는 일이 있습니까? 수 백 번 모든 데이터를 컴파일하는 것은 큰 고통입니다.

+2

어떤 시스템에서 실행합니까? 어떻게 프로그램을 컴파일합니까? 관련 소스 코드 및 컴파일 명령을 표시하십시오. 리눅스에서'gfortran -Wall -g'로 컴파일했으면,'gdb' 디버거로 실행 했습니까? –

+2

나는 큰 파일을 하나의 꿀꺽 꿀꺽 거리는 소리로 메모리에 읽어 들일 필요가 있다는 것에 회의적이다. 일반적으로 청크별로 큰 데이터 세트를 읽는 것이 훨씬 더 좋은 전략입니다 : 청크 읽기, 일부 데이터 추출, 청크 삭제, 반복. 그러나 큰 데이터 세트를 읽을 필요가 있다면, 바이너리 포맷으로 저장하는 것이 좋으며, 그것은 Fortran에서'포맷되지 않은 포맷 (unformatted) '입니다. –

+0

@HighPerformanceMark - 재전송 된 버전 중 하나에서 표준에 '스트림'액세스가 추가되지 않았습니까? 그것은'unformatted'보다 적은 디스크 공간을 차지할 수있는 또 다른 바이너리 형식이며, 여전히 이해하기 쉽습니다 ... – mgilson

답변

2

이것은 Fortran 자체의 속성이 아니라 특정 컴파일러 및 OS의 속성입니다. 그래서 그 정보를 제공해야합니다.

버스 오류 : 어레이가 스택에 배치되어 있고 스택 공간이 부족한 것 같습니다. 다양한 OS는 스택 크기를 늘리는 방법을 제공합니다. 많은 컴파일러는 큰 배열이 힙에 배치되도록 옵션을 제공합니다. 배열 "allocatable"을 선언하고 할당 할 수도 있습니다. 이 마지막 제안은 FORTRAN 77 컴파일러 대신 Fortran 95 컴파일러를 사용한다고 가정합니다.

인덱싱에 사용되는 정수 변수를 선언하는 방법도 있습니다. 프로그램의 루프가 2,147,483,647을 초과하는 경우 4 바이트보다 큰 변수를 사용해야합니다. 소스 코드를 표시하지 않기 때문에 추측 할 수 있습니다.

관련 문제