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)
如果这不够有效,我会编写自己的例程来序列化:
请注意,尽可能使用列表推导可能会更有效(而不是循环的标准).
如果这不够有效,我会在Python中调用C++例程:http: //docs.python.org/extending/extending.html
小智 4
如果您将其构建为 NetworkX 图,那么它已经在内存中。对于这么大的图表,我的猜测是您必须执行类似于您对单独文件的建议的操作。但是,我不会使用单独的文件,而是使用数据库来存储每个节点以及节点之间的多对多连接。换句话说,您将有一个节点表和一个边表,然后要查询特定节点的邻居,您可以只查询两端具有该特定节点的任何边。这应该很快,但我不确定您是否能够利用 NetworkX 的分析功能,而无需先在内存中构建整个网络。