2016-04-05 6 views
2

Ich versuche, eine Textdatei mit 3.000.000 Zeilen zu lesen folgenden Code:Lesen große Textdateien in Python wird langsamer über Iterationen

f = open("somefile.txt", "r") 
i = 0 
st = time.time() 
mydata = [] 
for line in f: 
    mydata.append(do_something(line)) 
    i += 1 
    if i%10000 == 0: 
     print "%d done in %d time..." % (time.time() - st) 
     st = time.time() 

Nach der Ausgabe auf der Konsole gedruckt ist:

10000 done in 6 time... 
20000 done in 9 time... 
30000 done in 11 time... 
40000 done in 14 time... 
50000 done in 15 time... 
60000 done in 17 time... 
70000 done in 19 time... 
80000 done in 21 time... 
90000 done in 23 time... 
100000 done in 24 time... 
110000 done in 26 time... 
120000 done in 28 time... 
130000 done in 30 time... 
140000 done in 32 time... 
150000 done in 33 time... 
160000 done in 36 time... 
170000 done in 39 time... 
180000 done in 41 time... 
190000 done in 45 time... 
200000 done in 48 time... 
210000 done in 48 time... 
220000 done in 53 time... 
230000 done in 56 time... 
......and so on..... 

Ich bin nicht sicher, warum die Zeit für das Lesen der gleichen Anzahl von Zeilen (10000) über Iterationen zunimmt. Gibt es eine Möglichkeit, dies zu vermeiden oder große Dateien besser zu lesen?

+1

Ist es besser ohne die Zeile mydata.append? – Francesco

+0

Sie wären überrascht, wie viel langsamer eine Anwendung mit Druckanweisungen ausgeführt wird. Entfernen Sie Ihre Druckanweisungen und prüfen Sie, ob sie die Leistung verbessern. – idjaw

+0

@Francesco, ich muss die verarbeiteten Informationen für die spätere Verwendung speichern. Also kann ich es nicht vermeiden. – Chandrahas

Antwort

1

Ungerade, aber der wahrscheinlichste Grund ist der Speicherverbrauch, der Ihren Prozess verlangsamt. Aber dafür müssten deine Linien extrem lang sein.

Wenn Ihre Liste wächst, nehmen Sie mehr RAM und es wird schwieriger für das Betriebssystem einen zusammenhängenden Chunk zu finden, da Ihre Liste wahrscheinlich verdoppelt (oder so ähnlich), wenn Sie weitere Zeilen hinzufügen.

Wäre auch hilfreich zu wissen: 1. Wie viele Bytes belegt eine Zeile 2. Wie viel RAM haben Sie?

Auch sollten Sie versuchen, Ihre Aufgabe zu profilieren.

Sie können auch Ihre Liste von mydata = [0]*3e6

+0

Danke Sid für die schnelle Antwort. Ich vermute auch, dass die dynamische Liste Probleme verursachen könnte. In Bezug auf Ihre Fragen: 1. Zeilen sind wirklich klein, fast 250 Zeichen pro Zeile. 2. RAM-Größe ist auch groß, das System verfügt über 256 GB RAM. Also, ich hoffe, Speichergrenze ist kein Problem. Häufige Speicherzuweisung könnte jedoch ein Täter sein. Kennen Sie eine Methode zur Speicherzuweisung? – Chandrahas

+0

mylist = [Keine] * 1e6 – Sid

+0

Danke für den Vorschlag. Aber ich denke, ich habe den Schuldigen. do_something tut etwas, was Zeit in der Länge von mydata linear nimmt. – Chandrahas

1

Nur runden diese ab mit der Antwort vorbelegt ... die Zeit steigt linear, was für ein einfaches Anfügen unerwartet aber ist normal, wenn Sie die Liste bearbeiten mit jeder neuen Zeile. Die Verlangsamung ist in do_something.