【问题标题】:The most efficient way to read a unformatted file读取未格式化文件的最有效方法
【发布时间】:2016-02-16 12:51:14
【问题描述】:

现在我正在使用 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)

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

【问题讨论】:

  • 您说数据是使用 MPI I/O 写入的,那么您确定要使用直接访问而不是流式 Fortran IO?
  • 你确定你有正确的recl吗?不建议进行这种硬编码,因为长度在不同编译器中的表达方式可能不同。最好使用查询来获得正确的号码,例如stackoverflow.com/a/9014149/577108
  • @HighPerformanceMark 抱歉描述不清楚,错误消息是 Fortran 运行时错误:不存在的记录号。现在问题通过使用 haraldkl 建议的查询解决了
  • @francescalus 感谢您的建议。调用 MPI_FILE_WRITE_ALL(fh, wk, & subsizes(1)*subsizes(2)*subsizes(3), & real_type, MPI_STATUS_IGNORE, ierror) 用于输出数据。你能给我一个使用流 Fortran IO 的例子吗?谢谢。
  • 如果你想读入的整个数组是由那个单一的集体写入写入的,那么用access='stream'打开,然后对整个数组进行一次读取就足够了。 [我以为有人问过类似的问题,但我找不到。]

标签: performance io fortran


【解决方案1】:

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

【讨论】:

    猜你喜欢
    • 2012-03-02
    • 2013-03-07
    • 2010-12-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-05-03
    • 2019-06-16
    • 1970-01-01
    相关资源
    最近更新 更多