ОЗУ эффективное умножение больших матриц - нехватка ОЗУ в R - PullRequest
0 голосов
/ 24 мая 2019

Я хочу умножить большую матрицу на ее транспонирование, чтобы создать матрицу смежности (размерность: 1,7 млн. * 1700, двоичный = 0/1 записей).Матрица приведет к большой матрице 1,7 млн.* 1,7 млн., Что умеренно редко.Значения являются числами от 1 до 50.

Я пробовал несколько подходов в R и Python, с высокопроизводительными серверами до 250 ГБ ОЗУ, но я просто не могу заставить его работать.Таким образом, любые советы по подходам, которые могли бы работать, высоко ценятся

, я в основном работаю в R, я уже пробовал следующее:

  1. igraph package rout_igraph <- graph_from_data_frame(d = ребра, вершины = узлы, направленные = ИСТИНА) </p>

  2. Умножение матрицы вручную adjacency_matrix <- t (bipartite_matrix_s)% *% bipartite_matrix_s </p>

  3. умножение "матрицы" с разреженной матрицей: даже на сервере ОЗУ объемом 250 ГБ это приводит к ошибке: адрес 0x2ad6b3385000, причина в том, что память не отображена.Он работает для того же набора данных с меньшим количеством записей, поэтому это должно быть проблемой с оперативной памятью.(incidence_matrix = 1,7 Mio * 1700),

    bipartite_matrix_s <- as_incidence_matrix(y, sparse = TRUE) #(WORKS)
    adjacency_matrix <- tcrossprod(t(bipartite_matrix_s)) #(CRASHES)
    

умножение "blockmatrix" -> это выполняет пошаговое умножение, которое прекрасно работает, но каким-то образом также сохраняет всю матрицу (невозможно выделить 2 500 оперативной памяти)

    library(blockmatrix)
    edges <- blockmatmult(t(bipartite_matrix_s), bipartite_matrix_s)
    edgelist <- cbind(test_blockmult)

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...