Объединение огромного списка фреймов данных с использованием dask отложено - PullRequest
0 голосов
/ 11 ноября 2018

У меня есть функция, которая возвращает мне фрейм данных. Я пытаюсь использовать эту функцию параллельно, используя dask.
Я добавляю отложенные объекты данных в список. Тем не менее, время выполнения моего кода одинаково с dask.delayed и без него.
Я использую функцию сокращения из functools вместе с pd.merge, чтобы объединить мои фреймы данных.
Любые предложения о том, как улучшить время выполнения?
Визуализированный график и код приведены ниже.

from functools import reduce 
d = []
for lot in lots:
    lot_data = data[data["LOTID"]==lot]
    trmat = delayed(LOT)(lot, lot_data).transition_matrix(lot)
    d.append(trmat)
df = delayed(reduce)(lambda x, y: x.merge(y, how='outer', on=['from', "to"]), d)

Визуализированный график операций

1 Ответ

0 голосов
/ 18 ноября 2018

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

Специально для вашего случая есть хороший шанс, что задачи, которые вы пытаетесь распараллелить, не снимают внутреннюю блокировку python, GIL, и в этом случае, хотя у вас есть независимые потоки, одновременно может выполняться только один поток.Решение было бы использовать вместо этого «распределенный» планировщик, который может иметь любое сочетание нескольких потоков и обрабатываться;однако использование процессов обходится дорого для перемещения данных между клиентом и процессами, и вы можете обнаружить, что дополнительные расходы преобладают в любой экономии времени.Вы наверняка захотите убедиться, что вы загружаете данные внутри рабочих, а не передаете их от клиента.

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

...