Python-Speicherbelegung für mehrere Prozessoren

8

Ich habe ein Programm geschrieben, das wie folgt zusammengefasst werden kann:

%Vor%

Der echte Code (besonders'writeOutput () ') ist viel komplizierter. 'writeOutput () 'verwendet nur diese Werte, die es als Argumente verwendet (was bedeutet, dass es nicht auf Daten verweist)

Grundsätzlich lädt es einen riesigen Datensatz in den Speicher und verarbeitet ihn. Das Schreiben der Ausgabe wird an einen Unterprozess delegiert (es schreibt tatsächlich in mehrere Dateien und das nimmt viel Zeit in Anspruch). Jedes Mal, wenn ein Datenelement verarbeitet wird, wird es über res_queue an den Unterprozess gesendet, der wiederum das Ergebnis nach Bedarf in Dateien schreibt.

Der Unterprozess muss nicht auf die von'loadHugeData () 'geladenen Daten zugreifen, diese lesen oder ändern. Der Unterprozess muss nur das verwenden, was der Hauptprozess über "res_queue" sendet. Und das führt mich zu meinem Problem und meiner Frage.

Mir scheint, dass der Unterprozess eine Kopie des riesigen Datasets bekommt (wenn man die Speichernutzung mit 'top' überprüft). Ist das wahr? Und wenn ja, wie kann ich ID vermeiden (im Wesentlichen Doppelspeicherung)?

Ich benutze Python 2.6 und das Programm läuft unter Linux.

    
FableBlaze 07.02.2013, 11:21
quelle

1 Antwort

14

Das Modul multiprocessing basiert effektiv auf dem Systemaufruf fork , der eine Kopie des aktuellen Prozesses erstellt. Da Sie die umfangreichen Daten vor fork laden (oder multiprocessing.Process erstellen), erbt der untergeordnete Prozess eine Kopie der Daten.

Wenn jedoch das Betriebssystem, auf dem Sie arbeiten, COW (Copy-on-Write) implementiert, wird nur eine Kopie der Daten im physischen Speicher vorhanden sein, wenn Sie die Daten weder im übergeordneten noch im untergeordneten Prozess ändern Eltern und Kind teilen die gleichen physischen Speicherseiten (wenn auch in verschiedenen virtuellen Adressräumen) ; und selbst dann wird zusätzlicher Speicher nur für die Änderungen zugewiesen (in pagesize Inkrementen).

Sie können diese Situation vermeiden, indem Sie multiprocessing.Process aufrufen, bevor Sie Ihre riesigen Daten laden. Dann werden die zusätzlichen Speicherzuordnungen nicht im untergeordneten Prozess wiedergegeben, wenn Sie die Daten im übergeordneten Element laden.

    
isedev 07.02.2013, 11:31
quelle