Performance 读取未格式化文件的最有效方法
现在我正在用Fortran处理100000个文件。这些数据是由HPC使用MPI/O生成的。现在,我只能想出以下读取原始数据的方法,这是不高效的。有没有可能一次读一个而不是一个接一个地读ut_yz(:,J,K)?谢谢 旧代码如下,效率不高Performance 读取未格式化文件的最有效方法,performance,io,fortran,Performance,Io,Fortran,现在我正在用Fortran处理100000个文件。这些数据是由HPC使用MPI/O生成的。现在,我只能想出以下读取原始数据的方法,这是不高效的。有没有可能一次读一个而不是一个接一个地读ut_yz(:,J,K)?谢谢 旧代码如下,效率不高 OPEN(10,FILE=trim(filename)//".dat",FORM='UNFORMATTED',& ACCESS='DIRECT', RECL=4, STATUS='OLD') !,CONVERT='b
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)
然而,它总是失败。有人能对此发表评论吗?谢谢。如果我没弄错的话,Direct IO read将读取一条记录。因此,在新代码版本中,您需要相应地增加记录长度:
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)
您说数据是使用MPI I/O写入的,所以您确定要使用直接访问而不是流式Fortran IO吗?您确定有正确的recl吗?硬编码是不可取的,因为长度在不同的编译器中可能有不同的表达方式。最好使用inquire来获取正确的编号,例如请参阅@HighPerformanceMark抱歉,描述不清楚,错误消息是Fortran运行时错误:不存在记录编号。现在,这个问题通过使用inquire解决了haraldkl@francescalus谢谢你的建议。调用MPI\u文件\u写入\u所有(fh、wk和子系统(1)*子系统(2)*子系统(3),&real\u类型,MPI\u状态\u忽略,ierror)用于输出数据。你能给我一个使用streamfortranio的例子吗。谢谢。如果您要读入的整个数组都是通过一次集体写入写入的,那么用
access='stream'
打开,然后对整个数组进行一次读取就足够了。[我以为有人问过类似的问题,但我找不到。]