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
Iterator mit pool abarbeiten?
@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.
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?
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?
@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.
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?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.
- Hyperion
- Moderator
- Beiträge: 7478
- Registriert: Freitag 4. August 2006, 14:56
- Wohnort: Hamburg
- Kontaktdaten:
Ja, weil es eben nicht auf Threads setzt, sondern auf ProzesseTrichter hat geschrieben: Ich dachte genau das Problem wäre mit dem multiprocessing Modul gelöst worden?
encoding_kapiert = all(verstehen(lesen(info)) for info in (Leonidas Folien, Blog, Folien & Text inkl. Python3, utf-8 everywhere))
assert encoding_kapiert
assert encoding_kapiert