环形缓冲区和队列之间的区别

时间:2014-04-16 13:53:07

标签: hadoop data-structures hadoop2

环(循环)缓冲区和队列之间有什么区别?两者都支持FIFO所以在什么情况下我应该在队列中使用环形缓冲区以及为什么?

与Hadoop的相关性

映射阶段使用环形缓冲区来存储中间键值对。在队列中进行此选择的原因是什么?

4 个答案:

答案 0 :(得分:5)

队列是支持操作入队和出队的抽象数据类型。环形缓冲区是队列的一种可能实现,尽管它不是唯一的(例如,您可以使用链表实现队列)。换句话说,队列是可以支持FIFO插入的数据结构的通用术语,而环形缓冲区是可用于实现队列的一种可能的数据结构。

希望这有帮助!

答案 1 :(得分:3)

RingBuffer是一个数组,用作队列

它将同时保持Read&单独写位置。当它到达Array的末尾时,它将从Array的开头继续。

RingBuffer在队列上的使用。

  1. Ring Buffers很快。
  2. 如果您要保存多少数据的硬截断,RingBuffer很有用。
  3. 有关详细信息,请查看Jakob Jenkov的article

    看看相关的SE问题:

    Java - Ring Buffer

答案 2 :(得分:1)

我宁愿说队列是一个策略,指示放置项目的位置,以及删除它们的位置。在队列(也称为FIFO)中,客户被放置在后面,并从前面移除,允许第一个成为第一个服务。

另一方面,缓冲区是一个更通用的名称,并且没有任何关于其策略的说法,尽管大多数人假设缓冲区是FIFO。缓冲通常是更多的物理"结构,因此通常与某些容量限制相关(比方说8项)。

在您的情况下,循环缓冲区实现的FIFO具有未完成客户数量的上限,如果超过此最大值,它将丢弃最旧的客户并替换为新客户。

答案 3 :(得分:1)

在2是实现非常相似,但它们的用法的细微差别可以让他们显得相当不同。这是简短的答案:

Ring:缓冲区ar中的中间值被读取 FIFO:只有最老的被读取

长答案

环形缓冲区具有一个指针,该指针在到达末尾时会前进并环绕。  这允许数据被覆盖时,它自然地变得过时。如果您需要保留最后N个样本,这很有用。用法示例:

  • 的实施FIR,在那里你会使用最新的N个样本。作为新的数据点进来,FIR将在最近的N个数据点进行操作。
  • 如果发生特定事件,则捕获最后N个数据点(例如行车记录仪,如果检测到事件,则自动保存视频的最后5秒)

FIFO或Queue(两者都是相同的)通常被实现为环形缓冲区(templatetypedef的答案是正确的,它可能是一个链表)。与环形缓冲区相反,将有2个指针。一个用于读操作,另一个用于写。就像环缓冲区指针,无论是指针将环绕于递增当物理缓冲区的开始;给出连续缓冲区的错觉。注意,写指针追上读指针被认为是错误。用法示例:

  • 一个实体正在产生的数据,另一种是对其进行处理,但该处理不能在时间或在同一时间作为数据生产者发生。就像在邮局的阵容。
  • 消息从一个系统发送到另一个系统。订单很重要,不应丢失。