我对拥有数百万个节点和数千万边缘的大型网络的网络分析感兴趣。我希望能够做一些事情,比如从多种格式解析网络,找到连接的组件,检测社区,以及运行像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代码。
答案 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)