将大量数据(双数字)从FORTRAN程序传递到C ++程序的最佳和最有效的方法是什么?现在我正在使用二进制文件,但速度不够快!
我试过管道。我跟着http://msdn.microsoft.com/en-us/library/ms682499(VS.85).aspx了解了C ++部分。但对于FORTRAN部分(子处理器)我不知道如何正确写入数据。我是否必须像WRITE(*,*) AllTheNumbers
那样在控制台上书写?因为在控制台上书写需要花费很多时间!
我的FORTRAN代码写入数据:
DO 281 I=1,NDOF
DO 280 J=1,UBW
IF (S(I,J).NE.0) THEN
WRITE (*, 2770) I,(J+I-1)
WRITE (*,2760) (S(I,J))
ENDIF
280 CONTINUE
281 CONTINUE
答案 0 :(得分:4)
最快的方法是使其成为一个混合语言程序。在一个(例如,Fortran)中生成数字并从该语言调用另一个(例如,C ++)。使用Fortran的ISO C绑定,调用C是Fortran语言标准的一部分。许多Fortran编译器都支持这一点。在C ++端使用“extern C”。传递一系列双打应该很容易。
编辑:如果您继续使用传输信息的IO方法,您可能应该将信息作为二进制数据传输。您的示例Fortran代码使用格式化的IO ...将数字的内部二进制表示转换为人类可读的字符很慢。在您的Fortran开放语句中使用:access='stream', form='unformatted'
。请勿在写入时使用格式。
答案 1 :(得分:1)
使用二进制文件可能是最慢的方式。之前遇到过这个问题:
答案 2 :(得分:1)
考虑创建一些共享内存。 c程序“创建它”,并将数据写入其中,并调用fortran子程序。 fortran程序'映射'共享内存,并处理它并退出。然后c程序会破坏内存并退出。
答案 3 :(得分:0)
这里答案的一个小变体:Write unformatted (binary data) to stdout,说明了重复使用小缓冲区。
real(kind=8) :: x(256) ! note real(kind=8) is "probably" an 8 byte float.
! but not strictly guaranteed in fortran.
character(len=2048):: buffer ! 2048 == 256*8
do j=1,1000
do i = 1,256
x(i)=(i-1)**2+j*256
enddo
buffer=transfer(x,buffer)
write(*,'(a)',advance='no')buffer
enddo
end
和python代码来读取它,仅举例来说。 (python struct module使它比c ++更好,我想调试这些东西)
import subprocess
import struct
p=subprocess.Popen('./transfer',stdout=subprocess.PIPE)
a=" "
while a!="":
a=p.stdout.read(8)
if a!="" : print struct.unpack('d',a)
在写这样的时候,我从未遇到过“不可打印的角色”的问题。 你不能使用这个技巧从fortran中的stdin读取,因为随机字符串被解释为EOF。