内存中的大图

时间:2016-05-17 09:03:36

标签: python numpy memory port

我想在巨大的pcaps中记录所有使用过的端口。有65535个端口可用,每个端口都可以互相通话: 65535 x 65535总共链接

矩阵将非常稀疏(许多0个条目)。 另外,我认为边缘不必是定向的,因此可以将Port1-> Port2添加到Port2-> Port1(其将我们的值减少到65535 * 65536/2)。 你会如何使用python存储它?在numpy?估计的内存消耗量是多少?

之后,我想找到一个端口和pop()的最大总和(整个行和列同时)。这意味着,我想找到例如Port1使用500次(从Port2到Port1 100次,从Port3到Port1 300次,Port4到Port1 100次)......

以图形方式说,我希望有65535个节点可以相互连接。然后我想找到连接边上具有最高值总和的节点。之后,我想弹出节点(并删除相应的边,这将减少其他节点的总和)。

谢谢!

2 个答案:

答案 0 :(得分:1)

在Python中,根据稀疏稀疏程度的不同,dict-of-dicts可以很好地处理这个问题。

connections = { ..., 8080: { 4545:17, 20151:3, ...}, ...}

如果我已经理解你正在做什么,那么端口p的连接数是

count = sum( connections[8080].values() )

删除端口p是

del connections[p]
for conn in connections.values():  # edit, bug fixed.
    if p in conn: 
         del conn[p]

如果你想通过只存储一半的对来试图节省内存,那么简单就会受到很大的影响。

答案 1 :(得分:0)

查看Graph的邻接列表表示,它很可能适合您的需求。

但是,包含65535个顶点的图形并不大。即使你不能用简单的矩阵表示它。

内存消耗为O(E + V),V个顶点数(65535)和E个边数(在稀疏图上,它的大小顺序与V相同)。