У меня очень длинный генератор, выдающий мне значения параметров и для каждого я хочу вычислить некоторое значение функции. Однако я хочу сохранить только лучшие и многие, так как меня интересуют только лучшие, а сохранение всех результатов приведет к взрыву оперативной памяти.
На мой взгляд, их два. способы сделать это: 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