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

标签 performance io fortran

现在我正在使用 Fortran 处理 100,000 个文件。这些数据由 HPC 使用 MPI I/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)

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

最佳答案

如果我没记错的话,直接 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)

关于performance - 读取未格式化文件的最有效方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35433141/

相关文章:

fortran - 定义的赋值和内在赋值(使用 nagfor)之间有冲突吗?

java - 如果没有在代码中修改,我应该声明一个 java 字段 'final' 吗?

c# - 秒表与使用 System.DateTime.Now 计时事件

C:程序在完成 for 循环之前崩溃

Haskell "do nothing"IO,或者如果没有 else

function - CUDA FORTRAN : function gives different answer if I pass variable instead of number

javascript - 如何模拟慢速客户端(浏览器)?

java - 大内存如何优化内存使用?

java - 如何诊断 File.delete() 返回错误/查找未关闭的流?

arrays - Fortran 90 中 double 的最大数组大小是多少?