内存中的大图

Big graph in memory

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

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

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

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

谢谢!

查看 Graph 的邻接表表示,它很可能满足您的需求。

然而,包含 65535 个顶点的图并没有那么大。即使你不能用一个简单的矩阵来表示它。

内存消耗为O(E+V),顶点数为V (65535),边数为E(在稀疏图上,它与V具有相同的量级)。

在 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]

如果您想通过仅存储一半对来尝试节省内存,那么简单性就会大打折扣。