Verwenden von "Copy-on-Write" zum Kopieren von Daten in Multiprocessing.Pool () Worker-Prozesse
Ich habe ein bisschen vonmultiprocessing
Python-Code, der ungefähr so aussieht:
import time
from multiprocessing import Pool
import numpy as np
class MyClass(object):
def __init__(self):
self.myAttribute = np.zeros(100000000) # basically a big memory struct
def my_multithreaded_analysis(self):
arg_lists = [(self, i) for i in range(10)]
pool = Pool(processes=10)
result = pool.map(call_method, arg_lists)
print result
def analyze(self, i):
time.sleep(10)
return i ** 2
def call_method(args):
my_instance, i = args
return my_instance.analyze(i)
if __name__ == '__main__':
my_instance = MyClass()
my_instance.my_multithreaded_analysis()
Nach dem Lesen von Antworten zur Funktionsweise des Speichers in anderen StackOverflow-Antworten wie dieserPython Multiprocessing Memory Usage Ich hatte den Eindruck, dass dies den Speicher nicht im Verhältnis zu der Anzahl der Prozesse belegen würde, die ich für die Mehrfachverarbeitung verwendet habe, da es sich um eine Kopie beim Schreiben handelt und ich keines der Attribute von @ geändert habmy_instance
. Wenn ich top ausführe, sehe ich jedoch einen hohen Arbeitsspeicher für alle Prozesse. Dies besagt, dass die meisten meiner Prozesse viel Arbeitsspeicher belegen (dies ist die Top-Ausgabe von OSX, aber ich kann unter Linux replizieren).
Meine Frage ist im Grunde, interpretiere ich das richtig in meiner Instanz vonMyClass
wird tatsächlich im gesamten Pool dupliziert? Und wenn ja, wie kann ich das verhindern? Soll ich eine solche Konstruktion einfach nicht verwenden? Mein Ziel ist es, die Speichernutzung für eine Computeranalyse zu reduzieren.
PID COMMAND %CPU TIME #TH #WQ #PORT MEM PURG CMPRS PGRP PPID STATE
2494 Python 0.0 00:01.75 1 0 7 765M 0B 0B 2484 2484 sleeping
2493 Python 0.0 00:01.85 1 0 7 765M 0B 0B 2484 2484 sleeping
2492 Python 0.0 00:01.86 1 0 7 765M 0B 0B 2484 2484 sleeping
2491 Python 0.0 00:01.83 1 0 7 765M 0B 0B 2484 2484 sleeping
2490 Python 0.0 00:01.87 1 0 7 765M 0B 0B 2484 2484 sleeping
2489 Python 0.0 00:01.79 1 0 7 167M 0B 597M 2484 2484 sleeping
2488 Python 0.0 00:01.77 1 0 7 10M 0B 755M 2484 2484 sleeping
2487 Python 0.0 00:01.75 1 0 7 8724K 0B 756M 2484 2484 sleeping
2486 Python 0.0 00:01.78 1 0 7 9968K 0B 755M 2484 2484 sleeping
2485 Python 0.0 00:01.74 1 0 7 171M 0B 594M 2484 2484 sleeping
2484 Python 0.1 00:16.43 4 0 18 775M 0B 12K 2484 2235 sleeping