我正在尝试将 Fortran 中的一堆大型矩阵写入磁盘。
矩阵为 V
、C
和 d
。所有的大小都是 (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/