Ich habe ein Pandas Dataframe, das Millionen von Zeilen hat und ich muss zeilenweise Operationen ausführen. Da ich eine Multicore-CPU habe, möchte ich diesen Prozess mit Multiprocessing beschleunigen. Ich würde das gerne tun, indem ich den Datenrahmen in gleich große Datenrahmen zerlege und jeden von ihnen in einem separaten Prozess verarbeite. So weit, so gut ... Das Problem ist, dass mein Code im OOP-Stil geschrieben ist und ich Pickle-Fehler mit einem Multiprocess-Pool bekomme. Was ich mache ist, dass ich einen Verweis auf eine Klassenfunktion self.X
an den Pool weitergebe. Ich verwende weiterhin Klassenattribute innerhalb von X
(nur Lesezugriff). Ich möchte wirklich nicht zum funktionalen Programmierstil zurückkehren ... Ist es also möglich Multiprocessing in einer OOP Umgebung durchzuführen?Multiprocessing mit Klassenfunktionen und Klassenattributen
0
A
Antwort
0
Es sollte möglich sein, solange alle Elemente in Ihrer Klasse (die Sie an die Unterprozesse übergeben) einfügbar ist. Das ist die einzige Sache, die Sie sicherstellen müssen. Wenn Elemente in Ihrer Klasse nicht vorhanden sind, können Sie sie nicht an einen Pool übergeben. Selbst wenn Sie nur self.x
übergeben, muss alles andere wie self.y
ersetzbar sein.
ich meine Pandas Dataframe-Verarbeitung wie folgt aus:
import pandas as pd
import multiprocessing as mp
import numpy as np
import time
def worker(in_queue, out_queue):
for row in iter(in_queue.get, 'STOP'):
value = (row[1] * row[2]/row[3]) + row[4]
time.sleep(0.1)
out_queue.put((row[0], value))
if __name__ == "__main__":
# fill a DataFrame
df = pd.DataFrame(np.random.randn(1e5, 4), columns=list('ABCD'))
in_queue = mp.Queue()
out_queue = mp.Queue()
# setup workers
numProc = 2
process = [mp.Process(target=worker,
args=(in_queue, out_queue)) for x in range(numProc)]
# run processes
for p in process:
p.start()
# iterator over rows
it = df.itertuples()
# fill queue and get data
# code fills the queue until a new element is available in the output
# fill blocks if no slot is available in the in_queue
for i in range(len(df)):
while out_queue.empty():
# fill the queue
try:
row = next(it)
in_queue.put((row[0], row[1], row[2], row[3], row[4]), block=True) # row = (index, A, B, C, D) tuple
except StopIteration:
break
row_data = out_queue.get()
df.loc[row_data[0], "Result"] = row_data[1]
# signals for processes stop
for p in process:
in_queue.put('STOP')
# wait for processes to finish
for p in process:
p.join()
Auf diese Weise habe ich nicht große Brocken von Datenrahmen passieren und ich habe nicht über picklable Elemente in meiner Klasse zu denken.
Verwandte Themen
- 1. Klassenfunktionen mit konstanten Objektparametern?
- 2. Mit 'const' in Klassenfunktionen
- 3. PHP Klassenfunktionen mit Variablen
- 4. Vererbung von Klassenattributen?
- 5. WxPython, wie man ListBox mit Klassenattributen füllt
- 6. Erzeugen eines neuen Dokuments mit entfernten Klassenattributen
- 7. Passing Iteratoren Klassenfunktionen
- 8. Dynamisch PHP-Klassenfunktionen erstellen
- 9. Python - Lazy Laden von Klassenattributen
- 10. SqlAlchemy und Multiprocessing
- 11. Python sklearn und multiprocessing
- 12. Probleme mit den Argumenten der Klassenfunktionen Python
- 13. Multiprocessing und Niceeness-Wert
- 14. Python Multiprocessing und Warteschlange
- 15. Python Multiprocessing mit booleschen und multiplen Argumenten
- 16. Python Multiprocessing mit gemeinsamen Variablen und asynchron?
- 17. Python Multiprocessing mit Frame
- 18. Multiprocessing mit erneuerbaren Queue
- 19. Websockets mit Multiprocessing
- 20. Python-Design - Initialisieren, Festlegen und Abrufen von Klassenattributen
- 21. python multiprocessing mit maxtasksperchild
- 22. Multiprocessing mit Karte
- 23. Globals Variablen und Python Multiprocessing
- 24. Python Code Coverage und Multiprocessing
- 25. mit Liste mit Python Multiprocessing
- 26. Python 3 Multiprocessing und Sockets
- 27. Python Multiprocessing und gemeinsame Variable
- 28. Tensorflow und Multiprocessing: Passing Sessions
- 29. Python 2.7.6 und Multiprocessing "Speicherleck"
- 30. Dynamische Aktualisierung von Klassenattributen zwischen verschiedenen Klassen