2016-04-21 1 views
2

J'ai rencontré ce problème que tout littéral dict impliqué dans ipyparallel map est manquant et devient {} dans le résultat de sortie.IPython-Parallel: littéral Dict manquant dans la carte parallèle

Ce problème n'a aucune incidence sur les éléments dict ajoutés via la méthode update et les constructeurs de dict.

Pour reproduire le problème, vous pouvez faire pivoter un cluster avec un direct view appelé, par exemple dview. Le code ci-dessous a été testé dans IPython avec Python 3.4 (client et moteur).

dview.map(lambda x: {'label': x*2}, range(4)} 

Il retournera [{}, {}, {}, {}], quand vous attendez la clé apparaissent label dans le dict.

Le même problème se produit aussi bien dans les situations suivantes:

  • déclaration Fonction normale
  • Dict littéral utilisé comme une valeur intermédiaire (même comme argument de update)
+0

Juste réalisé: Ceci est seulement reproductible en utilisant un cluster distant. Spun up 'ipcluster' sur la machine locale, cela fonctionne très bien. Même si j'exécute 'ipython' alors' rc = Client() 'sur la machine qui héberge le contrôleur, le code ci-dessus s'exécute correctement. – streamliner18

Répondre

0

Je ne sais pas Si cela s'applique à votre problème python 3.4, mais quand j'exécute votre code sur python 2.7.9, la méthode map génère un objet asynchrone et non un dictionnaire. Pour obtenir un dictionnaire en utilisant la méthode map, je dois utiliser la compréhension de liste pour parcourir l'objet asynchrone. La méthode map_sync fonctionne cependant très bien.

Voici un extrait de code si vous souhaitez l'essayer sur votre cluster à distance (insérer fichier JSON approprié):

from IPython.parallel import Client 

c = Client() 
dview = c[:] 

smap = dview.map_sync(lambda x: {'label': x*2}, range(4)) 
print(smap) #gives dict 

amap = dview.map(lambda x: {'label': x*2}, range(4)) 
print(amap) #produces async obj 

amap_dict = [r for i,r in enumerate(amap)] 
print(amap_dict) #gives dict 

Plus d'informations sur les objets async ici: https://ipython.org/ipython-doc/2/parallel/asyncresult.html#map-results-are-iterable