1

Использование Networkx на Python 2.7, я пытался построить график около 2M пользователей и 880M ребер. Я использую текстовый файл около 17Gb, содержащий список ребер. Я попытался использовать функцию nx.read_edgelist(), но после использования около 250 ГБ или ram (я работаю на удаленном сервере) моя программа будет убита.Почему Networkx потребляет всю мою память?

Мой вопрос: нормально ли, что networkx использует столько памяти? Или, может быть, я ошибся со сбором данных? Я думал об использовании другой библиотеки, и я нашел и iGraph, и графический инструмент, которые выглядят довольно эффективно. Кто-нибудь будет советоваться с этим?

Спасибо!

EDIT: мой файл на самом деле содержит 880M края, не 88M

+0

Привет Колас - Я дал ответ, но не 100% уверен, что это правильно. Обычно я бы использовал комментарий, но для этого слишком много. Если это решает (или не решает проблему), сообщите мне, чтобы я мог отредактировать/удалить свой ответ соответствующим образом. – Joel

+0

Привет, Джоэл, большое спасибо за ваш ответ! В настоящее время я пытаюсь решить ваше решение, и, конечно же, я буду держать вас в курсе событий (для вычисления обычно требуется много времени, я, вероятно, дам вам результат в понедельник). Тем не менее, я, вероятно, должен исправить свой вопрос: я на самом деле имею дело с краями 880M (я пропустил 0 при чтении ...), что может объяснить мои трудности ... –

ответ

0

(я не 100% уверен в этом, но никто еще пока не ответил, так что я дам ему идти).

Во-первых, каждое ребро сохраняется дважды (один раз для каждого узла), поэтому память может быстро расти. Однако это, вероятно, не ваша самая большая проблема.

Вероятно, что имена ваших узлов являются целыми числами. Однако, если вы не сказали read_edgelist, что они являются ints, они будут рассматриваться как строки. Память, используемая для строки, огромна по сравнению с int. Вот как позвонить read_edgelist:

read_edgelist(path, comments='#', delimiter=None, create_using=None, nodetype=None, data=True, edgetype=None, encoding='utf-8') 

Если это ваша проблема, это будет устранить с помощью

G=nx.read_edgelist(path, nodetype = int) 
+0

Большое спасибо за ваш ответ, но, к сожалению, это не решило проблему (мой объект графика все еще использовал более 250 ГБ данных). Я думаю, что на самом деле ни одна библиотека не может обрабатывать такой огромный график, и поэтому я буду работать непосредственно из списка ребер, большинство операций все еще возможно таким образом, хотя и более сложным. –

Смежные вопросы