2014-07-24 4 views
0

많은 양의 ASCII 데이터를 한 번에 한 행씩 쓴 포트란 프로그램이 있으며, 시스템 관리자와 (내 실행 결과) 이것이 불리한 영향을 줄 우려가 있습니다 시스템 성능. I/O는 일반적으로 많은 작은 쓰기보다 적은 수의 큰 쓰기에서 더 잘 작동합니다. 그래서, 출력 파일의 형식을 변경하지 않고 더 큰 데이터 청크를 작성하여 IOPS 수를 최소화하는 프로그램을 얻고 싶습니다 (이것은 가정 된 파일 형식에 따라 관련 소프트웨어가 많은 대규모 소프트웨어입니다) . 나는이 같은 루프를 돌려 생각했다 :포트란으로 IOPS 최소화

nwrite=100000000  !total number of lines to write 
    do cnt=1,nwrite 
    write(11,'(i22,3x,f16.14)')cnt,numar(cnt) 
    enddo 

를 루프로 다음과 같이 :

nwrite=100000000 
    nblock=10000   !number of lines to write in each block 
    do cnt=1,nwrite/nblock 
    write(11,'(i22,3x,f16.14)')(nblock*(cnt-1)+j,numar(nblock*(cnt-1)+j),j=1,nblock) 
    enddo 

트릭을 할 것입니다. 그러나 위의 작업을 수행하는 두 개의 작은 스크립트를 만들었고 실행 시간에 실제 차이점을 나타내지 않았습니다. 실제 코드에서 변경 작업을하는 것은 상당한 시간 약속이므로 접근 방법을 결정하기 전에 확실히 확신하고 싶습니다. 루프를 하나의 쓰기 명령으로 완전히 풀어 놓은 것은 아니지만, 현재의 문제에 대해서는 잘 작동하지 않을 수 있습니다.하지만 이렇게하는 접근법도 환영합니다.

위의 코드가 실제 쓰기 명령 수를 줄이는 지 또는 내가 무엇을 얻을 수 있는지를 확인할 수있는 사람은 누구입니까? 미리 감사드립니다.

+0

ifort를 사용한다면'-assume buffered_io' 옵션을 시도해 출력을 버퍼링 할 수 있습니다. – casey

+0

이 소프트웨어는 여러 컴파일러가있는 여러 시스템에서 사용되므로 컴파일 타임 옵션에 의존하지 않는 옵션을 선호합니다. – TTT

+0

정말 많은 양의 데이터를 얻으려면 [HDF5] (http://www.hdfgroup.org/HDF5/) 또는 [netCDF] (http : //www.unidata.ucar. edu/소프트웨어/netcdf /). ASCII를 작성하는 것은 매우 간단하지만, 많은 IO가 요구되는 즉시 보통 불가능합니다. –

답변

0

다른 사용자의 입력을 기준으로 더 많은 것을 읽은 Fortran은 컴파일러에 대한 제어권을 남겨 둡니다. 따라서 컴파일러에 따라 다릅니다. 버퍼링 된 쓰기는 Portland Group Fortran 컴파일러의 기본 동작이며 GFortran의 경우와 같습니다. 인텔은 기본적으로 파일을 버퍼링하지 않습니다. 인텔 컴파일러의 경우 -assume buffered_io 옵션을 추가하면 기본적으로 파일 I/O가 버퍼링됩니다.

관련 문제