Многопроцессорность Python: эффективно сохраняйте только лучшие прогоныPython

Программы на Python
Ответить Пред. темаСлед. тема
Anonymous
 Многопроцессорность Python: эффективно сохраняйте только лучшие прогоны

Сообщение Anonymous »

Я прочитал много сообщений о распараллеливании с использованием модуля multiprocessing, но ни один из них не ответил на мой вопрос.
У меня очень длинный генератор, выдающий мне значения параметров и для каждого я хочу вычислить некоторое значение функции. Однако я хочу сохранить только лучшие и многие, так как меня интересуют только лучшие, а сохранение всех результатов приведет к взрыву оперативной памяти.
На мой взгляд, их два. способы сделать это: 1) использовать общую разделяемую память между процессами, в которой сохраняются лучшие значения, или 2) хранить отдельные списки лучших результатов для каждого ядра/процесса, а затем вручную объединять эти списки вместе.
Я думаю, что второй метод будет лучше, но я так считаю не знаю, как это реализовать.
Вот что у меня получилось:

Код: Выделить всё

import numpy as np
import multiprocessing
from functools import partial

def get_generator(length: int):
for i in range(length):
yield [i, i + 1]

def some_func(x, other_stuff):
y = np.sum(x)
return y

def task(other_stuff, x: np.ndarray):
val = some_func(x, other_stuff)

if val > task.some_dict['min']:
task.l.append(val)
task.some_dict['min'] = val
return

def task_init(l, some_dict):
task.l = l
task.some_dict = some_dict
task.some_dict['min'] = np.NINF

n = 20
generator = get_generator(n)
other_stuff = np.nan

func = partial(task, other_stuff)

l = multiprocessing.Manager().list()
some_dict = multiprocessing.Manager().dict()

p = multiprocessing.Pool(None, task_init, [l, some_dict])

p.imap(func, generator, chunksize=10000)

p.close()
p.join()

Это будет чем-то похоже на то, что я хочу сделать. Но меня действительно волнует производительность, и в реальном коде сравнение/сохранение лучших значений будет более сложным, поэтому я думаю, что подход с общей памятью будет очень медленным.
Мой вопрос закипает вплоть до:
Если у меня есть, например. 8 ядер, как же мне иметь 8 списков лучших результатов каждый для одного ядра, которые будут возвращаться, чтобы ядра работали совершенно независимо и достаточно быстро?
Спасибо большое!< /п>

Подробнее здесь: https://stackoverflow.com/questions/644 ... -best-runs
Реклама
Ответить Пред. темаСлед. тема

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение

Вернуться в «Python»