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

Antworten auf die Frage(4)

Ihre Antwort auf die Frage