Многопроцессорность Python (joblib) лучший способ передачи аргументов

Я заметил огромную задержку при использовании многопроцессорной обработки (с joblib). Вот упрощенная версия моего кода:

import numpy as np
from joblib import Parallel, delayed

class Matcher(object):
    def match_all(self, arr1, arr2):
        args = ((elem1, elem2) for elem1 in arr1 for elem2 in arr2)

        results = Parallel(n_jobs=-1)(delayed(_parallel_match)(self, e1, e2) for e1, e2 in args)
        # ...

    def match(self, i1, i2):
        return i1 == i2

def _parallel_match(m, i1, i2):
    return m.match(i1, i2)

matcher = Matcher()
matcher.match_all(np.ones(250), np.ones(250))

Поэтому, если я запускаю его, как показано выше, это занимает около 30 секунд и использует почти 200 МБ. Если я просто изменю параметр n_jobs в Parallel и установим для него значение 1, это займет всего 1,80 секунды и едва ли использует 50 МБ...

Я предполагаю, что это должно быть что-то связанное с тем, как я передаю аргументы, но не нашел лучшего способа сделать это...

Я использую Python 2.7.9


person Luigolas    schedule 26.04.2015    source источник


Ответы (1)


Я переписал код без использования библиотеки joblib, и теперь он работает так, как должен работать, хотя и не такой "красивый" код:

import itertools
import multiprocessing
import numpy as np


class Matcher(object):
    def match_all(self, a1, a2):
        args = ((elem1, elem2) for elem1 in a1 for elem2 in a2)
        args = zip(itertools.repeat(self), args)

        pool = multiprocessing.Pool()
        results = np.fromiter(pool.map(_parallel_match, args))
        # ...

    def match(self, i1, i2):
        return i1 == i2

def _parallel_match(*args):
    return args[0][0].match(*args[0][1:][0])

matcher = Matcher() 
matcher.match_all(np.ones(250), np.ones(250))

Эта версия работает как шарм и занимает всего 0,58 секунды...

Итак, почему он вообще не работает с joblib? Не могу понять это, но я думаю, что joblib делает копии всего массива для каждого отдельного процесса...

person Luigolas    schedule 27.04.2015