我正在尝试将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
更快地做到这一点的聪明方法?
答案 0 :(得分:4)
首先我要说的是我同意这些意见,最好的方法是转向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 $