У меня есть класс, и в какой-то момент я хотел запустить метод с распараллеливанием с multiprocessig
. Я следовал учебному пособию здесь , и оно работает как шарм, но когда я пытаюсь интегрироваться в мой код, это терпит неудачу. Что я пытался сделать: 1) Иметь матрицу размером 100 100. Каждая строка представляет временной ряд. В качестве первой попытки я не пытался ничего подсчитать. Мой упрощенный код выглядит следующим образом:
import multiprocessing
from multiprocessing import sharedctypes
class Xcorrelator(object):
...
def __call__(self, w):
self.xcorr_helper(w)
def xcorr_helper(self,row):
print "row:", row
tmp = np.ctypeslib.as_array(self._shared_array)
#Do the correlation linewise and store it in the tmp variable
def xcorr_parallel(self, maxlag = 600):
result_ccfs = np.ctypeslib.as_ctypes(np.zeros((100,100)))
self._shared_array = multiprocessing.sharedctypes.RawArray(result_ccfs._type_, result_ccfs)
w = np.arange(0,100, 1)
p = multiprocessing.Pool(4)
p.map(self, w)
p.close()
p.join()
result = np.ctypeslib.as_array(self._shared_array),
Когда я пытаюсь запустить код, я получаю следующее исключение:
cPickle.PicklingError: Can't pickle <class 'numpy.ctypeslib.c_double_Array_100_Array_100'>: attribute lookup numpy.ctypeslib.c_double_Array_100_Array_100 failed
Возможно, ошибка вызвана инициализацией поля RawArray без - это работает:
self._shared_array = multiprocessing.sharedctypes.RawArray(result_ccfs._type_, result_ccfs)
Как я могу решить это? Должен ли я избегать использования класса RawArray? Что может быть лучше, лучше использовать распараллеливание