Systemfehler beim Ausführen von Teilprozessen mit Multiprocessing

8

Ich erhalte einen Systemfehler (siehe unten), während ich einige simple numpy-basierte Matrixalgebra-Berechnungen parallel mit dem Multiprocessing-Paket (Python 2.73 mit numply 1.7.0 unter Ubuntu 12.04 auf Amazon EC2) durchführe. Mein Code funktioniert gut für kleinere Matrixgrößen, aber stürzt für größere ab (mit viel verfügbarem Speicher)

Die Größe der Matrizen, die ich verwende, ist beträchtlich (mein Code läuft gut für 1000000x10 float-dichte Matrizen, aber stürzt für 1000000x500 ab - ich übergebe diese Matrizen übrigens an / von Subprozessen). 10 vs 500 ist ein Laufzeitparameter, alles andere bleibt gleich (Eingabedaten, andere Laufzeitparameter etc.)

Ich habe auch versucht, den gleichen (portierten) Code mit python3 auszuführen - für größere Matrizen gehen die Subprozesse in einen Schlaf / Leerlauf-Modus (anstatt wie in Python 2.7 zu stürzen) und die Programme / Subprozesse hängen einfach dort ab nichts. Für kleinere Matrizen läuft der Code mit python3 gut.

Irgendwelche Vorschläge würden sehr geschätzt (Ich habe keine Ideen mehr)

Fehlermeldung:

%Vor%

Der Multiprocessing-Code, den ich verwende:

%Vor%

Unten ist der "proc", der für jeden Subprozess ausgeführt wird. Im Grunde genommen löst es viele Systeme linearer Gleichungen mit numpy (es erstellt benötigte Matrizen innerhalb des Subprozesses) und gibt die Ergebnisse als eine andere Matrix zurück. Wiederum funktioniert es für kleinere Werte eines Laufzeitparameters, stürzt aber ab (oder hängt in python3) für größere Werte.

%Vor%     
Yevgeny 27.02.2013, 17:26
quelle

1 Antwort

5

500.000.000 ist ziemlich groß: Wenn Sie float64 verwenden, sind das 4 Milliarden Bytes oder etwa 4 GB. (Das 10.000.000 Float-Array wäre 80 Millionen Byte oder etwa 80 MB - viel kleiner.) Ich erwarte, dass das Problem etwas mit Multiprocessing zu tun hat, indem versucht wird, die Arrays über eine Pipe an die Subprozesse zu binden.

Da Sie sich auf einer Unix-Plattform befinden, können Sie dieses Verhalten vermeiden, indem Sie das Speichervererbungsverhalten von fork() (das zum Erstellen von Workgroups für mehrere Prozessoren verwendet wird) ausnutzen. Ich hatte großen Erfolg mit diesem Hack (beschrieben aus diesem Projekt ) durch die Kommentare.

%Vor%     
Dougal 01.03.2013, 23:40
quelle

Tags und Links