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

Performance 读取未格式化文件的最有效方法,performance,io,fortran,Performance,Io,Fortran,现在我正在用Fortran处理100000个文件。这些数据是由HPC使用MPI/O生成的。现在,我只能想出以下读取原始数据的方法,这是不高效的。有没有可能一次读一个而不是一个接一个地读ut_yz(:,J,K)?谢谢 旧代码如下,效率不高 OPEN(10,FILE=trim(filename)//".dat",FORM='UNFORMATTED',& ACCESS='DIRECT', RECL=4, STATUS='OLD') !,CONVERT='b

现在我正在用Fortran处理100000个文件。这些数据是由HPC使用MPI/O生成的。现在,我只能想出以下读取原始数据的方法,这是不高效的。有没有可能一次读一个而不是一个接一个地读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)

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

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

   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)

您说数据是使用MPI I/O写入的,所以您确定要使用直接访问而不是流式Fortran IO吗?您确定有正确的recl吗?硬编码是不可取的,因为长度在不同的编译器中可能有不同的表达方式。最好使用inquire来获取正确的编号,例如请参阅@HighPerformanceMark抱歉,描述不清楚,错误消息是Fortran运行时错误:不存在记录编号。现在,这个问题通过使用inquire解决了haraldkl@francescalus谢谢你的建议。调用MPI\u文件\u写入\u所有(fh、wk和子系统(1)*子系统(2)*子系统(3),&real\u类型,MPI\u状态\u忽略,ierror)用于输出数据。你能给我一个使用streamfortranio的例子吗。谢谢。如果您要读入的整个数组都是通过一次集体写入写入的,那么用
access='stream'
打开,然后对整个数组进行一次读取就足够了。[我以为有人问过类似的问题,但我找不到。]