Sono interessato all'analisi di rete su reti di grandi dimensioni con milioni di nodi e decine di milioni di spigoli. Voglio essere in grado di fare cose come analizzare reti da molti formati, trovare componenti connessi, rilevare comunità ed eseguire misure di centralizzazione come PageRank.Quali problemi di scalabilità sono associati a NetworkX?
Sono attratto da NetworkX perché ha una bella API, una buona documentazione ed è stato in sviluppo attivo per anni. Inoltre perché è in Python, dovrebbe essere veloce da sviluppare con.
In una recente presentazione (le diapositive sono disponibili su GitHub here), è stato affermato che:
differenza di molti altri strumenti, NX è progettato per gestire i dati su scala rilevante per problemi moderni .. La maggior parte degli algoritmi di base in NX si basa su un codice legacy estremamente veloce.
La presentazione afferma inoltre che gli algoritmi di base di NetworkX sono implementati in C/Fortran.
Tuttavia, guardando il codice sorgente, sembra che NetworkX sia principalmente scritto in python. Non ho molta familiarità con il codice sorgente, ma sono a conoscenza di un paio di esempi in cui NetworkX usa numpy per fare sollevamento pesi (che a sua volta usa C/Fortran per fare algebra lineare). Ad esempio, il file networkx/networkx/algorithms/centrality/eigenvector.py
utilizza numpy per calcolare autovettori.
Qualcuno sa se questa strategia di chiamare una libreria ottimizzata come numpy è davvero diffusa in tutta NetworkX, o se solo pochi algoritmi lo fanno? Qualcuno può inoltre descrivere altri problemi di scalabilità associati a NetworkX?
Modulo risposta NetworkX Capo Programmatore ho posto questa domanda sulla mailing list NetworkX, e Aric Hagberg ha risposto:
Le strutture di dati utilizzati in NetworkX sono appropriati per scalare fino a problemi di grandi dimensioni (ad esempio, il la struttura dei dati è una lista di adiacenze). Gli algoritmi hanno varie proprietà di ridimensionamento ma alcuni di quelli che si menzionano sono utilizzabili (ad esempio PageRank, i componenti connessi sono una complessità lineare del numero di spigoli).
A questo punto NetworkX è puro codice Python. La struttura di adiacenza è codificata con dizionari Python che offre una grande flessibilità a scapito della memoria e della velocità di calcolo. I grafici grandi porteranno a molta memoria e alla fine finirai.
NetworkX utilizza NumPy e SciPy per algoritmi che sono principalmente basati su algebra lineare. In questo caso il grafico viene rappresentato come (copiata) come matrice di adiacenza utilizzando le matrici NumPy o le matrici sparse di SciPy . Questi algoritmi possono trarre vantaggio dal codice FORTRAN C e utilizzato in NumPy e SciPY.
Sembra che io abbia problemi a controllare la fonte al momento. Ma in ogni caso, considera: l'80% del tempo può essere speso nel 20% del codice. Mercurial è scritto * principalmente * in Python, ma non ho sentito una sola persona lamentarsi della sua velocità rispetto a Git, che è per lo più C. – delnan
Sì, ma sono anche preoccupato per la memoria. La rappresentazione grafica in networkx è una libreria python. Ciò significa che posso inserire solo grafici più piccoli in memoria? – conradlee