Чтение / Запись Объекта Networkx Graph

Я пытаюсь иметь дело с супер-массивным объектом Networkx Graph с сотнями миллионов узлов. Я хотел бы иметь возможность записать его в файл, чтобы не потреблять всю память компьютера. Однако мне нужно постоянно искать существующие узлы, обновлять ребра и т. д.

есть хорошее решение для этого? Я не уверен, как это будет работать с любым из форматов файлов, предоставляемых наhttp://networkx.lanl.gov/reference/readwrite.html

только решение, которое я могу придумать, - это сохранить каждый узел как отдельный файл со ссылками на другие узлы в файловой системе - таким образом, открытие одного узла для изучения не перегружает память. Существует ли существующая файловая система для больших объемов данных (например, PyTables), чтобы сделать это без написания собственного кода шаблона?

2 ответов


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


сначала попробуй pickle; он предназначен для сериализации произвольных объектов.

пример создания DiGraph и сериализация в файл:

import pickle
import networkx as nx

dg = nx.DiGraph()
dg.add_edge('a','b')
dg.add_edge('a','c')
pickle.dump(dg, open('/tmp/graph.txt', 'w'))

пример загрузки DiGraph из файла:

import pickle
import networkx as nx

dg = pickle.load(open('/tmp/graph.txt'))
print dg.edges()

выход:

[('a', 'c'), ('a', 'b')]

если это недостаточно эффективно, я бы написал вашу собственную процедуру для сериализации:

  1. края и
  2. nodes (в случае, если узел является инцидентом no стыки.)

обратите внимание, что использование списков, когда это возможно, может быть намного эффективнее (вместо стандартных для циклов).

если этой недостаточно эффективно, я бы назвал подпрограмму C++ из Python: http://docs.python.org/extending/extending.html