NetworkX有哪些可扩展性问题?

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

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

在最近的演示文稿中(这里的幻灯片可在github上获得),它声称:

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

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

然而,看看源代码,它看起来像NetworkX主要是用python编写的。 我对源代码并不太熟悉,但我知道有几个例子,其中NetworkX使用numpy来完成繁重的任务(反过来使用C / Fortran来完成线性代数)。 例如,文件networkx/networkx/algorithms/centrality/eigenvector.py使用numpy来计算特征向量。

有没有人知道这种调用像numpy这样的优化库的策略在整个NetworkX中是非常普遍的,还是只有几个算法可以实现呢? 任何人都可以描述与NetworkX相关的其他可扩展性问题吗?

来自NetworkX Lead Programmer的回复我在NetworkX邮件列表中提出了这个问题,Aric Hagberg回答说:

NetworkX中使用的数据结构适合扩展到较大的问题(例如,数据结构是邻接列表)。 这些算法具有各种缩放属性,但您提到的一些属性可用(例如PageRank,连接组件,边数为线性复杂度)。

此时NetworkX是纯Python代码。 邻接结构使用Python字典进行编码,以牺牲内存和计算速度为代价提供了极大的灵活性。 大图需要大量内存,最终会耗尽。

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


你的大问题将成为记忆。 Python无法处理数以千万计的对象,而无需在类实现中跳过循环。 许多对象的内存开销太高,达到2GB,32位代码无法工作。 有办法解决它 - 使用插槽,阵列或numpy。 它应该没问题,因为networkx是为性能编写的,但是如果有几件事情不起作用,我会检查你的内存使用情况。

至于缩放,算法基本上是唯一与图形有关的事情。 如果图形算法做错了,图形算法往往具有非常难看的扩展性,并且它们可能会像其他语言一样在Python中完成。


这是一个老问题,但我认为值得一提的是,图形工具与NetworkX具有非常类似的功能,但它在C ++中使用模板(使用Boost Graph Library)实现,因此速度更快(最多两个数量级)并且使用更少的内存。

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


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

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

链接地址: http://www.djcxy.com/p/22729.html

上一篇: What scalability issues are associated with NetworkX?

下一篇: Clickonce deployment to multiple environments