Google Groups no longer supports new Usenet posts or subscriptions. Historical content remains viewable.
Dismiss

[Python-de] multiprocessing.Manager: Kann ich damit das Pickel reduzieren?

0 views
Skip to first unread message

c.b...@posteo.jp

unread,
Dec 5, 2022, 9:21:09 AM12/5/22
to
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

Peter J. Holzer

unread,
Dec 5, 2022, 2:51:36 PM12/5/22
to
On 2022-12-05 14:20, c.b...@posteo.jp <c.b...@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.managers.BaseManager
'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

0 new messages