Ich versuche, einen multivariaten Fixpunkt-Iterationsalgorithmus mit Multiprocessing zu beschleunigen, aber ich habe Probleme mit gemeinsamen Daten. Mein Lösungsvektor ist eigentlich ein benanntes Wörterbuch und kein Vektor von Zahlen. Jedes Element des Vektors wird tatsächlich unter Verwendung einer anderen Formel berechnet. Auf einem hohen Niveau, ich habe ein Algorithmus wie folgt aus:Python Multiprocessing-Pool mit gemeinsamen Daten
current_estimate = previous_estimate
while True:
for state in all_states:
current_estimate[state] = state.getValue(previous_estimate)
if norm(current_estimate, previous_estimate) < tolerance:
break
else:
previous_estimate, current_estimate = current_estimate, previous_estimate
Ich versuche, die for-Schleife Teil mit Multiprocessing parallelisieren. Die Variable previous_estimate
ist schreibgeschützt und jeder Prozess muss nur auf ein Element current_estimate
schreiben. Mein aktueller Versuch, die for-Schleife Umschreiben ist wie folgt:
# Class and function definitions
class A(object):
def __init__(self,val):
self.val = val
# representative getValue function
def getValue(self, est):
return est[self] + self.val
def worker(state, in_est, out_est):
out_est[state] = state.getValue(in_est)
def worker_star(a_b_c):
""" Allow multiple arguments for a pool
Taken from http://stackoverflow.com/a/5443941/3865495
"""
return worker(*a_b_c)
# Initialize test environment
manager = Manager()
estimates = manager.dict()
all_states = []
for i in range(5):
a = A(i)
all_states.append(a)
estimates[a] = 0
pool = Pool(process = 2)
prev_est = estimates
curr_est = estimates
pool.map(worker_star, itertools.izip(all_states, itertools.repeat(prev_est), itertools.repreat(curr_est)))
Das Problem, das ich zur Zeit in renne ist, dass die Elemente zum all_states
Array hinzugefügt sind nicht die gleichen wie die in die manager.dict()
hinzugefügt. Ich bekomme immer key value
Fehler beim Versuch, Elemente des Wörterbuchs mit Elementen des Arrays zugreifen. Und beim Debuggen stellte ich fest, dass keines der Elemente gleich ist.
print map(id, estimates.keys())
>>> [19558864, 19558928, 19558992, 19559056, 19559120]
print map(id, all_states)
>>> [19416144, 19416208, 19416272, 19416336, 19416400]