【问题标题】:Real time sampling pattern [closed]实时采样模式[关闭]
【发布时间】:2014-06-16 21:55:33
【问题描述】:

我有一个传感器,它在随机时间以高频率接收数据,我需要一个以指定频率(例如每秒 1 个数据点)指定大小(例如 60 个数据点)的滚动时间序列窗口。

采样值应该是从传感器读取的最新值(即读数之间的所有其他值都应该被丢弃)。

我认为某种生产者-消费者模式在这里是合适的,但由于我缺乏并发方面的经验,我正在努力实现适当且高效的实现。

当我想消费所有产生的数据时,我知道ArrayBlockingQueue 是一个很好的数据结构可供选择,但在这种情况下,我只想消费最新产生的值(或者如果没有产生值,则值前一个时期),并且这个频率恰好是指定的频率(例如每秒一次)。

【问题讨论】:

  • 那么,对于过去 60 秒的每一秒,您想要在那一秒内收到的最新样本值吗?

标签: java multithreading concurrency thread-safety sampling


【解决方案1】:

简单的答案,使用循环队列。

//init
int i = 0; 
final int N = 60;
Point[] data=new Point[N];
for(i=0;i<N;i++)data[i]=new Point();//dummy points to start with

//update
void addPoint(Point p){
   data[i] = p;
   i = (i+1)%N;
}

请注意,如果您没有正确初始化数据,前 60 位将为 null,您将收到 NullPointerException。将它们循环设置为某个虚拟值。

我可能也应该解释一下代码。 (i+1)%N 代码将强制数字介于 0 和 N-1 之间。当它达到 i=59 时,则 (59+1)%60 = 60 mod 60 = 0。循环继续。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-08-25
    • 1970-01-01
    • 1970-01-01
    • 2020-02-26
    • 2023-03-28
    • 1970-01-01
    相关资源
    最近更新 更多