【发布时间】:2013-08-13 03:16:28
【问题描述】:
晚上好,
我有一个用 Fortran 编写的模拟,它会生成大量未格式化(直接访问)数据的文件。 从其中一些文件中,我想生成 ascii 人类可读的文件。
出于某种原因(在 python 中):
f = open(filename,'rb')
for i in xrange(0,N):
pos = i * 64
f.seek(pos)
name = struct.unpack('ffff',f.read(16))
print name[0],name[1],name[2],name[3]
只需要大约 4 秒(将输出通过管道传输到 shell 上的文件中),而这(在 Fortran 中)
open (1,file=inputfile,access='direct',recl=64, action='read',status="OLD")
open (2, file=outputfile, access="sequential", action="write",status="REPLACE")
do i=1,(N)
read(1, rec = i ) a,b,c,d
write(2,*) a,b,c,d
enddo
大约需要 20 秒。 我究竟做错了什么?在 Fortran 中有更快的方法吗?
最好的问候! 回复
【问题讨论】:
-
尝试使用 fortran 程序写入标准输出并通过管道传输到输出文件。
-
thx - 好的,我试过了,但它并没有改变它需要的时间
-
我认为,写入速度慢的原因是Fortran处理其输出单元的方式。 Here 是 IBM 的 XLF 正在做什么的描述(tl;dr:准备、锁定、写入、清理、解锁)。您可以尝试通过手动展开循环来合并多个读/写语句,或者简单地存储更大的数据块。在您的情况下,开销似乎是性能杀手。
-
读入一个大数组,用一条语句写完整个东西
-
我认为@Stefan 和乔治有道理。您可以预先分配一个大字符串,然后使用固定长度格式在其上打印,最后一次性输出整个字符串。当然,你可以一次做一个块(几千个数字)
标签: python file-io binary fortran ascii