У меня есть функция f(x)
Я хочу оценить список значений xrange
параллельно.Функция делает что-то вроде этого:
def f(x, wrange, dict1, dict2):
out_list = []
v1 = dict1[x]
for w in wrange:
v2 = dict2[x-w]
out_list += [np.dot(v1, v2)]
return out_list
, она принимает значения матрицы из словаря dict1
, вектор из словаря dict2
, затем умножает их вместе.Теперь мой обычный подход для параллельного выполнения этого будет выглядеть примерно так:
import functools
import multiprocessing
par_func = functools.partial(f, wrange=wrange, dict1=dict1, dict2=dict2)
p = multiprocessing.Pool(4)
ssdat = p.map(par_func, wrange)
p.close()
p.join()
Теперь, когда dict1
и dict2
большие словари, это приводит к сбою кода с ошибкой
File "/anaconda3/lib/python3.6/multiprocessing/connection.py", line 393, in _send_bytes header = struct.pack("!i", n)
struct.error: 'i' format requires -2147483648 <= number <= 2147483647
, и я думаю, это потому, что pool
делает копии dict1
и dict2
для каждой оценки моей функции.Вместо этого существует ли эффективный способ установить эти словари в качестве объектов общей памяти?map
лучшая функция для этого?