Path: csiph.com!fu-berlin.de!uni-berlin.de!not-for-mail From: c.buhtz@posteo.jp Newsgroups: de.comp.lang.python Subject: =?utf-8?q?=5BPython-de=5D_multiprocessing=2EManager=3A_Kann_ich_damit_das_Pickel_reduzieren=3F?= Date: Mon, 05 Dec 2022 14:20:55 +0000 Lines: 48 Message-ID: <65ae8c8a7e0892ad66a1462c43b4620f@posteo.de> Mime-Version: 1.0 Content-Type: text/plain; charset=UTF-8; format=flowed Content-Transfer-Encoding: quoted-printable X-Trace: news.uni-berlin.de cvIGdJvAkDPy8JFQAYKcFg5fzzSWaTAOtSDaQU8/rUuw== Authentication-Results: mail.python.org; dkim=pass reason="2048-bit key; unprotected key" header.d=posteo.jp header.i=@posteo.jp header.b=oFbUs+2G; dkim-adsp=pass; dkim-atps=neutral DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=posteo.jp; s=2017; t=1670250056; bh=1jfHqnq7aI6E+jauazt3vB75WY2pVnbSC+EAP1V23vA=; h=Date:From:To:Subject:From; b=oFbUs+2GeqSQeTBmdBaFZrIWojRI/bNfm1VVsGssaJQHSArUrfrq49+qQbFlj2tec 3SazYbfL5BmZcJodMXDkl//hxb33XZ31R31Jmj5xS4P1IUhgMu9cOo8AH+BZEIrAVW 1FhsmezdTbPkNJwj/NZElaj0abAUgnJoZzt5sAUGz+ZabVnufs/LSDCBhfJtsovnU4 JRKYMhmcUnEORdIes7QiKXQE09niw0tqA0Uqvl/rMzJcKCk8O7RX4b0uQilTOHxOoB ad3hoHYi76VpQvxf0Cv8c2qh1CXD50nqFcReHfYL1OSWv8O2TgGl/oTwburflUHYcF Rr11ChCE2VFpQ== Mail-Followup-To: Python de Message-ID-Hash: W3RXEABOFPE6TGS4K5DQXV3L3PJN46VN X-Message-ID-Hash: W3RXEABOFPE6TGS4K5DQXV3L3PJN46VN X-MailFrom: c.buhtz@posteo.jp X-Mailman-Rule-Misses: dmarc-mitigation; no-senders; approved; emergency; loop; banned-address; member-moderation; header-match-python-de.python.org-0; nonmember-moderation; administrivia; implicit-dest; max-recipients; max-size; news-moderation; no-subject; digests; suspicious-header X-Mailman-Version: 3.3.7 Precedence: list List-Id: Die Deutsche Python Mailingliste Archived-At: List-Archive: List-Help: List-Owner: List-Post: List-Subscribe: List-Unsubscribe: Xref: csiph.com de.comp.lang.python:5912 Hallo, ich arbeite schon l=C3=A4nger mit "multiprocessing" und auch=20 "concurrent.futures.ProcessPoolExecutor". Ich kenne den Unterschied=20 zwischen Thread und Process und wei=C3=9F auch, dass bei Prozessen ordentli= ch=20 Ressourcen f=C3=BCr das Pickeln draufgehen k=C3=B6nnen. Genau hier ist mein= =20 Problem. Ich verteile die (ausschlie=C3=9Flich lesenden!) Aufgaben an einem=20 pandas.DataFrame (z.B. 20 Spalten und 700.000 Zeilen) auf mehrere=20 Prozesse. Das geht meist gut, wenn ich den DataFrame sinnvoll in=20 "Scheiben" schneiden und an die Prozesse verteilen kann. Manchmal ist es inhaltlich, aber nicht sinnvoll und ich muss eigentlich=20 den gesamten DataFrame an die Prozesse verteilen, ohne dessen Umfang vor=20 dem Pickeln reduzieren zu k=C3=B6nnen. Gef=C3=BChlt w=C3=BCrde ich sagen, d= ass Python=20 das Pickeln f=C3=BCr jeden Prozess erneut vornimmt, anstatt nur einmal zu= =20 Pickeln und das dann einfach zu kopieren. Bin mir bei dem Punkt nicht=20 sicher. Nun habe ich vom Manager=20 (https://docs.python.org/3/library/multiprocessing.html#managers) geh=C3=B6= rt=20 und dass es da eine Art proxy Datenobjekt gibt. Ein Manager w=C3=A4re gut= =20 geeignet, um Daten zwischen Prozessen zu teilen. Klingt so, also ob ich=20 da kein Pickeling bef=C3=BCrchten m=C3=BCsste. Es geht hier wohlgemerkt nur= um=20 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=20 doch mal ein 700.000 Zeilen DataFrame an. Der liegt dann nur 1x im=20 Speicher, dazu je Prozess ein ProxyObjekt. Pandas vektorisiert ja gerne.=20 Ich bin da unsicher, ob so ein Proxy das Handeln kann, wie pandas auf=20 das DataFrame zugreift. Mein Speicher ist nicht das Problem, davon habe=20 ich genug. Das Problem ist die Geschwindigkeit mit welcher der Speicher=20 zwischen den Prozessen "geteilt" (also bspw. gepickelt) wird. Was meint ihr dazu? SG Christian