Lesen Fortran direkten Zugang Daten und schriftlich formatierten Daten – schneller mit Python als mit Fortran?

Guten Abend,

Ich habe eine Simulation in Fortran geschrieben, die große Dateien von unformatierten (direkten) Daten produziert. Von einigen dieser Dateien möchte ich ascii menschlich lesbare Dateien produzieren.

Aus irgendeinem Grund ist dies (in 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] 

Dauert nur ~ 4 Sekunden (Piping der Ausgabe in eine Datei auf der Shell), während dies (in 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 

Dauert ~ 20 Sekunden. Was mache ich falsch? Gibt es einen schnelleren Weg, dies in Fortran zu tun?

Freundliche Grüße! Rer

2 Solutions collect form web for “Lesen Fortran direkten Zugang Daten und schriftlich formatierten Daten – schneller mit Python als mit Fortran?”

HAFTUNGSAUSSCHLUSS : Ich weiß nicht, ob das das Problem löst, aber ich weiß, dass ich Zeitunterschiede um einen Faktor von bis zu 20 bekommen kann. Ich habe auch nur die Ausgabe von Daten getestet und es nicht gelesen.


Ich untersuchte die Interaktion von Fortran mit Python und wollte so wissen, wie Fortran's Binärdateien aufgebaut sind. Dabei habe ich bemerkt, dass sowohl ifort als auch gfortran eine Option haben, gepufferte IO ein- oder auszuschalten.

Ifort : Sie können das Schlüsselwort BUFFERED=['YES'|'NO'] beim Öffnen einer Datei angeben.

Gfortran : Sie können die Umgebungsvariable GFORTRAN_UNBUFFERED_ALL auf y|Y|1 oder n|N|0 für ungepufferte und gepufferte IO setzen.

Bitte beachten Sie, dass Gfortran IO standardmäßig puffert, während ifort nicht.

Mein Beispielcode unten ergibt die folgenden Zeiten:

  |buffered|unbuffered --------+--------+---------- ifort | 1.9s | 18.2s gfortran| 2.4s | 37.5s 

Dieser Beispielcode schreibt eine Direktzugriffsbinärdatei mit 10M Datensätzen von jeweils 12 Bytes.

 PROGRAM btest IMPLICIT NONE INTEGER :: i ! IFORT OPEN(11,FILE="test_d.bin",ACCESS="DIRECT",FORM="UNFORMATTED",RECL=3, & & STATUS="REPLACE",BUFFERED="NO") ! ifort defines RECL as words ! GFORTRAN !OPEN(11,FILE="test_d.bin",ACCESS="DIRECT",FORM="UNFORMATTED",RECL=12, & !& STATUS="REPLACE") ! gfortran defines RECL as bytes DO i = 1, 10000000 WRITE(11,REC=i) i,i*1._8 END DO CLOSE(11) END PROGRAM 

Versuchen Sie mit StreamIO siehe http://www.star.le.ac.uk/~cgp/streamIO.html Das sollte einen randomisierten Zugriff ohne feste Rekordgröße ermöglichen und wird wahrscheinlich dazu führen, dass die Verwendung der gleichen zugrunde liegenden OS-Systemaufrufe, damit hoffentlich die Gleiche Leistung.

  • Verwenden von f2py auf einem Fortran-Code, der mit PETSc verknüpft ist
  • Aufruf einer FORTRAN DLL mit Ctypes
  • Einstellung des Fortran-Compilers in f2py
  • Lesen eines direkten Zugriffs auf eine unformatierte Datei in Python
  • Lesen einer Binärdatei mit Python
  • Wie man eine ausgegebene Fortran binäre NxNxN Matrix in Python liest
  • Fortran-Programm schlägt abhängig von einer Write-Anweisung vor Subroutine-Aufruf
  • Lesen von Daten aus FORTRAN90-Datei in NUMPY-Array
  • Malloc fehler in f2py
  • F2Py: Arbeiten mit zuweisbaren Arrays in Fortran, die durch Python aufgerufen werden
  • Aufruf von Funktionen aus einer gemeinsamen Fortban-Bibliothek in Python
  • Python ist die beste Programmiersprache der Welt.