fortran - Fortran 中写入磁盘的效率

标签 fortran disk

我正在尝试将 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

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

最佳答案

首先我要说的是,我同意这些评论,最好的方法是转向 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 $ 

关于fortran - Fortran 中写入磁盘的效率,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43637321/

相关文章:

c++ - 从 FORTRAN 代码调用的 C++ 函数调用 C++ 函数

arrays - 在 Fortran 中更改分配数组的形状

mysql - mysql中为什么要将日志文件和bin-log文件存放在不同的路径或磁盘上

linux - 是否有命令行(终端)程序来监视Linux中的磁盘使用情况?

c# - 如何利用磁盘 IO 队列

cpanel - 磁盘空间被 `vda`文件占满,如何清除?

c - Fortran 2003 绑定(bind)到 C : how to translate enums and #defines? 中的库

大多数语言的行和列索引约定

c++ - Doxygen STL 支持使用点图

linux - 如何在我的 linux 系统中停止磁盘 I/O 的页面缓存?