【问题标题】:Is there an efficient way of storing the most recent part of a continuous stream in an array?有没有一种有效的方法将连续流的最新部分存储在数组中?
【发布时间】:2018-03-19 15:22:00
【问题描述】:

我正在编写的程序中有源源不断的数据流。我想要一个固定大小的缓冲区数组,它只存储该流的 T 最近的观察结果。但是,对我来说,如何以有效的方式实现这一点并不明显。

到目前为止,我所做的是首先分配长度为 T 的缓冲区,并将传入的观察结果从顶部按连续顺序排列:data_0->index 0, data_1->index 1…data_T->index T.

在缓冲区满之前可以正常工作。但是当观察data_T+1 到达时,index 0 需要从缓冲区中删除,并且所有 T-1 行都需要在数组/矩阵中上移一步为了将最新的数据点放在 index T

当缓冲区很大并且需要将数十万个元素一直向上推到一行时,这似乎是一种非常低效的方法。 这通常是如何解决的?

【问题讨论】:

    标签: arrays memory-management stream buffer


    【解决方案1】:

    这个算法叫做先进先出队列java fifo queue 看看这个 API,它有几个代码示例。

    【讨论】:

    • 我查看了链接,但我不懂 java,所以我不太了解。我主要用 Python、C 和 Matlab 编写代码。但不管是哪种语言,我都在寻求一个概念性的解决方案,可以很容易地用任何语言以类似的方式实现。
    • 好的,所以使用ring buffer
    • 嗯,所以一旦缓冲区填满到底部,基本上就从顶部开始覆盖?这也是我最初的第一个想法,但我放弃了它,因为我怀疑如果缓冲区没有按照数据到达的方式排序,那么跟踪索引会太麻烦。有没有一种方法可以保留数据的连续顺序?这样缓冲区总是从最旧的->最新的还是最新的->最旧的?
    • 你可以使用链表: 1. 分配一个你想要的大小的数组。 2. 这个 Array 中的每个元素都应该包含 3 个参数:2.1 next,prev 和 value 3. 创建一个指向第一个和最后一个对象的对象。 3.1。将它们初始化为 NULL 4. 实现 add() 和 remove() 4.1 add - 更改最后一个(以及第一个当它为 NULL 时) 4.2 remove - 更改第一个。您可以自行继续使用此算法。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-05-09
    相关资源
    最近更新 更多