#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