Supposons que j'ai un grand tableau numpy en mémoire, j'ai une fonction func
qui prend ce tableau géant en entrée (avec quelques autres paramètres). func
avec différents paramètres peuvent être exécutés en parallèle. Par exemple:
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]
Si j'utilise une bibliothèque multitraitement, ce tableau géant sera copié plusieurs fois dans différents processus.
Existe-t-il un moyen de laisser différents processus partager le même tableau? Cet objet tableau est en lecture seule et ne sera jamais modifié.
Ce qui est plus compliqué, si arr n'est pas un tableau, mais un objet Python arbitraire, y a-t-il un moyen de le partager?
[ÉDITÉ]
J'ai lu la réponse mais je suis encore un peu confus. Puisque fork () est une copie sur écriture, nous ne devrions pas invoquer de coût supplémentaire lors de la création de nouveaux processus dans la bibliothèque multiprocesseur python. Mais le code suivant suggère qu'il y a une surcharge énorme:
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;
sortie (et au fait, le coût augmente à mesure que la taille du tableau augmente, donc je soupçonne qu'il y a encore des frais généraux liés à la copie de mémoire):
construct array = 0.0178790092468
multiprocessing overhead = 0.252444982529
Pourquoi y a-t-il une telle surcharge si nous ne copions pas le tableau? Et quelle part la mémoire partagée me sauve-t-elle?