Я реализовал функцию карты, которая разбирает строки в дерево XML, пересекает это дерево и извлекает некоторую информацию. Множество вещей типа if-then-else, без дополнительного кода ввода-вывода.
Ускорение, которое мы получили от Dask, было не очень удовлетворительным, поэтому мы более подробно рассмотрели необработанную производительность выполнения для одного, но большого элемента ( 580 МБ XML строки) в одном разделе.
Вот код:
def timedMap(x):
start = time.time()
# computation, no IO or access to Dask variables, no threading or multiprocessing
...
return time.time() - start
print("Direct Execution")
print(timedMap(xml_string))
print("Dask Distributed")
import dask
from dask.distributed import Client
client = Client(threads_per_worker=1, n_workers=1)
print(client.submit(timedMap, xml_string).result())
client.close()
print("Dask Multiprocessing")
import dask.bag as db
bag = db.from_sequence([xml_string], npartitions=1)
print(bag.map(timedMap).compute()[0])
Вывод (это время без издержек до / после):
Direct Execution
54.59478211402893
Dask Distributed
91.79525017738342
Dask Multiprocessing
86.94628381729126
Я повторял это много раз. Кажется, что у Dask не только накладные расходы на связь и управление задачами, но и отдельные этапы вычислений также значительно медленнее.
Почему вычисления в Dask намного медленнее? Я заподозрил профилировщик и увеличил интервал профилирования с 10 до 1000 мс, который сбил 5 секунд. Но все же ... Тогда я подозревал, что давление памяти, но работник не достигает своего предела, даже 50%.
С точки зрения накладных расходов (измерение общего времени отправки + результат и карта + вычисления), Dask добавляет 18 секунд для распределенного случая и 3 секунды для многопроцессорного случая. Я счастлив заплатить эти накладные расходы, но мне не нравится, что фактические вычисления занимают намного больше времени. У вас есть подсказка, почему это так? Что я могу настроить, чтобы ускорить это?
Примечание: когда я удваиваю вычислительную нагрузку, все длительности примерно удваиваются.
Всего наилучшего, Борис