Angenommen, ich habe ein großes Speicher-Numpy-Array. Ich habe eine Funktion func
, die dieses riesige Array als Eingabe verwendet (zusammen mit einigen anderen Parametern). func
mit verschiedenen Parametern kann parallel ausgeführt werden. Beispielsweise:
def func(arr, param):
# do stuff to arr, param
# build array arr
pool = Pool(processes = 6)
results = [pool.apply_async(func, [arr, param]) for param in all_params]
output = [res.get() for res in results]
Wenn ich eine Multiprozessor-Bibliothek verwende, wird dieses riesige Array mehrmals in verschiedene Prozesse kopiert.
Gibt es eine Möglichkeit, verschiedene Prozesse dasselbe Array gemeinsam nutzen zu lassen? Dieses Array-Objekt ist schreibgeschützt und wird niemals geändert.
Was ist komplizierter, wenn arr kein Array, sondern ein beliebiges Python-Objekt ist, gibt es eine Möglichkeit, es zu teilen?
[BEARBEITET]
Ich habe die Antwort gelesen, bin aber immer noch etwas verwirrt. Da fork () Copy-on-Write ist, sollten wir keine zusätzlichen Kosten verursachen, wenn wir neue Prozesse in der Python-Multiprocessing-Bibliothek erzeugen. Der folgende Code deutet jedoch auf einen enormen Overhead hin:
from multiprocessing import Pool, Manager
import numpy as np;
import time
def f(arr):
return len(arr)
t = time.time()
arr = np.arange(10000000)
print "construct array = ", time.time() - t;
pool = Pool(processes = 6)
t = time.time()
res = pool.apply_async(f, [arr,])
res.get()
print "multiprocessing overhead = ", time.time() - t;
Ausgabe (und im Übrigen steigen die Kosten mit zunehmender Größe des Arrays, sodass ich vermute, dass beim Kopieren des Speichers immer noch Overhead besteht):
construct array = 0.0178790092468
multiprocessing overhead = 0.252444982529
Warum ist der Aufwand so groß, wenn wir das Array nicht kopiert haben? Und welchen Teil rettet mich der gemeinsame Speicher?