Чтение / Запись Объекта 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')]
если это недостаточно эффективно, я бы написал вашу собственную процедуру для сериализации:
- края и
- nodes (в случае, если узел является инцидентом no стыки.)
обратите внимание, что использование списков, когда это возможно, может быть намного эффективнее (вместо стандартных для циклов).
если этой недостаточно эффективно, я бы назвал подпрограмму C++ из Python: http://docs.python.org/extending/extending.html