Iterator mit pool abarbeiten?

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Antworten
p90
User
Beiträge: 198
Registriert: Donnerstag 22. Juli 2010, 17:30

Hi,

und direkt noch eine Frage.
Muss eine große Anzahl an Dateien lesen und die darin enthaltenen Daten auswerten.
Habe mir dazu eine Lesefunktion geschrieben die mir einen Iterator gibt (eine Datei kann viele (>1kk) Datensätze beinhalten, da ich die nicht alle gleichzeitig im Speicher haben kann, das was ich am ende aber brauche nur ein Float ist gehe ich durch den Iterator, lese dabei genau den Teil der Datei den ich brauche, bekomme die Daten zurück gegeben und kann sie direkt auswerten, einen Float im RAM behalten und den Rest wieder wegwerfen). Nun dauert die Auswertung der vom Iterator zurückgegebenen Daten. Zusätzlich nutze ich nur einen Core von meinen vieren (1 ist für 10h auf 100%, der Rest auf 0%). Ich würde nun gerne wissen, ob es Möglich ist, Iteratoren über einen pool abarbeiten zu lassen. Wichtig ist dabei, das mein Interator intern eine Queue verwendet (und die sollte ja Threadsafe sein, oder?), der Rest sind nur Daten die zur Laufzeit vorhanden sind (also nichts mit self. )
Kann ich jetzt einfach einen Pool auf diesen Iterator loslassen?
Habe leider für euch (noch) keinen Code, wollte diesmal erst verstehen wie es richtig geht bevor ich wieder alles drei mal machen muss.
Schonmal Danke fürs Antworten!

p90
EyDu
User
Beiträge: 4881
Registriert: Donnerstag 20. Juli 2006, 23:06
Wohnort: Berlin

Hallo.

Wenn tatsächlich nur die Berechnung lange dauert und nicht das Einlesen der Dateien, dann sollte dir das multiprocessing-Modul weiterhelfen.

Sebastian
Das Leben ist wie ein Tennisball.
lunar

@p90: Wenn die Berechnung allerdings eher einfach ist, und der Hauptteil der Arbeit allein auf das Auslesen der Dateien entfällt, dann bringt naive Parallelisierung wenig bis gar nichts, kann vielmehr sogar kontraproduktiv sein, da die Festplatten der Flaschenhals sind.
p90
User
Beiträge: 198
Registriert: Donnerstag 22. Juli 2010, 17:30

Hi,

also da viele meiner Dateien gezipt sind, die Daten auf einer 500MB/s schnellen SSD liegen und ein Core durchgehend auf 100% steht würde ich als Engpass auf die CPU tippen.
Ich kann also einen Iterator einfach durch einen pool abarbeiten lassen?
Ich muss vermutlich nur darauf achten, das alles was raus kommt threadsafe ist und das selbe auch für meinen iterator gilt oder?
Benutzeravatar
mkesper
User
Beiträge: 919
Registriert: Montag 20. November 2006, 15:48
Wohnort: formerly known as mkallas
Kontaktdaten:

Probieren geht in dem Fall vermutlich über studieren. :)
deets

@p90

wenn du wirklich CPU-bound bist, dann hilft dir threading in Python nicht. Google mal nach Python + GIL. Stattdessen musst du mehrere Prozesse verwenden. UU dann aber noch mit shared memory zwischen denen.
Trichter
User
Beiträge: 45
Registriert: Montag 20. April 2009, 10:21

deets hat geschrieben:@p90

wenn du wirklich CPU-bound bist, dann hilft dir threading in Python nicht. Google mal nach Python + GIL. Stattdessen musst du mehrere Prozesse verwenden. UU dann aber noch mit shared memory zwischen denen.
Ich dachte genau das Problem wäre mit dem multiprocessing Modul gelöst worden?
Benutzeravatar
Hyperion
Moderator
Beiträge: 7478
Registriert: Freitag 4. August 2006, 14:56
Wohnort: Hamburg
Kontaktdaten:

Trichter hat geschrieben: Ich dachte genau das Problem wäre mit dem multiprocessing Modul gelöst worden?
Ja, weil es eben nicht auf Threads setzt, sondern auf Prozesse ;-)
encoding_kapiert = all(verstehen(lesen(info)) for info in (Leonidas Folien, Blog, Folien & Text inkl. Python3, utf-8 everywhere))
assert encoding_kapiert
Antworten