Почему он потребляет столько памяти, когда я умножаю две матрицы CSR, используя scipy?

Я использую представление Scipy CSR матрицы 800 000×350 000, скажем, его M Я хочу рассчитать произведение точек M * M[0:x].T . Теперь, в зависимости от значения x потребление памяти растет. x=1 не заметен, но если x=2000 процесс умножения занимает около 8 гигабайт ОЗУ.

Интересно, что происходит, когда я вычисляю этот продукт и почему он занимает так много памяти по сравнению с хранением разреженной матрицы (около 30 МБ). Является ли матрица расширенной для умножения?

Изучая результаты и потребление памяти с течением времени и после каждой операции, я обнаружил, что причина является результатом разреженного умножения матрицы. Действительно, в M имеется много нулевых значений. Но результат M*MT – это матрица, содержащая только 50% нулей. Таким образом, результат потребляет много памяти.

Пример . Предположим, что каждый вектор строки из M имеет поле без нуля с одним и тем же индексом, но отличается от этого разреженным . Тогда результат M*MT не будет разреженным вообще (без нулевых значений).

Тем не менее, спасибо за помощь.

csr ядро матричного умножения csr найдено в

https://github.com/scipy/scipy/blob/0cff7a5fe6226668729fc2551105692ce114c2b3/scipy/sparse/sparsetools/csr.h

начиная с строки 500, функция csr_matmat... Он включает ссылку на математическую бумагу, на которой он основан.

Код Python с A*B__mul__ . Посмотрите на версию для своей матрицы csr чтобы убедиться, что она вызывает self._mul_sparse_matrix , и вы увидите, что она заканчивается вызовом self.format + '_matmat_pass1'pass2 ).

Предполагая, что он не прибегает к плотным версиям, вам придется изучить базовый алгоритм, чтобы понять, реалистично ли это использование памяти.