2014-12-18 4 views
1

나는 이것에 대해 매우 혼란스러워합니다. 크기가 16000 * 4 * 2 인 3D 배열을 덤프합니다. 모든 요소는 DOUBLE PRECISION이며 16000 * 4 * 2 * 8 바이트/dp = 1,024,000 바이트 크기의 파일을 가져야한다고 생각했습니다. 하지만 2,048,000 바이트가 계속 유지됩니다.바이너리 파일의 크기를 추정하십시오.

와 나는 간단한 테스트 프로그램 테스트 :

PROGRAM testprog 
    IMPLICIT NONE 
    DOUBLE PRECISION :: x=0.0D0 
    INTEGER :: i 

    OPEN(UNIT=128,FILE='try.out',FORM='UNFORMATTED',ACCESS='SEQUENTIAL') 

    DO i=1,16000*4*2 
    WRITE(128) x 
    ENDDO 

    CLOSE(128) 

ENDPROGRAM testprog 

그리고이 명령을 실행 :

gfortran f.f90 -o a 
./a 
ls -als try.out 

을하고 내가 얻을 것은

2000 -rw-r--r-- 1 jipuwang umstudents 2048000 Dec 17 20:16 try.out 

나는 이해가되지 수있다 그것의. 하나의 배정 밀도는 2 바이트를 올바르게 사용합니까?

PROGRAM testprog 
    IMPLICIT NONE 
    DOUBLE PRECISION :: x=0.0D0 
    INTEGER :: i 

    OPEN(UNIT=128,FILE='try.out') 

    DO i=1,2 
    WRITE(128,*) x 
    ENDDO 

    CLOSE(128) 

ENDPROGRAM testprog 

그것은 나에게 크기를 54 바이트의 파일을 제공합니다 : 사람이 또한 나를이 이해하는 데 도움 수 있다면

나는, 다른 뭔가를했다.

+0

포트란 태그가 추가 된 이유는 포트란 저장소가 포맷되지 않은 파일로 기록하는 방법 때문일 수도 있습니다. –

+1

또한 CPU 아키텍처는 무엇입니까? –

답변

8

사용중인 형식화되지 않은 순차 파일은 레코드 지향 파일 형식입니다. 모든 레코드의 경우 일부 기록 보관 필드가 파일에 기록되어 프로세서가 레코드간에 이동할 수 있습니다. 세부 사항은 컴파일러마다 다를 수 있지만 컴파일러간에 일관된 양의 일관성이 있습니다.

WRITE 16000 * 4 * 2 번을 호출하므로 16000 * 4 * 2 레코드가 작성됩니다. 레코드 당 오버 헤드 당 16,000 * 4 * 2 로트가 발생합니다. 레코드 당 8 바이트의 오버 헤드 (레코드 데이터의 앞뒤에 4 바이트 길이)가 일반적입니다.

오버 헤드에 문제가있는 경우 레코드 당 더 많은 값을 쓰는 것이 좋습니다. 전체 데이터 세트를 단일 레코드에 넣을 수도 있습니다.

배정도 변수는 일반적으로 플랫폼, 컴파일러 및 컴파일 옵션에 따라 다르지만 8 바이트를 차지합니다.

2

배열을 덤프하고 싶으므로 배열을 3 개 가지고 있다고 가정합니다. 그러면 프로그램은 다음과 같이됩니다.

PROGRAM testprog 
    IMPLICIT NONE 
    DOUBLE PRECISION :: x(16000,4,2) 
    INTEGER :: i 

    OPEN(UNIT=128,FILE='try.out',FORM='UNFORMATTED',ACCESS='SEQUENTIAL') 
    WRITE(128) x 
    CLOSE(128) 

ENDPROGRAM testprog 

이제 파일 크기는 4 + 16000 * 4 * 2 * 8 + 4 바이트가됩니다. 처음과 마지막 4 바이트는 레코드의 시작과 끝을 표시합니다.

관련 문제