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