這個問題與我在幾天前發佈的other one有關;我已閱讀this question有關multiprocessing
與實例方法酸洗有關的問題。問題是,我不知道如何應用提供給我的情況的解決方案:在運行這個時候多處理並行化距離計算方法
def _pickle_method(method):
# Author: Steven Bethard
# http://bytes.com/topic/python/answers/552476-why-cant-you-pickle-instancemethods
func_name = method.im_func.__name__
obj = method.im_self
cls = method.im_class
cls_name = ''
if func_name.startswith('__') and not func_name.endswith('__'):
cls_name = cls.__name__.lstrip('_')
if cls_name:
func_name = '_' + cls_name + func_name
return _unpickle_method, (func_name, obj, cls)
def _unpickle_method(func_name, obj, cls):
# Author: Steven Bethard
# http://bytes.com/topic/python/answers/552476-why-cant-you-pickle-instancemethods
for cls in cls.mro():
try:
func = cls.__dict__[func_name]
except KeyError:
pass
else:
break
return func.__get__(obj, cls)
copy_reg.pickle(types.MethodType, _pickle_method, _unpickle_method)
class Circle(Feature):
# Stuff...
def __points_distance(self,points):
xa = n.array([self.xc,self.yc]).reshape((1,2))
d = n.abs(dist.cdist(points,xa) - self.radius)
return d
def points_distance(self,points,pool=None):
if pool:
return pool.map(self.__points_distance,points)
else:
return self.__points_distance(points)
這給ValueError: XA must be a 2-dimensional array
錯誤:
import tra.features as fts
import numpy as np
import multiprocessing as mp
points = np.random.random(size=(1000,2))
circle_points = np.random.random(size=(3,2))
feature = fts.Circle(circle_points)
pool = mp.Pool()
ds = feature.points_distance(points,pool=pool)
但這樣做時,它(顯然)工作:
pool = None
ds = feature.points_distance(points,pool=pool)
任何線索?
這是不同的(我檢查this實現),因爲該方法是實例化Circle
類,並調用其points_distance
方法另一個類中使用。在任何情況下,另一個不同之處在於points_distance
方法使用scipy.spatial.distance.cdist
,它預期(n,2)形numpy.ndarray
。它在使用串行版本時起作用,但引發了我在並行使用時提到的異常。我想有一個關於cPickle傳遞的參數的警告。
[Can not pickle使用python的多處理Pool.map()]時可能的重複(http://stackoverflow.com/questions/1816958/cant-pickle-type-instancemethod-when- using-pythons-multiprocessing-pool-ma) –
User
@用戶感謝您的幫助。我已經檢查了你提供的答案,但目前不適合我。 – SolidSnake