Seite 1 von 1

MemoryError

Verfasst: Donnerstag 7. Juli 2005, 13:17
von Mawilo
Hallo,

ich möchte eine ziemlich große Datei (590 MB) in ein Unix-Format bekommen. Dazu verwende ich folgenden Code:

Code: Alles auswählen

binfile = file(f_new,'rb')
bin = binfile.read()
binfile.close()
bin = bin.replace('\r\n','\n')
binfile = file(f_new,'wb')
binfile.write(bin)
binfile.close()
Leider bekomme ich folgende Fehlermeldung:

Code: Alles auswählen

File "D:\Dokumente und Einstellungen\Eigene Dateien\Programme\FAM-Tool\change_dat.py", line 239, in replace_date
    bin = bin.replace('\r\n','\n')
MemoryError
Ich denke, mein Arbeitsspeicher reicht für so eine große Datei nicht aus. Gibt es eine Möglichkeit, das auch etwas ressourcenschonender hinzubekommen?

Stephan

Re: MemoryError

Verfasst: Donnerstag 7. Juli 2005, 13:41
von jens
mit binfile.read() liest du dir 590MB komplett ein! Der Memory Error ist also kein Wunder ;)

Mach es doch einfach Blockweise... Du kannst bei read() auch die Anzahl der Bytes angeben...

Aber warum öffnest du es eigentlich im Binary Modus, wenn du Zeilenende-Zeichen konvertieren willst???

Geht's nicht auch im universal newline Modus, also mit file(f_new,'rU') ? Dann könntest du mit readline() arbeiten...

Re: MemoryError

Verfasst: Donnerstag 7. Juli 2005, 22:11
von BlackJack
Ungetestet:

Code: Alles auswählen

infile = open('oldname', 'rU')
outfile = open('newname', 'w')
outfile.writelines(infile)
outfile.close()
infile.close()

Verfasst: Donnerstag 7. Juli 2005, 22:17
von Mawilo
Ich habe es mal mit dem blockweisen Einlesen der Datei probiert. Funktioniert ganz gut.

Code: Alles auswählen

import os
f = file(datei,'rb')
f_new = file('test.xml','wb')

filesize =  os.stat(datei)[6]
z = 0
print 'Dateigroesse: %s byte'%filesize
while filesize > 0:
    z = z + 1
    print 'Block %s wird gelesen'%z
    bin = f.read(30000000)
    bin = bin.replace('\r\n','\n')
    print 'Block %s wird geschrieben'%z
    f_new.write(bin)
    f_new.flush()
    filesize = filesize - 30000000
    print 'Noch zu lesende Dateigroesse: %s byte'%filesize

f.close()
f_new.close()
Der Code bekommt bestimmt keinen Schönheitspreis aber er erfüllt seinen Zweck :)

Stephan

Verfasst: Freitag 8. Juli 2005, 06:06
von jens
Wobei theoretisch ein Fehler sich einschleichen kann :( Wenn nämlich die kombination "\r\n" genau am BlockEnde/Anfang getrennt werden! Dann klappt die replace-Regel nicht mehr.
Wobei mir dafür spontan nur die Lösung einfällt, ein .replace("\r","") zu machen... Wenn keine einzelnen "\r"'s vorkommen, geht's so auch...