Hoher Speicherbedarf bei "Einzeilern"?
Verfasst: Dienstag 25. März 2008, 12:49
Ich habe Frage zu einem Python one-liner... ich habe vor ein paar Tagen aus purer Neugierde einmal verschiedene Einzeiler (also kurze Scripte in awk, Perl, sed usw.) mit einander verglichen. Und ich wollte der Vollständigkeit halber auch Python in meinen kleinen Parcours mit aufnehmen.
Aufgabe war (und ist) in einer recht großen Text-Datei (200+ MB) eine vierstellige Nummer durch "0000" zu ersetzen. Also habe ich mir mit Hilfe der Python Wiki folgen Code ausgedacht:
bzw.
Soweit funktionieren die Scripte auch einwandfrei, nur in Sachen Speicherbedarf bin ich etwas stutzig geworden.
Die sys.stdin.read() Version arbeitet sehr zügig, verbrät aber bis zu 600MB RAM auf meinen System. Soweit nicht verwunderlich, da erst die komplette Datei gelesen und erst dann verarbeitet wird.
Die fileinput.input Version braucht auf meinem System an die 19 MB Speicher, schon besser... braucht aber auch ca. 3 mal so lange.
Nun aber endlich zum Knackpunkt: Wenn ich die fileinput.input Version statt in der Kommandozeile in einem Script ausühre,
sinkt der Speicherbedarf auf knapp 4,5 MB. Die Geschwindigkeit, bzw. Langsamkeit bleibt gleich.
Hab ich einen Fehler gemacht? (Denkbar, ich hab wirklich gerade erst angefangen mit Python zu arbeiten...) Gibt es eine elegantere Lösung?
Für einen kleinen Schubs in die richtige Richtung wäre ich euch mächtig dankbar,
thyrc
Aufgabe war (und ist) in einer recht großen Text-Datei (200+ MB) eine vierstellige Nummer durch "0000" zu ersetzen. Also habe ich mir mit Hilfe der Python Wiki folgen Code ausgedacht:
Code: Alles auswählen
python -c "import sys,re; print re.sub('X-Mozilla-Status: [0-9]{4}','X-Mozilla-Status: 0000', sys.stdin.read())," < Inbox > null
Code: Alles auswählen
python -c "import re,sys,fileinput; [sys.stdout.write(re.sub('X-Mozilla-Status: [0-9]{4}', 'X-Mozilla-Status: 0000', line)) for line in fileinput.input('Inbox')]" > null
Die sys.stdin.read() Version arbeitet sehr zügig, verbrät aber bis zu 600MB RAM auf meinen System. Soweit nicht verwunderlich, da erst die komplette Datei gelesen und erst dann verarbeitet wird.
Die fileinput.input Version braucht auf meinem System an die 19 MB Speicher, schon besser... braucht aber auch ca. 3 mal so lange.
Nun aber endlich zum Knackpunkt: Wenn ich die fileinput.input Version statt in der Kommandozeile in einem Script ausühre,
Code: Alles auswählen
#!/usr/bin/env python
import sys,re,fileinput;
for line in fileinput.input():
print re.sub('X-Mozilla-Status: [0-9]{4}', 'X-Mozilla-Status: 0000', line),
Hab ich einen Fehler gemacht? (Denkbar, ich hab wirklich gerade erst angefangen mit Python zu arbeiten...) Gibt es eine elegantere Lösung?
Für einen kleinen Schubs in die richtige Richtung wäre ich euch mächtig dankbar,
thyrc