【问题标题】:Efficiency in writing to disk in Fortran在 Fortran 中写入磁盘的效率
【发布时间】:2017-09-24 00:59:05
【问题描述】:

我正在尝试用 fortran 将一堆大型矩阵写入磁盘。 矩阵是VCd。都有大小(2 , n1, n2, n3, n4, n5).

这些是大型矩阵。 Fortran 大约需要 3 个小时来编写它们。

do ind1=1,n1
do ind2=1,n2
do ind3=1,n3
do ind4=1,n4

     write(filename,'(a,i0,a,i0,a,i0,a,i0,a,i0,a)')'PF',t,'_',ind1,'_',ind2,'_',ind3,'_',ind4,'.txt'

     OPEN(UNIT=25,FILE=filename,STATUS='replace',ACTION='write')
     do ind5=1,n5
      WRITE(25,*) c(2,ind1,ind2,ind3, ind4,ind5)
     end do
     do ind5=1,n5
      WRITE(25,*) v(2,ind1,ind2,ind3, ind4,ind5)
     end do
     do ind5=1,n5
      WRITE(25,*) d(1,ind1,ind2,ind3, ind4,ind5)
     end do
     CLOSE(UNIT=25)

end do
end do
end do
end do

有什么聪明的方法可以更快地做到这一点?

【问题讨论】:

  • n[1-5] 有多大?您需要所有单独的文件吗?
  • 真的需要文本形式的结果吗?文本文件总是很慢。
  • 如果您计划在 6 个月内仍然使用这些文件,那么现在开始学习 HDF5 的陡峭(最初)曲线可能是值得的。
  • 等一下,LMGTFY ... :-)
  • 您对目前的答案不满意吗?如果您想要更多,您应该告诉我们您的期望。什么样的细节?具体是什么?

标签: fortran disk


【解决方案1】:

首先让我说我同意 cmets,最好的方法是迁移到 HDF5 或 NetCDF 之类的东西,这应该为您提供数据的可移植性和高性能。

也就是说,如果您想坚持使用简单的 Fortran I/O,最好将 I/O 事务的数量保持在最低限度。我怀疑你所有的打开都不是一个好主意,我会把它全部放在一个文件中。如果没问题,那么您将拥有如下所示的 3 条路线并在我的笔记本电脑上运行(当然,它有一个 SSD)。无论如何,它应该会给你一些想法。

ian-admin@agon ~/test $ cat io.f90
Program test_io

  Implicit None

  Integer, Parameter :: wp = Selected_real_kind( 12, 70 )

  Integer, Parameter :: n1 = 201
  Integer, Parameter :: n2 = 50
  Integer, Parameter :: n3 = 2
  Integer, Parameter :: n4 = 2
  Integer, Parameter :: n5 = 21

  Real( wp ), Dimension( 1:2, 1:n1, 1:n2, 1:n3, 1:n4, 1:n5 ) :: stuff

  Integer :: start, finish, rate

  Integer :: i1, i2, i3, i4, i5

  Call Random_Number( stuff )

  Call System_Clock( start, rate )
  Do i1 = 1, n1
     Do i2 = 1, n2
        Do i3 = 1, n3
           Do i4 = 1, n4
              Do i5 = 1, n5
                 Write( 10, * ) stuff( 1, i1, i2, i3, i4, i5 )
              End Do
           End Do
        End Do
     End Do
  End Do
  Call System_Clock( finish, rate )
  Write( *, * ) 'Loops : ', Real( finish - start ) / Real( rate )

  Call System_Clock( start, rate )
  Write( 11, * ) stuff( 1, :, :, :, :, : )
  Call System_Clock( finish, rate )
  Write( *, * ) 'Array : ', Real( finish - start ) / Real( rate )

  Call System_Clock( start, rate )
  Write( 12 ) stuff( 1, :, :, :, :, : )
  Call System_Clock( finish, rate )
  Write( *, * ) 'Unform: ', Real( finish - start ) / Real( rate )

End Program test_io
ian-admin@agon ~/test $ gfortran -O -Wall -Wextra -std=f2003 io.f90
ian-admin@agon ~/test $ ./a.out
 Loops :    2.28500009    
 Array :    1.80200005    
 Unform:    5.79999983E-02
ian-admin@agon ~/test $ 

【讨论】:

    猜你喜欢
    • 2018-01-18
    • 1970-01-01
    • 1970-01-01
    • 2018-01-09
    • 2017-02-04
    • 1970-01-01
    • 2013-01-02
    • 2011-10-21
    • 1970-01-01
    相关资源
    最近更新 更多