Распараллеливание методов в классе Python с многопроцессорностью - PullRequest
0 голосов
/ 05 апреля 2020

У меня есть класс, и в какой-то момент я хотел запустить метод с распараллеливанием с 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? Что может быть лучше, лучше использовать распараллеливание

...