J'essaie d'exploiter concurrent.futures.ProcessPoolExecutor
dans Python3
pour traiter une grande matrice en parallèle. La structure générale du code est:Pourquoi les performances de concurrent.futures.ProcessPoolExecutor sont-elles très faibles?
class X(object):
self.matrix
def f(self, i, row_i):
<cpu-bound process>
def fetch_multiple(self, ids):
with ProcessPoolExecutor() as executor:
futures = [executor.submit(self.f, i, self.matrix.getrow(i)) for i in ids]
return [f.result() for f in as_completed(futures)]
self.matrix
est un grand scipy csr_matrix. f
est ma fonction concurrente qui prend une ligne de self.matrix
et applique un processus lié au processeur. Enfin, fetch_multiple
est une fonction qui exécute plusieurs instances de f
en parallèle et renvoie les résultats.
Le problème est que, après l'exécution du script, tous les cœurs cpu sont moins de 50% d'occupation (Voir la capture d'écran suivante):
Pourquoi tous les cœurs ne sont pas occupés?
Je pense que le problème est le gros objet de self.matrix
et le passage des vecteurs de ligne entre les processus. Comment puis-je résoudre ce problème?