Ich muss oft eine Funktion auf die Gruppen eines sehr großen DataFrame
(gemischten Datentyps) anwenden und möchte mehrere Kerne nutzen.
Ich kann einen Iterator aus den Gruppen erstellen und das Multiprozessor-Modul verwenden, aber es ist nicht effizient, da jede Gruppe und die Ergebnisse der Funktion für die Nachrichtenübermittlung zwischen Prozessen ausgewählt werden müssen.
Gibt es eine Möglichkeit, das Beizen oder sogar das DataFrame
vollständige Kopieren zu vermeiden ? Es sieht so aus, als ob die Shared-Memory-Funktionen der Multiprocessing-Module auf numpy
Arrays beschränkt sind . Gibt es noch andere Möglichkeiten?
python
pandas
multiprocessing
shared-memory
user2303
quelle
quelle
Antworten:
Aus den obigen Kommentaren geht hervor, dass dies für
pandas
einige Zeit geplant ist (es gibt auch ein interessant aussehendesrosetta
Projekt, das mir gerade aufgefallen ist).Bis jedoch alle parallelen Funktionen integriert sind
pandas
, ist mir aufgefallen, dass es sehr einfach ist, effiziente und nicht speicherkopierende parallele Erweiterungenpandas
direkt mitcython
+ OpenMP und C ++ zu schreiben .Hier ist ein kurzes Beispiel für das Schreiben einer parallelen Gruppensumme, deren Verwendung ungefähr so ist:
und Ausgabe ist:
Hinweis Zweifellos wird die Funktionalität dieses einfachen Beispiels irgendwann Teil davon sein
pandas
. Einige Dinge sind jedoch für einige Zeit natürlicher in C ++ zu parallelisieren, und es ist wichtig zu wissen, wie einfach es ist, dies zu kombinierenpandas
.Zu diesem Zweck habe ich eine einfache Dateierweiterung aus einer Quelle geschrieben, deren Code folgt.
Es beginnt mit einigen Importen und Typdefinitionen
Der C ++ -
unordered_map
Typ dient zum Summieren durch einen einzelnen Thread und dervector
zum Summieren durch alle Threads.Nun zur Funktion
sum
. Es beginnt mit getippten Speicheransichten für den schnellen Zugriff:Die Funktion wird fortgesetzt, indem das Semi-Equal auf die Threads aufgeteilt wird (hier fest auf 4 codiert) und jeder Thread die Einträge in seinem Bereich summiert:
Wenn die Threads abgeschlossen sind, führt die Funktion alle Ergebnisse (aus den verschiedenen Bereichen) zu einem einzigen zusammen
unordered_map
:Sie müssen nur noch ein erstellen
DataFrame
und die Ergebnisse zurückgeben:quelle