Какие проблемы с масштабируемостью связаны с NetworkX? - PullRequest
35 голосов
/ 02 ноября 2011

Меня интересует анализ сети в больших сетях с миллионами узлов и десятками миллионов ребер. Я хочу, чтобы у меня была возможность разбирать сети из разных форматов, находить подключенные компоненты, обнаруживать сообщества и выполнять меры централизации, такие как PageRank.

Меня привлекает NetworkX, потому что он имеет хороший API, хорошую документацию и активно разрабатывается в течение многих лет. Кроме того, поскольку он написан на python, он должен быстро развиваться.

В недавней презентации (слайды доступны на github здесь ), было заявлено, что:

В отличие от многих других инструментов, NX предназначен для обработки данных в масштабе относится к современным проблемам ... Большинство основных алгоритмов в NX основаны на чрезвычайно быстром унаследованном коде.

В презентации также говорится, что базовые алгоритмы NetworkX реализованы в C / Fortran.

Однако, глядя на исходный код, похоже, что NetworkX в основном написан на python. Я не слишком знаком с исходным кодом, но мне известно о нескольких примерах, где NetworkX использует numpy для выполнения тяжелых работ (который в свою очередь использует C / Fortran для выполнения линейной алгебры). Например, файл networkx/networkx/algorithms/centrality/eigenvector.py использует numpy для вычисления собственных векторов.

Кто-нибудь знает, действительно ли такая стратегия вызова оптимизированной библиотеки, как numpy, распространена во всей NetworkX, или это делают лишь несколько алгоритмов? Также кто-нибудь может описать другие проблемы масштабируемости, связанные с NetworkX?

Ответ от ведущего программиста NetworkX Я задал этот вопрос в списке рассылки NetworkX, и Арик Хагберг ответил:

Структуры данных, используемые в NetworkX, подходят для масштабирования до большие проблемы (например, структура данных представляет собой список смежности). алгоритмы имеют различные свойства масштабирования, но некоторые из них вы упоминания можно использовать (например, PageRank, связанные компоненты, являются линейными сложность по количеству ребер).

На данный момент NetworkX - это чистый код Python. Структура смежности кодируется словарями Python, что обеспечивает большую гибкость за счет памяти и скорости вычислений. Большие графики будут займет много памяти, и в конце концов у вас кончится.

NetworkX использует NumPy и SciPy для алгоритмов, которые в первую очередь основанный на линейной алгебре. В этом случае график представлен (скопировано) как матрица смежности с использованием матриц NumPy или SciPy разреженные матрицы. Эти алгоритмы могут извлечь выгоду из устаревшего C и Код FORTRAN, который используется под капотом в NumPy и SciPY.

Ответы [ 3 ]

20 голосов
/ 05 мая 2013

Это старый вопрос, но я думаю, что стоит упомянуть, что graph-tool имеет очень схожую функциональность с NetworkX, но он реализован в C ++ с шаблонами (с использованием Boost Graph Library), и, следовательно, намного быстрее ( до двух порядков ) и использует гораздо меньше памяти.

Отказ от ответственности: я автор Graph-Tool.

17 голосов
/ 02 ноября 2011

Ваша большая проблема будет с памятью.Python просто не может обрабатывать десятки миллионов объектов, не прыгая через обручи в реализации вашего класса.Объем памяти многих объектов слишком велик, вы используете 2 ГБ, и 32-битный код не будет работать.Есть способы обойти это - используя слоты, массивы или NumPy.Это должно быть в порядке, потому что networkx был написан для производительности, но если есть некоторые вещи, которые просто не работают, я бы проверил использование вашей памяти.

Что касается масштабирования, алгоритмыв основном единственное, что имеет значение с графиками.Графические алгоритмы имеют тенденцию иметь действительно ужасное масштабирование, если они сделаны неправильно, и они так же вероятно будут сделаны правильно в Python, как и любой другой язык.

2 голосов
/ 02 ноября 2011

Тот факт, что networkX в основном написан на python, не означает, что он не масштабируется и не претендует на совершенство.Всегда есть компромисс.Если вы будете тратить больше денег на свои «машины», вы будете иметь столько масштабируемости, сколько захотите, а также преимущества использования библиотеки графических питонов.

Если нет, есть и другие решения ( здесь и здесь ), которые могут потреблять меньше памяти (тест и посмотрите, я думаю, что igraph полностью поддерживает C, такэто будет), но вы можете пропустить питоническое чувство NX.

...