【发布时间】:2020-08-18 11:43:13
【问题描述】:
对于一个开源项目,我正在尝试使用 NetworkX 来找到 Graph 的吸引子(称为 State Transition Graph)。问题是对于近 2**33 个循环,具有多种输入的函数返回一个元组列表(近 5000 个元组),其中每个元组包含需要馈送到 networkx 图的边。如下:
def BigGraph:
#Do some computations
G = nx.DiGraph()
for i in range(2**33):
#Do some computations
edges = func(different initial conditions)
G.add_edges_from(edges)
如前所述,由于边数增长得更快,而且 NetworkX 图在 RAM 上占用了大量内存,我尝试如下连续读取和写入 pickle 文件:
def BigGraph:
#Do some computations
G = nx.DiGraph()
nx.write_gpickle(G, 'graph.gpickle')
for i in range(2**33):
#Do some computations
edges = func(different initial conditions)
G = nx.read_gpickle('graph.gpickle')
G.add_edges_from(edges)
nx.write_gpickle(G, 'graph.gpickle')
在此之后,我意识到随着边缘呈指数增长,对泡菜的读写会影响我大量的时间和记忆。我已经尝试过here 的建议,但正如那个问题中提到的,我不需要经常使用 Graph。最终,如果可能的话,我需要做的就是在复杂度为 O(1) 的 networkx 图中添加很多边。
无论如何我都可以这样做,这样可以节省大量时间并且不会对我的记忆造成问题(我有 8 GB 的 RAM)。我愿意使用任何外部库,只要它们是免费的并且可以有效地完成我打算做的事情。
编辑:我想知道是否有一种方法可以使用 memmap 将我的图表存储在我的硬盘上并找到图表的吸引组件。使用 NetworkX 对我来说是必须的。
【问题讨论】:
-
我不明白为什么如果你继续阅读酸洗会避免内存问题。
-
节点是什么数据类型?整数?如果是字符串,那么使用整数可以立即节省内存。
-
@Joel 是的,我明白为什么酸洗对我没有帮助。并且节点的数据类型也是整数
标签: python graph networkx large-data