Как эффективно использовать многопроцессорность, чтобы ускорить огромное количество крошечных задач? - PullRequest
1 голос
/ 21 ноября 2019

У меня небольшие проблемы с Python multiprocessing.Pool. У меня есть два списка numpy массив a и b, в котором

a.shape=(10000,3) и b.shape=(1000000000,3)

Тогда у меня есть функция, которая выполняет некоторые вычисления, такие как

def role(array, point):
    sub = array-point
    return (1/(np.sqrt(np.min(np.sum(sub*sub, axis=-1)))+0.001)**2)

Далее мне нужно вычислить

[role(a, point) for point in b]

Чтобы ускорить его, я пытаюсь использовать

    cpu_num = 4
    m = multiprocessing.Pool(cpu_num)
    cost_list = m.starmap(role, [(a, point) for point in b])
    m.close

Весь процесс занимает около 70 с, но если яустановите cpu_num = 1, время обработки уменьшится до 60 с ... Мой ноутбук имеет 6 ядер, для справки.

Здесь у меня есть два вопроса:

  1. Есть ли что-то, что я сделал неправильнос multiprocessing.Pool? почему время обработки увеличилось, если я установил cpu_num = 4?
  2. для такой задачи (каждый цикл for - очень крошечный процесс), следует ли мне использовать многопроцессорность для ускорения? Я чувствую, что каждый раз, заполнение Python Pool занимает больше времени, чем функция процесса role ...

Любые предложения действительно приветствуются.

1 Ответ

0 голосов
/ 21 ноября 2019

Если задачи слишком малы, то издержки многопроцессорной обработки станут вашим узким местом, и вы ничего не выиграете.

Если объем данных за задачу, который вы должны передать работнику или который имеет работникчтобы вернуться, вы также не выиграете много (или даже ничего не выиграете)

Если у вас есть 10.000 крошечных задач, то я рекомендую создать список мета-задач. Каждая мета-задача должна состоять из выполнения, например, 20 крошечных задач.

meta_tasks = []
for idx in range(0, len(tiny_tasks), 20):
    meta_tasks.append(tiny_tasks[idx:idx+20])

Затем передать мета-задачи в ваш рабочий пул.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...