multiprocessing.Manager: Kann ich damit das Pickel reduzieren?
Hallo, ich arbeite schon länger mit "multiprocessing" und auch "concurrent.futures.ProcessPoolExecutor". Ich kenne den Unterschied zwischen Thread und Process und weiß auch, dass bei Prozessen ordentlich Ressourcen für das Pickeln draufgehen können. Genau hier ist mein Problem. Ich verteile die (ausschließlich lesenden!) Aufgaben an einem pandas.DataFrame (z.B. 20 Spalten und 700.000 Zeilen) auf mehrere Prozesse. Das geht meist gut, wenn ich den DataFrame sinnvoll in "Scheiben" schneiden und an die Prozesse verteilen kann. Manchmal ist es inhaltlich, aber nicht sinnvoll und ich muss eigentlich den gesamten DataFrame an die Prozesse verteilen, ohne dessen Umfang vor dem Pickeln reduzieren zu können. Gefühlt würde ich sagen, dass Python das Pickeln für jeden Prozess erneut vornimmt, anstatt nur einmal zu Pickeln und das dann einfach zu kopieren. Bin mir bei dem Punkt nicht sicher. Nun habe ich vom Manager (https://docs.python.org/3/library/multiprocessing.html#managers) gehört und dass es da eine Art proxy Datenobjekt gibt. Ein Manager wäre gut geeignet, um Daten zwischen Prozessen zu teilen. Klingt so, also ob ich da kein Pickeling befürchten müsste. Es geht hier wohlgemerkt nur um lesende Zugriffe. Keine Schreiboperationen auf dem DataFrame. Bin ich da auf dem richtigen Weg? Die Frage ist allerdings, wie der Manager das implementiert. Nehmen wir doch mal ein 700.000 Zeilen DataFrame an. Der liegt dann nur 1x im Speicher, dazu je Prozess ein ProxyObjekt. Pandas vektorisiert ja gerne. Ich bin da unsicher, ob so ein Proxy das Handeln kann, wie pandas auf das DataFrame zugreift. Mein Speicher ist nicht das Problem, davon habe ich genug. Das Problem ist die Geschwindigkeit mit welcher der Speicher zwischen den Prozessen "geteilt" (also bspw. gepickelt) wird. Was meint ihr dazu? SG Christian
On 2022-12-05 14:20, c.buhtz@posteo.jp <c.buhtz@posteo.jp> wrote:
Ich verteile die (ausschließlich lesenden!) Aufgaben an einem pandas.DataFrame (z.B. 20 Spalten und 700.000 Zeilen) auf mehrere Prozesse. Das geht meist gut, wenn ich den DataFrame sinnvoll in "Scheiben" schneiden und an die Prozesse verteilen kann.
Manchmal ist es inhaltlich, aber nicht sinnvoll und ich muss eigentlich den gesamten DataFrame an die Prozesse verteilen, ohne dessen Umfang vor dem Pickeln reduzieren zu können. Gefühlt würde ich sagen, dass Python das Pickeln für jeden Prozess erneut vornimmt, anstatt nur einmal zu Pickeln und das dann einfach zu kopieren. Bin mir bei dem Punkt nicht sicher.
Nun habe ich vom Manager (https://docs.python.org/3/library/multiprocessing.html#managers) gehört und dass es da eine Art proxy Datenobjekt gibt. Ein Manager wäre gut geeignet, um Daten zwischen Prozessen zu teilen. Klingt so, also ob ich da kein Pickeling befürchten müsste.
Woraus schließt Du das? Das geht über (TCP?-)Sockets, die Daten müssen also serialisiert werden. Und der Default-Serializer ist laut https://docs.python.org/3/library/multiprocessing.html#multiprocessing.manag... 'pickle'. Eventuell kannst Du einen Manager schreiben, der die Daten nur einmal pickelt (einlegt?) und dann bei jedem weiteren Zugriff die gleichen Daten liefert. Beim Überfliegen der Doku springt mir aber nicht sofort ein Ansatz ins Auge. hp
participants (2)
-
c.buhtz@posteo.jp
-
Peter J. Holzer