Код: Выделить всё
A.dot(x) = d
Код: Выделить всё
ADask кажется очень многообещающей библиотекой для решения обеих этих проблем, и я предпринял несколько попыток. Мою матрицу A сложно вычислить: она основана примерно на 15 различных массивах (размер которых равен количеству строк в A), и некоторые из них используются в итеративном алгоритме для вычисления связанной функции Лежандра. Когда куски небольшие (10000 строк), построение графа задачи занимает очень много времени и требует много памяти (увеличение памяти совпадает с вызовом итерационного алгоритма). Когда фрагменты больше (50 000 строк), потребление памяти перед вычислениями намного меньше, но оно быстро исчерпывается при вычислении A.T.dot(A). Я пробовал использовать кэш.Chest, но он значительно замедляет вычисления.
График задачи должен быть очень большим и сложным — вызов A._visualize() приводит к сбою. С более простыми матрицами A это можно сделать напрямую (см. ответ @MRocklin). Есть ли способ упростить это?
Буду очень признателен за любые советы о том, как обойти эту проблему.
В качестве игрушечного примера я попробовал
Код: Выделить всё
A = da.ones((2e3, 1e7), chunks = (2e3, 1e3))
(A.T.dot(A)).compute()
Редактировать:
Я зачеркнул тест с примером игрушки, потому что размеры были неправильными, и исправил размеры в остальных случаях. Как говорит @MRocklin, он работает с правильными размерами. Я добавил вопрос, который, как мне кажется, больше соответствует моей проблеме.
Edit2:
Это очень упрощенный пример того, что я пытался сделать. Я считаю, что проблема в рекурсиях, связанных с определением столбцов в A.
Код: Выделить всё
import dask.array as da
N = 1e6
M = 500
x = da.random.random((N, 1), chunks = 5*M)
# my actual
A_dict = {0:x}
for i in range(1, M):
A_dict[i] = 2*A_dict[i-1]
A = da.hstack(tuple(A_dict.values()))
A = A.rechunk((M*5, M))
ATA = A.T.dot(A)
Теперь я решил эту проблему, поместив рекурсию в функцию с массивами numpy и более или менее A = x.map_blocks(...).
Во-вторых, как только у меня есть граф задач матрицы A, непосредственное вычисление A.T.dot(A) действительно приводит к некоторым проблемам с памятью (использование памяти не очень стабильно). Поэтому я явно вычисляю его по частям и суммирую результаты. Даже с этими обходными путями dask существенно повышает скорость и читабельность.
Подробнее здесь: https://stackoverflow.com/questions/353 ... -with-dask
Мобильная версия