J'utilise multiprocessing.Pool()
pour paralléliser certains calculs lourds.multitraitement avec de grandes données
La fonction cible renvoie beaucoup de données (une liste énorme). Je manque de RAM.
Sans multiprocessing
, je changerais simplement la fonction cible en un générateur, par yield
les éléments résultants l'un après l'autre, comme ils sont calculés. Je comprends que le multitraitement ne supporte pas les générateurs - il attend la sortie entière et la renvoie immédiatement, n'est-ce pas? Pas de rendement. Est-il possible de faire en sorte que les travailleurs Pool
produisent des données dès qu'ils sont disponibles, sans construire le tableau de résultats complet dans la RAM?
Exemple simple:
def target_fnc(arg):
result = []
for i in xrange(1000000):
result.append('dvsdbdfbngd') # <== would like to just use yield!
return result
def process_args(some_args):
pool = Pool(16)
for result in pool.imap_unordered(target_fnc, some_args):
for element in result:
yield element
Ceci est Python 2.7.
La file d'attente transmet les données décapées. So data -> pickle-> unpickle-> nouvelle copie des données. Cela ralentira le programme et utilisera beaucoup plus de RAM supplémentaire. On devrait envisager d'utiliser la mémoire partagée à la place. – Wang