【问题标题】:How to handle memory errors with adjacency matrix?如何使用邻接矩阵处理内存错误?
【发布时间】:2020-08-21 04:48:48
【问题描述】:

我正在使用 python 进行图形聚类。该算法要求从图G 传递的数据应该是邻接矩阵。但是,为了得到adjacency-matrixnumpy-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 Gb

其他重要信息可能是:

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

【问题讨论】:

    标签: python pandas numpy cluster-analysis networkx


    【解决方案1】:

    您尝试创建的矩阵大小为609627x609627 of float64。每个 float64 使用 8 个字节的内存,您将需要 609627*609627*8~3TB 内存。好吧,您的系统只有 8GB,即使增加了物理内存,3TB 似乎也太大而无法运行。假设您的节点 ID 是整数,您可以使用 dtype=unit4(考虑所有 609627 节点)但它仍然需要超过 TB 的内存,这听起来无法访问。您正在尝试做什么,似乎您有一个稀疏矩阵,并且您可能有另一种可能的方法来实现您的目标。邻接矩阵(除非压缩)似乎很难实现。

    也许您可以从以下方面受益:

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

    networks 包中。或者更确切地说,使用 edgelist 来计算您想要实现的任何目标。

    【讨论】:

    • 您谈到了边缘列表。我怎样才能在这里将它们用于相同的目的?
    • 你想要达到什么目的?您可以使用大小为 915549*8~8MB 数据的边列表矩阵来代替邻接矩阵。您有 915549 条边,每条边包括两个 4Bytes 的连接节点。这明显小于邻接矩阵。如果您详细说明您的最终目标,也许我们可以找到一种可能的方法。
    • 我不是马尔可夫聚类方面的专家,但我非常确信它使用了某种随机游走图。虽然您使用的包接受矩阵作为输入,但源代码似乎很短。您可能想从 edgelist 搜索执行 MCL 的包,甚至自己实现它。可能不会太长。
    • 这对我来说听起来很不安哈哈哈,因为通常邻接矩阵是从边缘列表创建的。那么,如果我反过来做,我怎么能把它喂给 MCL?仍然很难弄清楚这一点。
    • 您也可以发布带有相关标签的问题。有人可能对如何从 edgelist 实现 MCL 或者某些包已经实现了它有一些想法。处理大数据总是需要技巧和调整来解决大数据大小问题。
    猜你喜欢
    • 1970-01-01
    • 2013-02-06
    • 1970-01-01
    • 2016-04-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多