Necesito ser capaz de manipular un gráfico grande (10^7 nodos) en python. Los datos correspondientes a cada nodo/borde son mínimos, por ejemplo, un pequeño número de cadenas. ¿Cuál es el más eficiente, en términos de memoria y velocidad, forma de hacer esto?¿Cuál es la estructura de datos de gráficos más eficiente en Python?
A dicto de dicts es más flexible y más simple de implementar, pero intuitivamente espero que una lista de listas sea más rápida. La opción de la lista también requeriría que guardo los datos de separarse de la estructura, mientras que predice permitirían algo por el estilo:
graph[I][J]["Property"]="value"
¿Qué sugieres?
Sí, debería haber sido un poco más claro en lo que quiero decir con eficiencia. En este caso particular lo digo en términos de recuperación de acceso aleatorio.
Cargar los datos en la memoria no es un gran problema. Eso se hace de una vez por todas. La parte que consume mucho tiempo visita los nodos para que pueda extraer la información y medir las métricas que me interesan.
No había considerado convertir cada nodo en una clase (las propiedades son las mismas para todos los nodos) pero parece ¿Así agregaría una capa adicional de sobrecarga? Esperaba que alguien tuviera alguna experiencia directa con un caso similar que pudieran compartir. Después de todo, los gráficos son una de las abstracciones más comunes en CS.
NetworkX es genial, pero lamentablemente tiene problemas para manejar 10^7 nodos. Rutinariamente supero los 16 GB de RAM con solo 2M de nodos de 15M de bordes y algunos atributos int. Olvídate de conseguir algo más elegante que eso. – Sint