读/写NetworkX图形对象

eja*_*ang 9 python file-io networkx

我正在尝试处理具有数亿个节点的超大型NetworkX Graph对象.我希望能够将其写入文件,以免占用我的所有计算机内存.但是,我需要不断搜索现有节点,更新边缘等.

这有一个很好的解决方案吗?我不确定它如何与http://networkx.lanl.gov/reference/readwrite.html上提供的任何文件格式一起使用

我能想到的唯一解决方案是将每个节点存储为一个单独的文件,并引用文件系统中的其他节点 - 这样,打开一个节点进行检查不会使内存过载.是否存在大量数据的现有文件系统(例如PyTables),而无需编写自己的样板代码?

use*_*ser 18

先试试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'))
Run Code Online (Sandbox Code Playgroud)

DiGraph从文件加载a的示例:

import pickle
import networkx as nx

dg = pickle.load(open('/tmp/graph.txt'))
print dg.edges()
Run Code Online (Sandbox Code Playgroud)

输出:

[('a', 'c'), ('a', 'b')]
Run Code Online (Sandbox Code Playgroud)

如果这不够有效,我会编写自己的例程来序列化:

  1. 边缘和
  2. 节点(如果节点没有边缘入射).

请注意,尽可能使用列表推导可能会更有效(而不是循环的标准).

如果不够有效,我会在Python中调用C++例程:http: //docs.python.org/extending/extending.html

  • +1酸菜是一件好事,以前从未听说过,谢谢! (2认同)

小智 4

如果您将其构建为 NetworkX 图,那么它已经在内存中。对于这么大的图表,我的猜测是您必须执行类似于您对单独文件的建议的操作。但是,我不会使用单独的文件,而是使用数据库来存储每个节点以及节点之间的多对多连接。换句话说,您将有一个节点表和一个边表,然后要查询特定节点的邻居,您可以只查询两端具有该特定节点的任何边。这应该很快,但我不确定您是否能够利用 NetworkX 的分析功能,而无需先在内存中构建整个网络。