0

Je suis novice en python et j'essaye de faire évoluer mon traitement en parallèle. J'ai un fichier avec un certain nombre de tuples, chacun avec une certaine valeur dans la dernière colonne. Je veux diviser ces données de fichier et appliquer ma fonction en parallèle à chaque morceau. Mais la chose est de diviser les données en morceaux en fonction de la valeur de la dernière colonne et d'appliquer la fonction pour chaque segment. Par exemple, la dernière colonne peut avoir «a» pour certains tuples et «b» pour certains et «c» pour certains. Donc, dans ce cas, je devrais obtenir trois morceaux et le traiter en parallèle. Le nombre de valeurs uniques dans la dernière colonne peut changer dépend de l'ensemble de données, donc j'ai besoin d'utiliser le processeur en conséquence. Ce que j'ai essayé jusqu'à maintenant est de lire le fichier et de créer un dictionnaire basé sur ces enregistrements, donc trois paires de valeurs-clés pour le précédent, une avec 'a' comme clé et tous les enregistrements ayant ' a 'comme valeurs et la même chose que' b 'et' c '. Je peux utiliser chunksize dans le multitraitement, mais ici ce n'est pas la taille, c'est basé sur la clé, alors comment puis-je y parvenir? Après le traitement des morceaux ci-dessus, j'ai besoin de la sortie de tous ensemble, l'ordre n'a pas d'importance et puis j'ai besoin d'utiliser toute la sortie pour un traitement ultérieur, comment puis-je faire mon programme principal jusqu'à ce que tous ces processus Achevée? Informez-moi si d'autres informations sont nécessaires. Merci.Multiprocessing Python pour chaque clé dans le dictionnaire

+0

Pourquoi voulez-vous diviser votre entrée en trois fixes groupes? La fonction à appliquer à tous n'est-elle pas la même? Si c'est le cas, il est beaucoup plus facile de le faire si vous n'insistez pas pour diviser manuellement - c'est-à-dire diviser les données * après que vous avez les résultats de la fonction – goncalopp

+0

Oui, mais je dois l'appliquer séparément pour chaque ensemble d'enregistrements ayant la même valeur sur la dernière colonne. Et ce n'est pas trois groupes fixes, c'est le nombre de valeurs uniques dans la dernière colonne. –

+0

Ne pouvez-vous les séparer après le processus parallèle? – goncalopp

Répondre

1

En supposant, comme vous l'avez, vous avez trois ensembles comme des valeurs sur le dictionnaire d, et que vous voulez appliquer la fonction f à chacun d'eux séparément:

from multiprocessing import Pool 
p = Pool()         #number of processes = number of CPUs 
keys, values= zip(*d.iteritems())   #ordered keys and values 
processed_values= p.map(f, values)   #apply the function f to each set and wait for result 
#then proceed to join the three sets 
+0

Avons-nous besoin de coder en dur le nombre de CPU? Est-il possible de le programmer de telle manière qu'il obtienne le nombre de processus basé sur le nombre de clefs dans mon dictionnaire? J'aurai plus de CPU et j'espère que mon nombre de clés ne dépassera jamais la limite du CPU. Donc, je veux prendre ça. –

+0

@Jeeva Vous pouvez fournir le nombre de processus comme argument unique: 'Pool (len (d))', mais cela ne vous apportera aucun avantage considérable, car les processus seront inutilisés si 'n_processes goncalopp

+0

Non, c'est pourquoi je pense à prendre le nombre de processus dans mon programme en fonction du nombre de clés. Si j'ai quatre ensembles d'enregistrements ou quatre clés, je peux initialiser ce p = Pool (4) basé sur ce droit? Et encore une chose que j'utilise python 3.4, je reçois une erreur - AttributeError: l'objet 'dict' n'a pas d'attribut 'iteritems' –

Questions connexes