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.

  • Liest fortran unformatierte datei mit python
  • Rufen Sie die Python-Funktion von Fortran / C an
  • Einschließlich eines kompilierten Moduls im Modul, das mit f2py verpackt ist (Minimum work example)?
  • Wie gebe ich meine (7, 3, 3, 3) Array an eine Fortran-Subroutine?
  • Verwenden von f2py auf einem Fortran-Code, der mit PETSc verknüpft ist
  • Immer noch nicht installieren scipy wegen fehlenden Fortran Compiler nach brauen installieren gcc auf Mac OS X
  • Schreiben von Fortran unformatierten Dateien mit Python
  • Warum ist meine f2py Programme langsamer als python Programme
  • Subroutine-Argument nicht korrekt von Python nach Fortran übergeben
  • Wie bekomme ich das vorangehende Array als Ausgabe einer Funktion in Fortran
  • Wie bekomme ich, wie viel Zeit in f2py Wrapper verbracht wird
  • Python ist die beste Programmiersprache der Welt.