Die Python-Mehrfachverarbeitung dauert viel länger als die Einzelverarbeitung

8

Ich führe einige große Berechnungen auf 3 verschiedenen numpigen 2D-Arrays nacheinander durch. Die Arrays sind riesig, jeweils 25000x25000. Jede Berechnung nimmt viel Zeit in Anspruch, daher habe ich beschlossen, 3 von ihnen parallel auf 3 CPU-Kernen auf dem Server laufen zu lassen. Ich befolge die Standard-Multiprocessing-Richtlinie und erstelle 2 Prozesse und eine Worker-Funktion. Zwei Berechnungen laufen durch die 2 Prozesse und die dritte läuft lokal ohne separaten Prozess. Ich übergebe die riesigen Arrays als Argumente der Prozesse wie:

%Vor%

Die Worker-Funktion sendet zwei numpige Vektoren (1D-Array) in einer Liste, die in der Warteschlange angehängt ist, wie folgt zurück:

%Vor%

Ich verwende nicht multiprocessing.pool

aber überraschenderweise bekomme ich keine Beschleunigung, es läuft tatsächlich dreimal langsamer. Übergeben große Arrays Zeit? Ich kann nicht herausfinden, was vor sich geht. Sollte ich Shared Memory-Objekte anstelle von Arrays verwenden?

Ich werde dankbar sein, wenn jemand helfen kann.

Danke.

    
Sayantan 29.10.2013, 21:08
quelle

2 Antworten

1

Mein Problem scheint gelöst zu sein. Ich war mit einem django-Modul aus dem Inneren der ich rief multiprocessing.pool.map_async. Meine Worker-Funktion war eine Funktion innerhalb der Klasse selbst. Das war das Problem. Multiprocessesing kann nicht eine Funktion der gleichen Klasse in einem anderen Prozess nennen, weil Subprozesse Speicher nicht teilen. Innerhalb des Subprozesses gibt es also keine Live-Instanz der Klasse. Wahrscheinlich deshalb wird es nicht angerufen. So weit ich verstanden habe. Ich entfernte die Funktion aus der Klasse und legen Sie sich in der gleichen Datei, aber außerhalb der Klasse, kurz vor der Klassendefinition beginnt. Es funktionierte. Ich habe auch mäßige Beschleunigung bekommen. Und noch etwas sind Leute, die das gleiche Problem haben, bitte lesen Sie keine großen Arrays und gehen Sie zwischen Prozessen vor. Beizen und Auspicken würde viel Zeit in Anspruch nehmen und Sie werden nicht schneller, sondern schneller beschleunigen. Versuchen Sie, Arrays innerhalb des Subprozesses selbst zu lesen.

Und wenn möglich bitte numpy.memmap Arrays verwenden, sind sie recht schnell.

    
Sayantan 08.11.2013, 19:37
quelle
1

Hier ist ein Beispiel mit np.memmap und Pool . Beachten Sie, dass Sie die Anzahl der Prozesse und Mitarbeiter definieren können. In diesem Fall haben Sie keine Kontrolle über die Warteschlange, was mit multiprocessing.Queue :

erreicht werden kann %Vor%

Sie können eine bessere Leistung erzielen, wenn Sie die parallele Verarbeitung des Shared Memory verwenden. Siehe diese verwandte Frage:

Saullo Castro 31.10.2013 23:09
quelle