【发布时间】:2011-09-30 09:18:57
【问题描述】:
这是关于非常常见的传感器数据处理问题。
为了同步和合并来自不同来源的传感器数据,我想用 Java 实现它,而不需要太复杂的第三个库或框架。
比如说,我定义了一个对象 (O),它由例如 4 个属性 (A1,..A4) 组成。这 4 个属性来自不同的数据通道,例如套接字通道。
这4个属性一般以1.0~2.0Hz的速率到达,并且它们的到达是相互独立的。 一旦有 4 个属性(A1、..A4)同时出现(在一个小的时间窗口内,例如 100 毫秒),然后我从这 4 个属性构造一个新对象 (O)。
描述性场景如下。 A1~A4到达时间点标有*号。
对象O1~U3分别在t1、t2、t3时间点构建。 一些属性在 t2 和 t3 之间到达,但对于构造一个对象来说是不完整的,因此它们 将被删除和忽略。
A1 * * * *
A2 * * * *
A3 * * *
A4 * * * *
--------|------------|-----------------|----------> time
t1 t2 t3
O1 O2 O3
一些要求:
- 确定时间点 a.s.a.p. 以根据最后传入的 4 个属性构造对象。
- FIFO,O1 必须在 O2 之前构建,以此类推。
- Java 中的较少锁定
- 如果数据未完成构造对象,则最终删除数据。
关于实施的一些快速想法是:
- 将任何传入属性存储在时间离散存储桶的 FIFO 队列中(每个存储桶包含 4 个不同的属性)。
- 并发运行一个无限线程以检查 FIFO 队列(从队列的头部)是否有任何存储桶已被 4 个不同的属性填充。如果是,则构造一个对象并将存储桶从队列中移除。如果存储桶在特定时间窗口内未完全填充,它将被丢弃。
欢迎任何建议和指正!
【问题讨论】:
-
只是为了确保我清楚数据的删除,你是说,例如,如果 A2-A4 没有在大约 100 毫秒内填充,则应该删除 A1?因此,如果 A1 到达,然后 150 毫秒内没有任何反应,然后 A2、A3 和 A4 在大约 50 毫秒内到达,则不会创建 Object,因为没有有效的 A1。如果新的 A1 在 A2、A3 和 A4 中最早的 100 毫秒内到达,则可以创建一个 Object,如果没有,则丢弃 A2、A3 和 A4。
-
数据是否应该以一定的固定速率到达,以便您知道它们应该在什么时间到达?
-
再想一想,你所描述的另一种方式是一个 100 毫秒长的滑动窗口,如果该窗口中所有四个点的数据都到达,则可以创建一个对象。
-
@Kaj:产生数据的传感器(这里的属性)可能不可靠。
-
@elgcom。在这种情况下,您可以查看我的示例。我认为它可以满足您的需求,并且可以处理可配置数量的审查器。
标签: java concurrency merge messaging sensors