读取未格式化文件的最有效方法

时间:2016-02-16 12:51:14

标签: performance io fortran

现在我使用Fortran对数据进行数据处理100,000个文件。这些数据由HPC使用MPI I / O生成。现在我可以找出以下方法来读取raw,这是无效的。有可能读取每一个读取ut_yz(:,J,K),一次一个一个地读书吗?谢谢 旧代码如下,效率不高。

  OPEN(10,FILE=trim(filename)//".dat",FORM='UNFORMATTED',&
           ACCESS='DIRECT', RECL=4, STATUS='OLD')
      !,CONVERT='big_endian'
      COUNT = 1
      DO K=1,nz
         DO J=1,ny
            DO I=1,nxt
              READ(10,REC=COUNT) ut_yz(I,J,K)
              COUNT = COUNT + 1
            ENDDO
         ENDDO
      ENDDO
    CLOSE(10)

所需的是

 OPEN(10,FILE=trim(filename)//".dat",FORM='UNFORMATTED', RECL=4, STATUS='OLD')
      !,CONVERT='big_endian'
      COUNT = 1
      DO K=1,nz
         DO J=1,ny
              READ(10,REC=COUNT) TEMP(:)
          COUNT = COUNT + 153
          ut_yz(:,J,K)=TEMP(:)
         ENDDO
      ENDDO
    CLOSE(10)

然而,它总是失败。有人可以对此发表评论吗?感谢。

1 个答案:

答案 0 :(得分:2)

直接IO读取将读取单个记录,如果我没有弄错的话。因此,在新的代码版本中,您需要相应地增加记录长度:

   inquire(iolength=rl) ut_yz(:,1,1)
   open(10, file=trim(filename)//'.dat', form='UNFORMATTED', recl=rl, status='OLD', action='READ')
   count = 1
   do k=1,nz
     do j=1,ny
       read(10, rec=count) ut_yz(:,j,k)
       count = count + 1
     end do
   end do
   close(10)

当然,在这个例子中你也可以一次读取完整的数组,这应该是最快的选择:

   inquire(iolength=rl) ut_yz
   open(10, file=trim(filename)//'.dat', form='UNFORMATTED', recl=rl, status='OLD', action='READ')
   read(10, rec=1) ut_yz
   close(10)