我对有数百万节点和数千万条边的大型网络的网络分析感兴趣。我希望能够做许多事情,比如解析来自多种格式的网络,查找连接的组件,检测社区,以及运行像PageRank这样的中心度量。NetworkX有哪些可扩展性问题?
我被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哈格伯格回答说:
在NetworkX使用的数据结构适合扩展到 大问题(例如,数据结构是一个邻接表)。算法具有不同的缩放属性,但您提到的一些可用(例如,PageRank,连接的组件,在边数量上是线性的)。
此时NetworkX是纯Python代码。使用Python字典对邻接结构 进行编码,以牺牲内存和计算速度为代价提供了很大的灵活性。大型图将 占用大量的内存,你最终会用完。
NetworkX确实使用NumPy和SciPy来计算基于线性代数的主要为 的算法。在那种情况下,使用NumPy矩阵或稀疏矩阵将该图表表示为 (复制)为邻接矩阵。这些算法可以受益于在NumPy和SciPY中引用的遗留C和FORTRAN代码。
看来我目前无法亲自检查源代码。但无论如何,请考虑:80%的时间可能花费在20%的代码中。 Mercurial主要是用Python编写的,但我没有听说过一个人抱怨它的速度与Git相比,它主要是C. – delnan
是的,但我也担心内存。 networkx中的图形表示是一个python库。这是否意味着我只能将较小的图形放入内存? – conradlee