我正在尝试处理一个拥有数亿个节点的超大规模NetworkX图对象。我希望能够将它写到文件中,这样就不会消耗我所有的计算机内存。然而,我需要不断地在现有节点上搜索,更新边,等等。
有没有一个很好的解决方案?我不确定它如何与http://networkx.lanl.gov/reference/readwrite.html上提供的任何文件格式一起工作
我能想到的唯一解决方案是将每个节点存储为一个单独的文件,其中包含对文件系统中其他节点的引用-这样,打开一个节点进行检查就不会使内存过载。有没有一个现有的文件系统可以处理大量数据(例如PyTables)来做到这一点,而无需编写我自己的样板代码?
发布于 2012-08-06 20:10:55
如果您已经将其构建为NetworkX图,那么它应该已经在内存中了。对于这么大的图形,我猜你必须做一些类似于你建议的单独文件的事情。但是,我不使用单独的文件,而是使用数据库来存储每个节点,节点之间具有多对多连接。换句话说,你应该有一个节点表和一个边表,然后要查询特定节点的邻居,你可以只查询在两端都有该特定节点的任何边。这应该很快,尽管我不确定您是否能够利用NetworkX的分析功能,而不是首先在内存中构建整个网络。
发布于 2012-07-06 01:26:46
首先试试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')]
如果这还不够高效,我会编写您自己的例程来序列化:
请注意,在可能的情况下使用列表理解可能会更有效(而不是循环的标准)。
如果这还不够高效,我会从Python:http://docs.python.org/extending/extending.html中调用一个C++例程
发布于 2020-11-20 02:54:15
我忘记了最初我来到StackOverflow是为了解决什么问题,但是我偶然发现了这个问题(几乎晚了十年!)我可以推荐Grand,这是我们编写的一个类似networkx的库,正是为了解决这个问题:
之前的
import networkx as nx
g = nx.DiGraph()
g.add_edge("A", "B")
print(len(g.edges()))
之后的
import grand
from grand.backends import SQLBackend # or choose another!
g = grand.Graph(backend=SQLBackend())
g.nx.add_edge("A", "B")
print(len(g.nx.edges()))
接口与NetworkX相同,但数据存储在SQL、DynamoDB等语言中。
https://stackoverflow.com/questions/11025126
复制