Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/336.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 具有1亿个节点的图中的连接组件_Python_Graph - Fatal编程技术网

Python 具有1亿个节点的图中的连接组件

Python 具有1亿个节点的图中的连接组件,python,graph,Python,Graph,我试图在一个有1亿个节点的图中得到连接组件的列表。对于较小的图形,我通常使用Python中Networkx模块的函数,该函数正是这样做的。然而,使用这个模块将一个有1亿个节点(及其边缘)的图形加载到内存中需要大约110GB的内存,而我没有。另一种方法是使用一个图形数据库,它有一个connectedcomponents函数,但我在Python中没有找到。看起来Dex(API:Java、.NET、C++)有这个功能,但我不是100%确定。理想情况下,我正在寻找Python的解决方案。非常感谢。Sci

我试图在一个有1亿个节点的图中得到连接组件的列表。对于较小的图形,我通常使用Python中Networkx模块的函数,该函数正是这样做的。然而,使用这个模块将一个有1亿个节点(及其边缘)的图形加载到内存中需要大约110GB的内存,而我没有。另一种方法是使用一个图形数据库,它有一个connectedcomponents函数,但我在Python中没有找到。看起来Dex(API:Java、.NET、C++)有这个功能,但我不是100%确定。理想情况下,我正在寻找Python的解决方案。非常感谢。

SciPy有一个。它需要图形的邻接矩阵作为输入,并处理有向和无向情况

(i,j)
对序列
adj_list
构建稀疏邻接矩阵,其中
i
j
是节点的(基于零的)索引

i_indices, j_indices = zip(*adj_list)
adj_matrix = scipy.sparse.coo_matrix((np.ones(number_of_nodes),
                                     (i_indices, j_indices)))
你得为这个无方向的案子做些额外的工作

如果图形足够稀疏,这种方法应该是有效的。

从性能上可以看出,该工具速度非常快。它是用C++编写的,但是接口是在Python中。p>
如果这个工具对你来说不够好。(我想会的)然后你可以试试ApacheGiraph()。

你的图形有多密集?平均顶点度是多少?图是有向的吗?如果是-您是在寻找强连接的组件还是连接的组件?另外-我假设您正在寻找最大的[强?]连通组件,而不是所有组件(因为它们的数量是指数级的)-这是真的吗?@aix:该图平均有1.5个顶点/节点。@amit:该图是无向的。我正在寻找一种获取连接组件列表的方法,与networkx.connected_components完全相同,但规模更大。我的图非常稀疏,但此解决方案仅适用于(相对)较小的图,因为scipy.sparse.csgraph.connected_components的时间惩罚不是线性的。在我的测试中,处理10000个节点需要0.4秒;10万个节点30秒,100万个节点51分钟(然后我停止了测试)。无论如何,谢谢你的建议,这是一个有趣的方法。@user1453508:这很奇怪。我检查了代码,乍一看,当| E |=O(| V |)时,它应该是线性的。我必须承认,我的图表往往有点小。也许你应该开始寻找MapReduce解决方案来解决你的问题。为了防止我误解了什么,这里是我的代码:
I_index=[];j_指数=[];file=open('adjacence_file.txt','r');对于iter(文件)中的行:i_索引,j_索引=line.strip('\n').split('\t');附加(i_索引);附加(j_索引);file.close();邻接矩阵=scipy.sparse.coo_矩阵((np.ones(len(i_指数)),(i_指数,j_指数)),shape=(1000010000));connected_components=scipy.sparse.csgraph.connected_components(邻接矩阵,directed=False)
@user1453508:看起来您正在将字符串分配给
i_index
j_index
,然后将它们存储在索引列表中。我不确定
coo_matrix
构造函数将如何处理该问题,但它肯定不是预期的输入。最初,我的节点是10位数字,我将它们转换为从0到10000的索引,这些索引存储在邻接_file.txt中(例如,如果节点5链接到节点22,该文件将包含第5[tab]22[\n]行)。这是正确的方法吗?