Как обрабатывать ошибки памяти с помощью матрицы смежности? - PullRequest
2 голосов
/ 06 мая 2020

Я выполняю кластеризацию графов с помощью python. Алгоритм требует, чтобы данные, передаваемые из графа G, были матрицей смежности. Однако, чтобы получить adjacency-matrix как numpy-array, например:

import networkx as nx
matrix = nx.to_numpy_matrix(G)

, я получаю ошибку памяти. Сообщение: MemoryError: Unable to allocate 2.70 TiB for an array with shape (609627, 609627) and data type float64

Однако у меня новое устройство (Lenovo E490), windows 64 бит, память 8 ГБ

Другая важная информация может быть:

Number of nodes: 609627
Number of edges: 915549

Вся история выглядит следующим образом:

Graphtype = nx.Graph()
G = nx.from_pandas_edgelist(df, 'source','target', edge_attr='weight', create_using=Graphtype)

Марковская кластеризация

import markov_clustering as mc
import networkx as nx

matrix = nx.to_scipy_sparse_matrix(G) # build the matrix
result = mc.run_mcl(matrix)            # run MCL with default parameters

MemoryError

enter image description here

1 Ответ

2 голосов
/ 06 мая 2020

Матрица, которую вы пытаетесь создать, имеет размер 609627x609627 float64. Для каждого float64, использующего 8 байтов памяти, вам потребуется 609627*609627*8~3TB памяти. Ну, ваша система имеет только 8 ГБ, и даже с добавленной физической памятью 3 ТБ кажутся слишком большими для работы. Предполагая, что идентификаторы ваших узлов являются целыми числами, вы можете использовать dtype=unit4 (для учета всех 609627 узлов), но все равно потребуется более ТБ памяти, что кажется недоступным. То, что вы пытаетесь сделать, похоже, у вас разреженная матрица, и у вас, вероятно, есть другой возможный подход к своей цели. Матрица смежности (если она не сжата) кажется труднодостижимой.

Возможно, вам пригодится что-то вроде:

to_scipy_sparse_matrix(G, nodelist=None, dtype=None, weight='weight', format='csr')

в пакете networks. Или, скорее, используйте edgelist для расчета того, чего вы пытаетесь достичь.

...