¿Qué problemas de escalabilidad están asociados con NetworkX?


Estoy interesado en el análisis de redes en redes grandes con millones de nodos y decenas de millones de bordes. Quiero poder hacer cosas como analizar redes de muchos formatos, encontrar componentes conectados, detectar comunidades y ejecutar medidas de centralidad como PageRank.

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

En a presentación reciente (las diapositivas están disponibles en github aquí), se afirmó que:

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

La presentación también indica que los algoritmos base de NetworkX están implementados en C/Fortran.

Sin embargo, mirando el código fuente, parece que NetworkX está escrito principalmente en python. Me no estoy muy familiarizado con el código fuente, pero soy consciente de un par de ejemplos donde NetworkX utiliza numpy para hacer trabajos pesados (que a su vez utiliza C/Fortran para hacer álgebra lineal). Por ejemplo, el archivo networkx/networkx/algorithms/centrality/eigenvector.py utiliza numpy para calcular los vectores propios.

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

Respuesta de NetworkX Lead Programmer Planteé esta pregunta en la lista de correo de NetworkX, y Aric Hagberg respondió:

Las estructuras de datos utilizadas en NetworkX son apropiadas para escalar a grandes problemas (por ejemplo, la estructura de datos es una lista de adyacencia). El los algoritmos tienen varias propiedades de escalado, pero algunas de las mencionar son utilizables (por ejemplo, PageRank, componentes conectados, son lineales complejidad en el número de aristas).

En este punto NetworkX es código Python puro. La estructura de adyacencia está codificado con diccionarios Python que proporciona una gran flexibilidad a expensas de la memoria y la velocidad computacional. Los gráficos grandes toma mucha memoria y eventualmente te quedarás sin.

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

Author: Ioannis Filippidis, 2011-11-02

3 answers

Su gran problema será la memoria. Python simplemente no puede manejar decenas de millones de objetos, sin saltar a través de aros en la implementación de su clase. La sobrecarga de memoria de muchos objetos es demasiado alta, llegas a 2 GB y el código de 32 bits no funciona. Hay formas de evitarlo: usar ranuras, matrices o numpy. debería estar bien, porque networkx fue escrito para el rendimiento, pero si hay algunas cosas que simplemente no funcionan, revisaría su uso de memoria.

En cuanto al escalado, los algoritmos son básicamente lo único que importa con los gráficos. Los algoritmos de gráficos tienden a tener realmente un escalado feo si se hacen mal, y es tan probable que se hagan bien en Python como en cualquier otro lenguaje.

 16
Author: wisty,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2011-11-02 12:01:53

Esta es una pregunta antigua, pero creo que vale la pena mencionar que graph-tool tiene una funcionalidad muy similar a NetworkX, pero se implementa en C++ con plantillas (utilizando la Biblioteca de gráficos Boost), y por lo tanto es mucho más rápido ( hasta dos órdenes de magnitud) y usa mucha menos memoria.

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

 19
Author: Tiago Peixoto,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2018-04-03 03:00:00

El hecho de que networkX esté escrito principalmente en python no significa que no sea escalable, ni que reclame perfección. Siempre hay una compensación. Si inviertes más dinero en tus "máquinas", tendrás tanta escalabilidad como quieras más los beneficios de usar una biblioteca de gráficos pythonic.

Si no, hay otras soluciones, (aquí y aquí ), que pueden consumir menos memoria (benchmark y ver, creo que igraph está totalmente respaldado por C por lo que lo hará), pero python el sentir de NX.

 2
Author: hymloth,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2011-11-02 11:22:01