用于匹配序列的高效算法

时间:2012-02-27 18:29:29

标签: java complex-event-processing

我正在寻找一种有效的算法来匹配[大]数据列表中的模式/序列。鉴于某种类型:

class Data implements Event {
     int valueA;
     int valueB;
     int valueC;
     long timestamp;

     ...
}

我想匹配以下情况。

valueA == 1 for 10 seconds
then valueB == 2 for 10 seconds
then valueC == 3 for 10 seconds.

我已经实现了一个非常基本的状态机来匹配这种模式,它运行良好并且具有非常可接受的吞吐量。但是,如果我想添加额外的时间限制,例如第二个模式必须在第一个

后X秒发生
a : valueA == 1 for 10 seconds
b : valueB == 2 for 10 seconds [ 10 seconds after a ]
c : valueC == 3 for 10 seconds [ 10 seconds after b ]

状态机概念似乎不再合适,因为有必要评估(并重新评估已经匹配的条件)并将状态存储在内存中然后尝试关联它们。系统中将有大约1000个这种类型的“规则”。

**编辑**

澄清一下,如果我试图匹配如下的序列:

x changed to 1
1 second passed
y changed to 1
3 seconds passed
z changed to 1

并给出输入数据:

[ x=0, y=0, z=0, t=0 sec ]
[ x=1, y=0, z=0, t=1 sec ]
[ x=0, y=1, z=0, t=2 sec ]
[ x=1, y=0, z=0, t=3 sec ]
[ x=0, y=1, z=0, t=4 sec ]
[ x=1, y=0, z=0, t=5 sec ]
[ x=0, y=1, z=0, t=6 sec ]
[ x=0, y=0, z=1, t=7 sec ]

我希望这会在t = 7时达到最终状态。但是,我能看到这样做的唯一方法是存储所有其他状态转换?

**结束编辑**

我之前使用过具有CEP支持的Rule Engine来匹配这些条件,这些条件运行得相当好,但无法处理所需的大量数据(每秒数十万个事件)。

有没有一种有效的方法可以解决这个问题?我正在使用Java。

由于

1 个答案:

答案 0 :(得分:0)

不是让你的状态机转换(值,时间),而是可以让它转换为事件,例如

 value changed to x
 1 second passed

这将增加状态和转换的数量,但允许您表达广泛的关系,例如之前vs之后vs x秒之后。如果您知道要进行的所有检查在10秒边界上排队,则可以通过使用“10秒通过”而不是“1秒通过”来减小状态机大小。