Ne peut pas pickle Fonction
Donc je vais essayer d'augmenter la vitesse de mon temps de calcul, en faisant un peu de multitraitement
Je suis en train d'utiliser la piscine travailleurs.
En haut de mon code j'ai
import Singal as s
import multiprocessing as mp
def wrapper(Channel):
Noise_Frequincies = []
for i in range(1,125):
Noise_Frequincies.append(60.0*float(i))
Noise_Frequincies.append(180.0)
filter1 = s.Noise_Reduction(Sample_Rate,Noise_Frequincies,Channel)
return filter1
Puis, quand vient le temps-je utiliser
Both_Channels = [Chan1, Chan2]
results = mp.Pool(2).map(wrapper,Both_Channels)
filter1 = results[0]
filter2 = results[1]
J'obtiens l'erreur suivante
Exception in thread Thread-2:
Traceback (most recent call last):
File "/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/threading.py", line 808, in __bootstrap_inner
self.run()
File "/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/threading.py", line 761, in run
self.__target(*self.__args, **self.__kwargs)
File "/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/multiprocessing/pool.py", line 342, in _handle_tasks
put(task)
PicklingError: Can't pickle <type 'function'>: attribute lookup __builtin__.function failed
Chan1 et Chan2 sont des tableaux de mon signal, et je suis en train de filtrer un peu de bruit à la sortie de chaque.
Je suis nouveau sur le multitraitement donc je m'excuse si c'est une stupide erreur
double possible de Can pas pickle <type 'instancemethod" > lors de l'utilisation de python multitraitement de la Piscine.map()
Je n'ai pas l'utilisation de classes personnalisées, et c'est là son problème est (au moins autant que je peux dire)
Le problème est que pas tous les objets sont picklable. Les objets qui ne sont pas picklable? Viens de lire la doc.
pouvez-vous en dire plus sur la façon dont sont définis Chan1/Chan2? quels sont-ils?
Chan1 et Chan2 est tout simplement un tableau de nombres. Ils viennent d'une série de fichiers de données binaires, puis découpé pour être une puissance de 2.
Je n'ai pas l'utilisation de classes personnalisées, et c'est là son problème est (au moins autant que je peux dire)
Le problème est que pas tous les objets sont picklable. Les objets qui ne sont pas picklable? Viens de lire la doc.
pouvez-vous en dire plus sur la façon dont sont définis Chan1/Chan2? quels sont-ils?
Chan1 et Chan2 est tout simplement un tableau de nombres. Ils viennent d'une série de fichiers de données binaires, puis découpé pour être une puissance de 2.
OriginalL'auteur Casey Daniel | 2014-03-03
Vous devez vous connecter pour publier un commentaire.
J'ai marqué cette question, dans la dup de que Q/A, et pour résumer: vous ne pouvez pas pickle fonctions, et c'est ce que vous essayez de le faire lorsque vous passez
wrapper()
àPool().map()
. Pour mariner des fonctions, vous devez utiliser copy_reg, comme le montre ce exemple.non, son problème qu'il a essayé de pickle une méthode d'instance, ce qui est relativement proche d'une fonction, car les deux ne peuvent pas être traitées. Et la solution qui devrait fonctionner pour vous aussi.
Si je n'ai pas testé...
HTH
Both_Channels
, paswrapper
. Un peu dur à dire depuis le traceback est inutile.ou en fait le décapage de l'erreur provient probablement d'essayer de navire
s.Noise_Reduction
des objets à travers le tuyau. Pari que c'est.mon sentiment est que c'est en effet wrapper qui est défaillant (compte tenu de l'exception soulevée), bien que vous peut-être raison à propos de
s.Noise_Reduction
être la chose à l'intérieur de la fonction dans laquelle il est unpickable.Est-il un moyen facile de pickle plusieurs fonctions? Réduction du bruit aussi des appels de plusieurs autres méthodes pour réduire le bruit dans mon signal. Suis-je tout simplement aboiements le mauvais arbre de rendre les choses plus efficaces?
Eh bien, je pense que quelle que soit la véritable bug, votre problème est que vous êtes en train de déplacer des algorithmes entre les processus au lieu de se déplacer seuls les jeux de données que vous voulez les algorithmes de travailler sur. Parce que l'algorithme ne changent pas pendant la durée du programme, vous pouvez instancier facilement vos processus avec eux, et seulement obtenir les données pour être nettoyée entre eux.
OriginalL'auteur zmo