Supposons que j'ai une grande mémoire un tableau numpy, j'ai une fonction func
que prend dans ce tableau géant en entrée (en collaboration avec d'autres paramètres). func
avec les différents paramètres à utiliser peuvent être exécutées 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 le multitraitement bibliothèque, alors que le tableau géant sera copié plusieurs fois dans différents processus.
Est-il un moyen pour permettre aux différents processus partagent le même tableau? Ce tableau objet est en lecture seule et ne sera jamais modifié.
Ce qui est plus compliqué, si l'arr n'est pas un tableau, mais l'arbitraire d'un objet python, est-il un moyen de le partager?
[ÉDITÉ]
J'ai lu la réponse, mais je suis encore un peu confus. Depuis fork() est copy-on-write, il ne faut pas se prévaloir de tout coût supplémentaire lors de la ponte de nouveaux processus en python de multitraitement de la bibliothèque. Mais le code suivant permet de croire qu'il est 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;
de sortie (et par la manière, le coût augmente à mesure que la taille de la matrice augmente, donc je pense qu'il y est encore des frais généraux liés à la mémoire de la copie):
construct array = 0.0178790092468
multiprocessing overhead = 0.252444982529
Pourquoi il y a surcharge énorme, si nous n'avons pas copier le tableau? Et quel rôle la mémoire partagée pour me sauver?