Есть ли что-то вроде разделяемой памяти в Dask для многопроцессорной обработки больших объектов? - PullRequest
0 голосов
/ 29 января 2020

В регрессионном тесте я получил кадр данных 1000 * 100000 pandas, подобный этому:

df=pd.DataFrame(np.random.random((1000,100)))

Первый столбец - метка y, остальные - x1-x99. Мне нужно выбрать три или семь переменных var-x, чтобы соответствовать y, выполнить каждую регрессию, получить все выходные данные и найти лучший выбор.

Я нахожу это в проекте Ray. Вызывая ray.put(object), большой Массив хранится в общей памяти и может быть доступен всем рабочим процессам без создания копий.

Слишком много случаев (161700 + 3921225 + ....) и нормально читать только базовый фрейм данных, так как эти работники не общаются друг с другом, им просто нужно вернуть выходные данные в главный один.

Есть ли что-то подобное в Dask, чтобы избежать копирования данных на каждого работника? Это может выглядеть так:

dask.put(df)

Тогда каждый работник может читать свои собственные задания, например:

from itertools import combinations
rt=[]
for c in combinations(range(100),3):
    (i,j,k)=c
    rt.append(model(df.iloc[:,0],df.iloc[:,[i,j,k]]).fit())
rt=dask.compute(*rt)

, чтобы избежать создания каждого экземпляра y, X в main и отправки каждого y, X всем работникам?

1 Ответ

1 голос
/ 30 января 2020

Ray использует PyArrow Plasma для скрытого хранения общих данных в контексте одной машины.

Хотя Dask явно не поддерживает Plasma, вы можете довольно легко использовать ее для хранения и читать общие данные из рабочих функций. Вы можете получить данные из Plasma, если рабочая функция знает Plasma ObjectId, в которой хранятся данные.

Пример кода Plasma здесь .

...