Позволяет ли blockwise выполнять итерации по неосновным массивам?

#arrays

#массивы

Вопрос:

В документах blockwise упоминается, что с concatenate=False :

В случае сжатия переданная функция должна ожидать итерацию блоков в любом массиве, который содержит этот индекс.

Тогда мой вопрос заключается в том, существует ли фундаментальное ограничение, которое запрещало бы этой «итерации блоков» загружать блоки по одному, а не хранить их все в a list (т. Е. В памяти). Возможно ли это? Похоже blockwise , что сейчас это не работает, но мне интересно, может ли это:

 import dask.array as da
import operator

# Create an array and write to disk
x = da.random.random(size=(10, 6), chunks=(5, 3))
da.to_zarr(x, '/tmp/x.zarr', overwrite=True)
x = da.from_zarr('/tmp/x.zarr')
y = x.T

def fn(x, y):
    print(type(x), type(x[0]))
    x = np.concatenate(x, axis=1)
    y = np.concatenate(y, axis=0)
    return np.matmul(x, y)

da.blockwise(fn, 'ik', x, 'ij', y, 'jk', concatenate=False, dtype='float').compute(scheduler='single-threaded')
# <class 'list'> <class 'numpy.ndarray'>
  

Возможно ли, чтобы эти списки были генераторами вместо этого?

Ответ №1:

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

Учитывая контекст вашего вопроса, я предполагаю, что вы сталкиваетесь с проблемами с памятью в приложениях в стиле tensordot. Использование памяти приложениями в стиле tensordot сильно зависит от структуры чанков. Я призываю вас рассмотреть эту проблему, и особенно в разговоре, на который ссылаются в первом сообщении: https://github.com/dask/dask/issues/2225