Лучший способ выбрать множество ломтиков из массива Dask - PullRequest
1 голос
/ 15 января 2020

Я генерирую большой (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?

1 Ответ

0 голосов
/ 17 января 2020

Если у вас есть только несколько тысяч срезов, я рекомендую использовать обычный список Python вместо Dask Bag. Это, вероятно, будет намного быстрее и намного проще.

Затем вы можете нарезать массив много раз:

tiles = [dask_array[slc] for slc in slices]

И вычислить их, если хотите

tiles = dask.compute(*tiles)
...