【问题标题】:Storing queue in hash table or vector of vector将队列存储在哈希表或向量的向量中
【发布时间】:2013-02-20 02:56:57
【问题描述】:

我有一个服务器多客户端服务器 - 在收到来自客户端的消息后,服务器需要对其进行处理,然后再将其传递给另一个客户端。

我不知道我想做的最好的实现是什么,所以如果有任何帮助,我将不胜感激。这些消息将按时间间隔发送,因此消息需要被接收、处理并推送到结构中,然后才能在特定时间从要发送的结构中访问。消息有两个属性:目的地和优先级。访问将按时间间隔进行,有两种模式:特定于客户端节点,或向所有节点开放接收。

  1. 如果时间间隔只允许特定节点接收,则会发生从最高优先级到最低优先级检查的所有队列,即以最高优先级发送的最早消息将从结构中“推出”。
  2. 如果时间间隔为“开放”,则无论节点如何,都将“推出”最高优先级的最早消息。

我最初认为它可能是vector<vector<queue<message>>,但我意识到根据第 2 点进行搜索效率不高。我将不胜感激任何建议!有人建议我使用哈希映射,但我没有这方面的经验,如果这是最好的方法,我将不胜感激。

edit:将相同的消息推送到两个不同的结构中是否有更好的解决方案?一:按优先级分类,向量持有FIFO队列(每个优先级一个)。二:按节点分类,vector<vector<queue<message>>

【问题讨论】:

  • 澄清一下,每条消息是否总是发往 one 节点?另外,节点的可能数量是多少(至少是一个非常粗略的范围:数十、数百、数千)?
  • @Darius 该消息最初将只发往一个节点(随后可能会实现广播)。可能的节点数量将在数以百计的范围内。抱歉没有说清楚!

标签: data-structures hashmap queue client-server server-side


【解决方案1】:

H除非对尺寸和速度有所了解,否则没有一个答案。所以,我想我会记下我想出的一些选项。

选项 1 -- 超级计算机:假设我们假设一台机器速度超快,与所涉及的数据量相比。我们可以简单地将消息存储在一个无序列表中,因为它每次都足够快地遍历列表(平均而言,我们需要遍历列表的一半)。

选项 1A -- 让我们稍微麻烦一下:按优先级+到达时间排序的列表会使“打开”响应更快,因为我们只是从“顶部”开始。对于特定于节点的响应,我们通常会搜索不到一半,因为最高优先级都在开头附近

选项 2 -- 资源少,一百个节点,数百条消息: 如果插入数据结构的时间不是那么重要,并且您必须在以下情况下做出尽可能短的响应您需要发送一条消息,然后您需要一个全局队列,以便您可以在间隔打开时弹出。您还需要特定于节点的队列。最后,您需要一种立即到达特定于节点的队列的方法。这意味着:

  1. 全局有序列表
  2. N 个节点特定的有序列表
  3. 以 Node-Id 为键的映射,并指向特定于节点的列表

在我看来,最痛苦的部分是同步,以便您每次都从全局列表和特定节点列表中删除(添加时相同)

我的第一个想法是将每条消息包装在一个包装器中,该包装器的作用类似于双向链表中的一个节点。但是,它实际上是两个列表。包装器将具有基于全局优先级的 Prev 和 Next;但是,它也会有一个基于节点特定优先级的 Prev 和 Next。这样一来,您只需要取出一个消息本身的副本,同时以标准方式修复 prev/next 指针。 (这基本上结合了上面的#1 和#2)。

对于#3,我会保留一张地图,但不是查找特定于节点的列表,而是指向该特定节点的“头”包装器。

这是一张图片,用于说明。

听起来很有趣!

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-11-03
    • 2011-06-03
    • 1970-01-01
    • 2016-07-14
    • 1970-01-01
    • 1970-01-01
    • 2012-08-29
    • 1970-01-01
    相关资源
    最近更新 更多