У меня проблема с распараллеливанием по вложенному списку списков.
Упрощенная версия моей задачи выглядит следующим образом:
У меня есть список списков:
[[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)
Есть ли способ сделать это более оптимизированным способом?