内存中的大图
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]
如果您想通过仅存储一半对来尝试节省内存,那么简单性就会大打折扣。
我想在巨大的 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]
如果您想通过仅存储一半对来尝试节省内存,那么简单性就会大打折扣。