dask dataframe: объединить два кадра данных, вменять отсутствующее значение и записывать в csv только частичные процессоры (по 20% в каждом процессоре) - PullRequest
0 голосов
/ 09 апреля 2019

Я хочу объединить два кадра данных dask, добавить отсутствующие значения в медиану столбца и экспортировать объединенный кадр данных в csv-файлы. У меня есть одна проблема: мой текущий код не может использовать все 8 процессоров (~ 20% каждого процессора)

Я не уверен, какая часть ограничивает использование процессора. Вот повторяемый код

import numpy as np
import pandas as pd 
df1 = pd.DataFrame(
    np.c_[(np.random.randint(100, size=(10000, 1)), np.random.randn(10000, 3))],
    columns=['id', 'a', 'b', 'c'])
df2 = pd.DataFrame(
    np.c_[(np.array(range(100)), np.random.randn(100, 10000))],
    columns=['id'] + ['d_' + str(i) for i in range(10000)])
df1.id=df1.id.astype(int).astype(object)
df2.id=df2.id.astype(int).astype(object)

## some cells are missing in df2
df2.iloc[:, 1:] = df2.iloc[:,1:].mask(np.random.random(df2.iloc[:, 1:].shape) < .05)

## dask codes starts here
import dask.dataframe as dd
from dask.distributed import Client
ddf1 = dd.from_pandas(df1, npartitions=3)
ddf2 = dd.from_pandas(df2, npartitions=3)
ddf = ddf1.merge(ddf2, how='left', on='id')
ddf = ddf.fillna(ddf.quantile())
ddf.to_csv('train_*.csv', index=None, header=None)

Несмотря на то, что задействованы все 8 процессоров, используется только ~ 20% каждого процессора. Могу ли я написать код для улучшения использования процессора?

1 Ответ

1 голос
/ 09 апреля 2019

Во-первых, если вы не укажете иначе, Dask будет использовать потоки для выполнения.В потоках за один раз может выполняться только одна операция Python («GIL»), за исключением некоторого кода более низкого уровня, который явно снимает блокировку.Операция «слияния» включает в себя большое перетасовывание данных в памяти, и я подозреваю, что время от времени снимает блокировку.

Во-вторых, весь вывод записывается в файловую систему, так что вы всегда будете иметьузкое место здесь: какой бы быстрой ни была другая обработка, вам все равно нужно передавать все это через шину хранения.

Если процессоры работают ~ 20%, я полагаю, это все же быстрее, чем одноядерныйверсия?Проще говоря, некоторые рабочие нагрузки распараллеливаются лучше, чем другие.

...