Я генерирую большой (65k x 65k x 3) трехмерный сигнал, распределенный между несколькими узлами с использованием массивов Dask. На следующем шаге мне нужно извлечь несколько тысяч плиток из этого массива, используя кусочки, хранящиеся в сумке Dask. Мой код выглядит так:
import dask.array as da
import dask.bag as db
from dask.distributed import Client
def pick_tile(window, signal):
return np.array(surface[window])
def computation_on_tile(signal_tile):
# do some rather short computation on a (n x n x 3) signal tile.
dask_client = Client(....)
signal_array = generate_signal(...) # returns a dask array
signal_slices = db.from_sequence(generate_slices(...)) # fixed size slices
signal_tiles = signal_slices.map(pick_tile, signal=signal_array)
result = dask_client.compute(signal_tile.map(computation_on_tile), sync=True)
Моя проблема в том, что вычисления занимают много времени. Я попытался рассеять свой массив сигналов, используя:
signal_array = dask_client.scatter(generate_signal(...))
Но это не помогает производительности (~ 12 мин. Для вычисления). Для сравнения, вычисление полного сигнала и стандартного уровня первого уровня занимает приблизительно 2 минуты.
Существует ли эффективный способ выбрать множество фрагментов из распределенного массива Dask?