Verwendung der Python-Multiprocessing-Pool.map zum Füllen von numpy-Arrays in einer for-Schleife

8

Ich möchte ein 2D-numpy Array innerhalb einer for-Schleife füllen und die Berechnung mit Multiprocessing beschleunigen.

%Vor%

Der Effekt der Ausführung ist, dass Python 4 Subprozesse ausführt und 4 CPU-Kerne belegt, ABER die Ausführung wird nicht beendet und das Array wird nicht gedruckt. Wenn ich versuche, das Array auf die Festplatte zu schreiben, passiert nichts.

Kann mir jemand sagen warum?

    
MoTSCHIGGE 17.09.2014, 10:32
quelle

3 Antworten

1

Folgendes funktioniert. Zuerst ist es eine gute Idee, den Hauptteil Ihres Codes in einem Hauptblock zu schützen, um seltsame Nebenwirkungen zu vermeiden. Das Ergebnis von poo.map() ist eine Liste, die die Bewertungen für jeden Wert im Iterator list_start_vals enthält, sodass Sie array_2D nicht zuvor erstellen müssen.

%Vor%

vielleicht wirst du Probleme mit pool.close() haben, aus den Kommentaren von @hpaulj kannst du diese Zeile entfernen, falls du Probleme hast ...

    
Saullo Castro 17.09.2014 13:27
quelle
1

Wenn Sie die Array-Füllung weiterhin verwenden möchten, können Sie pool.apply_async anstelle von pool.map verwenden. Ausgehend von Saullos Antwort:

%Vor%

Dies läuft etwas langsamer als map . Aber es erzeugt keinen Laufzeitfehler wie mein Test der Kartenversion: Exception RuntimeError: RuntimeError('cannot join current thread',) in <Finalize object, dead> ignored

    
hpaulj 17.09.2014 20:01
quelle
0

Das Problem liegt daran, dass pool.map in for-Schleife ausgeführt wird. Das Ergebnis der map () -Methode entspricht funktional der integrierten Zuordnung (), außer dass einzelne Tasks parallel ausgeführt werden. In diesem Fall wird die pool.map (fill_array, list_start_vals) 20-mal aufgerufen und beginnt für jede Iteration der for-Schleife parallel zu laufen. Code unten sollte funktionieren

Code:

%Vor%     
Ram 17.09.2014 11:38
quelle