2016-12-12 2 views
1

Ich versuche, eine große Binärdatei (> 5 GB) mit os.open, mmap und from_buffer() zu lesen.Öffnen zum Schreiben und Lesen einer großen Datei Python

Lauf fd = os.open(filePath, O_RDWR) der Fehler OSError: [Errno 22] Invalid argument: H:\\xyz.wdp ausgelöst. Ich erkannte, dass das Problem war, dass die Datei zu groß war, da die Verwendung ähnlicher, aber kleinerer Dateien, O_WRONLY oder O_RDONLY, funktionierte. Leider, wenn ich O_WRONLY oder O_RDONLY verwende, wird der Zugriff für from_buffer() Funktion verweigert (TypeError: mmap can't modify a readonly memory map.).

Mein Beispiel-Code ist:

class StructData(Structure): 
    _pack_ = 1 
    _fields_ = [('bin', c_ubyte)] 

fd = os.open(filePath, os.O_RDWR) 
mmap_file = mmap.mmap(fd, length=80, access=mmap.ACCESS_WRITE, offset=0) 
d_array = StructData*80 
data = d_array.from_buffer(mmap_file) 

Können Sie mir helfen, dieses Problem zu beheben? Ich möchte hinzufügen, ich arbeite mit großen Dateien, und ich brauche es läuft sehr schnell, ich möchte vermeiden, struct.unpack und so weiter zu verwenden.

Vielen Dank!

+0

Wie wäre es [MCVE] (http: // Stackoverflow .com/hilfe/mcve)? –

+0

Ohne weitere Informationen ist es sehr schwierig, Ihr Problem zu lösen. Es scheint jedoch, dass die filePath-Variable einen Syntaxfehler hat, also wenn Sie schreiben, was Sie darin speichern, wäre es sehr nützlich. – Jalo

+0

Ich habe meine Frage mit einem Beispielcode aktualisiert – Pablo

Antwort

1

Aus dem Pfad scheint es, als ob Sie Windows verwenden. Die Dokumentation (https://docs.python.org/2/library/os.html#os.open) besagt, dass man os.O_BINARY verwenden sollte, um Dateien im Binärmodus unter Windows zu öffnen. Haben Sie Folgendes versucht? (Falls Sie könnten die Datei erschaffen ...)

fd = os.open(filePath, os.O_RDWR | os.O_CREAT | os.O_TRUNC | os.O_BINARY) 

Ich weiß nicht, die Situation in Windows über Unterstützung für große Dateien: https://docs.python.org/2/library/posix.html

+0

Ja! Es funktionierte! In meinem Fall erstelle ich keine neue Datei, ich lese sie nur, aber 'from_buffer()' kann nicht nur mit 'os.O_RDONLY' arbeiten. Ich habe dann 'os.O_RDWR | os.O_BINARY' und es hat geklappt! Es ist wichtig, dass der mmap-Zugriff auch in "mmap.ACCESS_WRITE" erfolgt. Vielen Dank! – Pablo

Verwandte Themen