繁体   English   中英

python中的高性能多对多关系

[英]High performance many-to-many relationships in python

给定的clusternode对象:

class Cluster():
   def __init__(self):
       pass


class Node():
    def __init__(self):
        pass

我想知道满足以下要求的最佳数据结构或设计是什么:

  1. 查找给定node所属的所有clusters
  2. 查找属于给定cluster所有nodes
  3. 跟踪一个数值,该数值代表每个node属于一个cluster ,每个cluster属于一个node
  4. 删除或添加nodecluster时,请确保一致性。
  5. 快速查找,添加和删除。 (以该顺序)
  6. 内存需求低。

节点和群集的数量将分别在100,000个范围内。

各种相关性的更多详细信息:

  • 一个node将始终属于一个或多个集群,
  • cluster将始终包含一个或多个节点。
  • 如果cluster删除了唯一node ,则应删除该群集。
  • node将永远不会删除其所有集群。
  • 示例: node1可能属于cluster14 90%,属于cluster88 10%

我当时在考虑使用SQLite,但问题是在数据库中存储序列化对象太慢。 我可以将object_ids存储在数据库中,然后在将object_ids映射到对象实例的dict中查找这些对象,但是dict和数据库之间存在一致性问题。 另外,从dict获取实例列表有点麻烦。

我可以在SQLite中存储实例的内存位置,但这似乎很危险,并且我们仍然存在一致性问题。

我在家庭项目上实现了类似的数据结构; 我自己的要求要求外观类似的体系结构,除了我称群集“标签”(但核心概念相同)。

您可以通过以下方式实现它:

  • 集群名称(或类)列表
  • 列表字典。 在本词典中,键是位掩码,用于标记您属于给定集群集的事实,而值是所有对应的节点。 假设,如果您具有集群1至4,并且Node42分别属于集群1和3,则字典将具有一个类似于5:[Node42, ...]的条目5:[Node42, ...]
  • 单例字典(这是可选的内存优化,因为如果我没有记错的话,在python中设置权重约为130字节,可以直接解决单例的指令有助于减少内存消耗)

关于要求:

  1. 取决于,它在我的初始体系结构中是O(n),但是由于额外的内存消耗,您可以立即拥有它:在字典中向每个节点添加具有其对应键的字段,然后只需要使用掩码进行集群查找
  2. O(n):您必须读取数据结构并聚合属于给定集群的节点。 最好的情况是快速的,但是严重分散的结构将很慢。 对于相同的价格,您可以实现联合的查找和群集的相交
  3. 对于簇:遍历字典和求和透镜。 对于节点:遍历掩码并求和1s。
  4. 这是最难的部分,需要进行一些编程,我们可能超出了100条Python左右的行,这超出了stackoverflow的范围。
  5. 如果要固定查找,则需要接受冗余。 如果不接受O(n)节点查找,则可以从每个群集中的节点列表开始,进行不同的体系结构。 但是,如果您的重叠量很大,那么内存需求也将如此。
  6. 我们在Python中,内存需求很重。 但是,您可以将大型词典外部化或列出到Redis服务器。 由于我们谈论的是高效的内存存储,因此这将是我保持快速查找的选择。

如果您对代码感兴趣,我可以发布它以供您看一看,但是我认为您首先需要就体系结构做出一两个选择:您无法拥有完整的Python完整的恒定时间内存有效的大规模数据结构IMHO 。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM