2011-11-02 18 views
26

Estoy interesado en el análisis de redes en redes grandes con millones de nodos y decenas de millones de bordes. Quiero ser capaz de hacer cosas como analizar redes de diferentes formatos, encontrar componentes conectados, detectar comunidades y ejecutar medidas de centralidad como PageRank.¿Qué problemas de escalabilidad están asociados con NetworkX?

Me atrae NetworkX porque tiene una buena API, buena documentación, y ha estado en desarrollo activo durante años. Además, porque está en python, debería ser rápido para desarrollar con.

En una reciente presentación (las diapositivas están disponibles en github here), se afirmó que:

A diferencia de muchas otras herramientas, NX está diseñado para manejar los datos en una escala relevante para los problemas modernos .. . La mayoría de los algoritmos principales en NX dependen de un código heredado extremadamente rápido.

La presentación también establece que los algoritmos base de NetworkX se implementan en C/Fortran.

Sin embargo, al mirar el código fuente, parece que NetworkX está escrito principalmente en python. No estoy muy familiarizado con el código fuente, pero conozco un par de ejemplos en los que NetworkX usa numpy para realizar levantamientos pesados ​​(que a su vez usa C/Fortran para hacer álgebra lineal). Por ejemplo, el archivo networkx/networkx/algorithms/centrality/eigenvector.py usa numpy para calcular vectores propios.

¿Alguien sabe si esta estrategia de llamar a una biblioteca optimizada como numpy es realmente frecuente en todo NetworkX, o si solo unos pocos algoritmos lo hacen? ¿Alguien puede describir otros problemas de escalabilidad asociados con NetworkX?

Respuesta de NetworkX Jefe de Programación me planteó esta pregunta en la lista de correo NetworkX y Aric Hagberg respondió:

Las estructuras de datos utilizadas en NetworkX son apropiadas para el escalado a problemas grandes (por ejemplo, el la estructura de datos es una lista de adyacencia). Los algoritmos tienen varias propiedades de escala, pero algunos de los que menciona son utilizables (por ejemplo, PageRank, componentes conectados, son complejidad lineal en el número de bordes).

En este momento, NetworkX es un código de Python puro. La estructura de adyacencia está codificada con diccionarios de Python que proporciona una gran flexibilidad a expensas de la memoria y la velocidad de cálculo. Los gráficos grandes darán mucha memoria a y eventualmente se agotarán.

NetworkX utiliza NumPy y SciPy para los algoritmos que son principalmente basados ​​en álgebra lineal. En ese caso, el gráfico se representa (copiado) como una matriz de adyacencia usando matrices NumPy o matrices dispersas SciPy . Esos algoritmos pueden beneficiarse del código heredado C y FORTRAN que se usa bajo el capó en NumPy y SciPY.

+0

Parece que tengo problemas para inspeccionar la fuente por el momento. Pero en cualquier caso, considere: el 80% del tiempo se puede gastar en el 20% del código. Mercurial está escrito * en su mayoría * en Python, sin embargo, no he escuchado a una sola persona quejarse de su velocidad en comparación con Git, que es principalmente C. – delnan

+0

Sí, pero también me preocupa la memoria. La representación gráfica en networkx es una biblioteca de Python. ¿Eso quiere decir que solo puedo incluir gráficos más pequeños en la memoria? – conradlee

Respuesta

14

Su gran problema será la memoria. Python simplemente no puede manejar decenas de millones de objetos, sin pasar por aros en la implementación de su clase. La sobrecarga de memoria de muchos objetos es demasiado alta, llega a 2 GB y el código de 32 bits no funciona. Hay formas de evitarlo: usar máquinas tragamonedas, arreglos o numpy. Es debería estar bien, porque networkx fue escrito para el rendimiento, pero si hay algunas cosas que simplemente no funcionan yo verificaría el uso de la memoria.

En cuanto a la escala, los algoritmos son básicamente lo único que importa con los gráficos. Los algoritmos de gráficos tienden a tener realmente escala fea si se hacen mal, y es muy probable que se realicen en Python como en cualquier otro idioma.

1

El hecho de que la redX se escribe principalmente en python no significa que no sea escalable, ni reclame la perfección. Siempre hay una compensación. Si arroja más dinero en sus "máquinas", tendrá tanta escalabilidad como desee además de los beneficios de utilizar una biblioteca de gráficos pythonic.

Si no es así, hay otras soluciones, (here y here), que pueden consumir menos memoria (punto de referencia y ver, creo igraph está totalmente C respaldado por lo que lo hará), pero es posible que se pierda la sensación Pythonic de NX.

+0

Eso en parte responde mi pregunta. Pero también quiero saber si muchos de los algoritmos "centrales" de NetworkX se implementan en C/Fortran, como se afirmó. – conradlee

+0

Investigué un poco el código fuente (actual) y no encontré implementaciones de C/Fortran. Parece que todo lo que hay allí es pura pitón ... – hymloth

+0

gracias por echar un vistazo. Recuerde que si se llama numpy, entonces (dependiendo de la configuración del sistema) Numpy podría usar LAPACK u otros paquetes optimizados de álgebra lineal. No estoy muy familiarizado con la frecuencia con la que NetworkX realmente usa Numpy (esa es mi pregunta), pero conozco un par de ejemplos. Por ejemplo, en in networkx/networkx/algorithms/centrality/eigenvector.py usa numpy para encontrar eigenvectors. – conradlee

14

Esta es una pregunta anterior, pero creo que vale la pena mencionar que graph-tool tiene una funcionalidad muy similar a NetworkX, pero se implementa en C++ con plantillas (usando Boost Graph Library) y por lo tanto es mucho más rápido (up to two orders of magnitude) y usa mucha menos memoria.

Descargo de responsabilidad: soy el autor de graph-tool.

+4

Probé la herramienta gráfica. Realmente es mucho más rápido pero feo de usar. La API no se siente pitónica. –

+0

Es cierto ... Solo quería compartir mi experiencia con la gente de aquí. –

+0

@TiagoPeixoto - ¿Su biblioteca es adecuada para manejar ~ 3M de nodos y ~ 10M de bordes? Supongo que el almacenamiento solo es de memoria, ¿es correcto? – Avision

Cuestiones relacionadas