2016-07-13 3 views
0
import multiprocessing 

data = range(10) 

def map_func(i): 
    return [i] 

def reduce_func(a,b): 
    return a+b 

p = multiprocessing.Pool(processes=4) 
p.map(map_func, data) 

Comment puis-je utiliser reduce_func() comme réduire la fonction de la map_func() paralelised.Réduire avec multitraitement

Voici un exemple pySpark de ce que je veux faire:

rdd = sc.parallelize(data) 
result = rdd.map(map_func) 
final_result = result.reduce(reduce_func) 
+1

'functools.reduce (reduce_func, p.map (map_func, données))' produit une liste de numéros 0 à 9, le caractère aléatoire dépend de l'ordre le multi-traitement consiste à mapper les données. – chapelo

+0

Bien, merci. –

Répondre

1

Selon la documentation, multiprocessing.Pool.map() blocs jusqu'à ce que le résultat est prêt. Randomness n'est pas possible. Pour parvenir à un ordre de traitement aléatoire, utiliser la méthode imap_unordered():

from functools import reduce 

result = p.imap_unordered(map_func, data) 
final_result = reduce(reduce_func, result) 

# Three different runs: 
# [0, 1, 4, 5, 2, 6, 8, 9, 7, 3] 
# [0, 1, 4, 5, 2, 3, 8, 7, 6, 9] 
# [0, 1, 2, 5, 6, 7, 8, 4, 3, 9]