jens hat geschrieben:Nur so eine Anmerkung... Warum berechnest du die Dauer so komisch? Warum nimmst du nicht einfach time.time() ?
Hi jens!
Du hast natürlich vollkommen recht. Was man nicht im Kopf hat, hat man in den Fingern
Hier noch mal der Code, diesmal aber mit 4 Mio. Zeilen und mit time.time()
Code: Alles auswählen
#!/usr/bin/env python
# -*- coding: iso-8859-1 -*-
import time
DATAFILE = r"C:\_Ablage\filetest\data\myfile.txt"
DESTFILE = r"C:\_Ablage\filetest\data\destfile.txt"
# Eine Datei mit 4.000.000 Zeilen und 40 Spalten erzeugen
print "Datei erzeugen BEGIN"
print "Uhrzeit:", str(time.strftime("%H:%M:%S", time.localtime()))
seconds_begin = time.time()
seconds = seconds_begin
f = file(DATAFILE, "w")
for i in xrange(1, 4000000):
zeile = ";".join([str(i)] * 40) + "\n"
f.write(zeile)
if not(i % 500000):
print " %s (%s Sekunden)" % (str(ii), str(time.time() - seconds))
seconds = time.time()
print " %s (%s Sekunden)" % (str(i), str(time.time() - seconds))
f.close()
print "Datei erzeugen END"
print "Uhrzeit:", time.strftime("%H:%M:%S", time.localtime())
print "Dauer in Sekunden:", str(time.time() - seconds_begin)
print
# Die erzeugte Datei durchlaufen und die Zahl der ersten Spalte mit
# einem Zaehler multiplizieren. Diese Zahl wird in eine neue Datei geschrieben.
print "Datei durchlaufen BEGIN"
print "Uhrzeit:", str(time.strftime("%H:%M:%S", time.localtime()))
seconds_begin = time.time()
seconds = seconds_begin
dest = file(DESTFILE, "w")
f = file(DATAFILE, "rU")
for linenumber, line in enumerate(f):
dest.write("%s\n" % (long(line.split(";")[0]) * linenumber))
if not(linenumber % 500000):
print " %s (%s Sekunden)" % (str(linenumber), str(time.time() - seconds))
seconds = time.time()
print " %s (%s Sekunden)" % (str(linenumber), str(time.time() - seconds))
f.close()
dest.close()
print "Datei durchlaufen END"
print "Uhrzeit:", time.strftime("%H:%M:%S", time.localtime())
print "Dauer in Sekunden:", str(time.time() - seconds_begin)
Das Ergebnis:
Code: Alles auswählen
Datei erzeugen BEGIN
Uhrzeit: 23:37:49
500000 (9.0 Sekunden)
1000000 (14.0 Sekunden)
1500000 (12.0 Sekunden)
2000000 (11.0 Sekunden)
2500000 (16.0 Sekunden)
3000000 (14.0 Sekunden)
3500000 (14.0 Sekunden)
3999999 (12.0 Sekunden)
Datei erzeugen END
Uhrzeit: 23:39:31
Dauer in Sekunden: 102.0
Datei durchlaufen BEGIN
Uhrzeit: 23:39:31
0 (0.0 Sekunden)
500000 (16.0 Sekunden)
1000000 (25.0 Sekunden)
1500000 (20.0 Sekunden)
2000000 (17.0 Sekunden)
2500000 (26.0 Sekunden)
3000000 (23.0 Sekunden)
3500000 (33.0 Sekunden)
3999998 (57.0 Sekunden)
Datei durchlaufen END
Uhrzeit: 23:43:08
Dauer in Sekunden: 217.0
Den Performaceeinbruch erkläre ich mir mit den großen Zahlen, die bei dieser Zeilenanzahl zu multiplizieren sind. Ich habe aber keine Lust mehr auszutesten, ob das so stimmt.
Vorsicht! Dieses Beispiel erzeugt eine 1,15 GB große Datei.
mfg
Gerold
