环(循环)缓冲区和队列之间有什么区别?两者都支持FIFO所以在什么情况下我应该在队列中使用环形缓冲区以及为什么?
与Hadoop的相关性
映射阶段使用环形缓冲区来存储中间键值对。在队列中进行此选择的原因是什么?
答案 0 :(得分:5)
队列是支持操作入队和出队的抽象数据类型。环形缓冲区是队列的一种可能实现,尽管它不是唯一的(例如,您可以使用链表实现队列)。换句话说,队列是可以支持FIFO插入的数据结构的通用术语,而环形缓冲区是可用于实现队列的一种可能的数据结构。
希望这有帮助!
答案 1 :(得分:3)
RingBuffer是一个数组,用作队列
它将同时保持Read&单独写位置。当它到达Array的末尾时,它将从Array的开头继续。
RingBuffer在队列上的使用。
有关详细信息,请查看Jakob Jenkov的article。
看看相关的SE问题:
答案 2 :(得分:1)
我宁愿说队列是一个策略,指示放置项目的位置,以及删除它们的位置。在队列(也称为FIFO)中,客户被放置在后面,并从前面移除,允许第一个成为第一个服务。
另一方面,缓冲区是一个更通用的名称,并且没有任何关于其策略的说法,尽管大多数人假设缓冲区是FIFO。缓冲通常是更多的物理"结构,因此通常与某些容量限制相关(比方说8项)。
在您的情况下,循环缓冲区实现的FIFO具有未完成客户数量的上限,如果超过此最大值,它将丢弃最旧的客户并替换为新客户。
答案 3 :(得分:1)
在2是实现非常相似,但它们的用法的细微差别可以让他们显得相当不同。这是简短的答案:
Ring:缓冲区ar中的中间值被读取 FIFO:只有最老的被读取
环形缓冲区具有一个指针,该指针在到达末尾时会前进并环绕。 这允许数据被覆盖时,它自然地变得过时。如果您需要保留最后N个样本,这很有用。用法示例:
FIFO或Queue(两者都是相同的)通常被实现为环形缓冲区(templatetypedef的答案是正确的,它可能是一个链表)。与环形缓冲区相反,将有2个指针。一个用于读操作,另一个用于写。就像环缓冲区指针,无论是指针将环绕于递增当物理缓冲区的开始;给出连续缓冲区的错觉。注意,写指针追上读指针被认为是错误。用法示例: