Hallo zusammen,
Ich arbeite seit einiger Zeit mit Python und bin gerade dabei ein etwas größeres Prgramm auf die Beine zu stellen.
Die Aufgabe des Programms ist es eine sehr sehr große (3-9GB / 100 Mio. Zeilen) Textdatei zu parsen und die erhaltenen Werte bestimmten Prüfungen zu unterziehen. Da dieser Vorgang jedoch mehrere Stunden dauert, bin ich sehr stark daran interessiert diesen Prozess bestmöglich zu optimieren. Bisher wird die Textdatei über Python mit einer for-Schleife iteriert und über ctypes werden die enthaltenen Werte geparsed.
konzeptioneller Aufbau der for-Schleife:
Code: Alles auswählen
file = open(datei, 'r')
for line in file:
elemente = ctypes(line)
tu_etwas(elemente.eins)
tu_etwas_anderes(elemente.zwei)
...
Falls es hier bereits Verbesserungen gibt, nur raus damit
. Meine Frage bezieht sich jedoch eigentlich nicht allzu sehr auf die for-schleife, da ich meine gelesen zu haben, dass dies der schnellste Weg in Python ist eine Datei dieser größe zu verarbeiten. Die eigentliche Anfrage steht jedoch unter dem Begriff Multithreading. Und zwar habe ich bisher noch keine große Kenntnis in dieser Sache gewonnen, da ich bisher eher kleine Programme geschrieben habe, welche keine Parallelisierung benötigten. Jedoch würde es sich hier nicht anbieten die verschiedenen Berechnungen in einzelnen Threads auszulagern? Es müsste jedoch am Ende jeder Zeile gewartet werden, bis alle Threads abgearbeitet sind, da sich kommende Berechnungen häufig auf die Zeile davor beziehen.
Müsste ja dann im Prinzip ungefähr so aussehen:
Code: Alles auswählen
file = open(datei, 'r')
for line in file:
elemente = ctypes(line)
thread.tu_etwas(elemente.eins).start()
thread.tu_etwas_anderes(elemente.zwei).start()
thread.join()
...
Was mich ebenfalls sehr irritiert, ist die Windows CPU-Last Anzeige während des Prozesses. Da ich bisher wie erwähnt keinerlei threading in meinem Programm benutze, sollte das Programm doch eigentlich nur auf einem Thread und somit einer CPU laufen. Windows sagt mir jedoch, dass mein Programm auf 2 Threads läuft. Bei Betrachtung der Auslastung der Kerne stehen alle Kerne bei einem Dualcore auf 50% bei einem Quadcore auf 25%. Lässt in mir den Verdacht aufkommen, dass das Programm nur auf einem Kern mit 100% läuft und Windows hier irgend ein Quatsch anzeigt. Wenn ich richtig informiert bin, kann ein Thread auch nicht auf mehrere CPUs aufgeteilt werden und da ich nur ein Thread erstellt habe würde sich meine Vermutung, dass ein Kern immer voll ausgelastet wird bestätigen. Nur die Windows Anzeige spricht dagegen.
Ich hoffe ihr könnt mir einige Anregungen und Hilfestellungen geben. Danke!