与NetworkX相关的可扩展性问题是什么?

时间:2011-11-02 10:27:33

标签: python graph social-networking libraries

我对拥有数百万个节点和数千万边缘的大型网络的网络分析感兴趣。我希望能够做一些事情,比如从多种格式解析网络,找到连接的组件,检测社区,以及运行像PageRank这样的中心度量。

我被NetworkX所吸引,因为它有一个很好的api,良好的文档,并且多年来一直在积极开发。另外,因为它是在python中,它应该快速开发。

在最近的一次演示中(幻灯片可在github here上获得),声称:

  

与许多其他工具不同,NX旨在按比例处理数据   与现代问题相关... NX中的大多数核心算法都依赖于极快的遗留代码。

该演示文稿还指出,NetworkX的基本算法是在C / Fortran中实现的。

但是,看一下源代码,看起来NetworkX主要是用python编写的。我对源代码不太熟悉,但我知道有几个例子,其中NetworkX使用numpy进行繁重的提升(后者又使用C / Fortran进行线性代数)。例如,文件networkx/networkx/algorithms/centrality/eigenvector.py使用numpy来计算特征向量。

有没有人知道调用像numpy这样的优化库的策略在整个NetworkX中是否真的很普遍,或者只是少数算法呢?任何人都可以描述与NetworkX相关的其他可扩展性问题吗?

来自NetworkX首席程序员的回复 我在NetworkX邮件列表上提出了这个问题,Aric Hagberg回答说:

  

NetworkX中使用的数据结构适合缩放   大问题(例如数据结构是邻接列表)。该   算法有各种缩放属性,但有些属于你   提及是可用的(例如PageRank,连接组件,是线性的   边数的复杂性。)

     

此时NetworkX是纯Python代码。邻接结构   用Python词典编码,提供了很大的灵活性   以记忆和计算速度为代价。大图会   记忆力很大,最终会耗尽。

     

NetworkX确实将NumPy和SciPy用于主要的算法   基于线性代数。在那种情况下,表示图表   (复制)使用NumPy矩阵或SciPy作为邻接矩阵   稀疏矩阵。这些算法可以从遗留的C和C中受益   在NumPy和SciPY中引用的FORTRAN代码。

3 个答案:

答案 0 :(得分:20)

这是一个老问题,但我认为值得一提的是graph-tool具有与NetworkX非常相似的功能,但它是用C ++实现的模板(使用Boost Graph Library),因此很多更快(up to two orders of magnitude)并使用更少的内存。

免责声明:我是图表工具的作者。

答案 1 :(得分:17)

你的大问题将是记忆。 Python只是不能处理数以千万计的对象,而不会在类实现中跳过箍。许多对象的内存开销太高,你达到2GB,32位代码将无法工作。有办法解决它 - 使用插槽,数组或numpy。 应该可以,因为networkx是为性能而编写的,但如果有一些东西不能正常工作,我会检查你的内存使用情况。

至于缩放,算法基本上是图表唯一重要的事情。如果做错了,图形算法往往会真正丑陋缩放,并且它们在Python中就像在任何其他语言中一样可行。

答案 2 :(得分:2)

networkX主要用python编写的事实并不意味着它不具有可扩展性,也不意味着声称完美。总是需要权衡。如果您在“机器”上投入更多资金,您将拥有您想要的可扩展性以及使用pythonic图库的好处。

如果没有,还有其他解决方案,(herehere),这可能消耗更少的内存(基准测试,我认为igraph完全是C支持,所以它会),但你可以想念NX的pythonic感觉。