Dask: распараллеливание между вложенными списками - PullRequest
2 голосов
/ 03 октября 2019

У меня проблема с распараллеливанием по вложенному списку списков.

Упрощенная версия моей задачи выглядит следующим образом:

У меня есть список списков:

[[a, b], [c, d, e], [f, g, h, i], [j], [k, l], ...]  # let's call this "L"

В Dask я использую функцию для их создания, потому что создание каждого подсписка занимает много времени, и у меня их примерно несколько сотен.

def parse(filename):
    return list_of_lists

L = []
for fname in filenames:
    L.append(client.submit(parse, fname))

Ключ здесь, хотяявляется то, что я хотел бы обрабатывать подсписки как один расширенный список элементов (т.е. [a, b, c,... l, ...]) и распараллеливать еще одну долго выполняющуюся функцию для каждого из них, но без сбора своих элементов и выравнивания списка. Это потому, что выполнение следующих действий также занимает много времени:

from itertools import chain
L = client.gather(L)  # the gather step takes time
L = list(chain.from_iterable(L))  # flattening is fast
L_future = client.scatter(L)  # the scatter step takes time too

def func2(element):
    """Also takes a long time."""
    ...
    return result

results = client.map(func2, L_future)

Есть ли способ сделать это более оптимизированным способом?

1 Ответ

1 голос
/ 03 октября 2019

Да, есть множество способов сделать это хорошо.

Вот пример: https://examples.dask.org/applications/evolving-workflows.html

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...