Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/142.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/algorithm/11.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 处理大量规则(条件和约束)CEP系统_C++_Algorithm_Data Structures_Rule Engine_Complex Event Processing - Fatal编程技术网

C++ 处理大量规则(条件和约束)CEP系统

C++ 处理大量规则(条件和约束)CEP系统,c++,algorithm,data-structures,rule-engine,complex-event-processing,C++,Algorithm,Data Structures,Rule Engine,Complex Event Processing,我正在开发一个接受100k+唯一输入的应用程序-为了简单起见,让我们假设每个输入都是一个浮点值(a、b、c…等等)-尽管它们也可以是字符串等。该应用程序有许多与这些输入相关的规则/事件/触发器 示例1: Rule[(a > b) and (c <= d)] --> [execute EventX] Rule[x != x.prev] --> [execute EventZ] 定义2:上述规则说明:如果在值更新后,如果输入“x”的当前值不等于其以前的值(该值已更改)。执

我正在开发一个接受100k+唯一输入的应用程序-为了简单起见,让我们假设每个输入都是一个浮点值(a、b、c…等等)-尽管它们也可以是字符串等。该应用程序有许多与这些输入相关的规则/事件/触发器

示例1:

Rule[(a > b) and (c <= d)] --> [execute EventX]
Rule[x != x.prev] --> [execute EventZ]
定义2:上述规则说明:如果在值更新后,如果输入“x”的当前值不等于其以前的值(该值已更改)。执行EventZ

我发现,随着输入数量的增加,以及规则数量的增加,评估“特定”规则并确定是否应该触发事件所需的计算总量正在失去控制——在问题上抛出更快、更多的h/w并不像预期的那样缩放

此时,在每次新的输入更新时,都会在哈希表中查找相关的输入/变量,该哈希表将变量映射到包含它的规则。然后对这些规则中的每一条进行评估,如果结果为真或可操作,则异步触发相关事件

这个问题存在于复杂事件处理领域,不幸的是,这个领域中的大多数体系结构都使用上述相同的死头方法——可能还有一些与评估/重新评估事件的频率相关的改进。这个想法是要有一个系统,可以在近实时作出反应。在多个节点上分发规则和输入似乎也不太好,因为在某些情况下,超过95%的活动规则中存在少数输入

我希望如果有人知道更好的方法来解决这个问题,数据/结构或算法

我想到的一个简单的想法是,人们可以构造一个依赖逻辑推理的列表

如果有两条规则与此类似:

Rule[a < b] --> [exec E1]
Rule[b >= a] --> [exec E2]
规则[a[exec E1]
规则[b>=a]-->[exec E2]
然后,对“a”或“b”的更新不需要对两者进行评估等。但我发现,构建这样的逻辑推理结构非常复杂,容易出错,并且很难进行完全和严格的测试

输入可以代表股票价格、温度传感器等

还有一点需要注意的是,一些输入是暂时受限的,这意味着规则可能要求变量的状态在一定时间内处于特定的位置/状态(例如:MSFT的价格在过去30秒>20美元),目前这是通过使用“表示变量”(facade)实现的其值为0或1/false或true(变量的值由单独的机制确定,通常是触发规则的结果)


还应注意的是,由于近实时限制和每秒生成的数据量,使用带有触发器和存储过程的数据库的选项是不可能的。

尝试对常见表达式进行分解、分组和缓存:这可能会加快速度,尤其是那些最常用的表达式,因此性能可能会提高

这是否可行取决于表达逻辑时必须使用的语言。 我认为您的流程可以建模为电子表格,其中计算是数据驱动。WRT单元引用的拓扑类型的公式足以进行基本计算,但事情很快变得复杂

在C++中,你可以尝试用模板表达式来解决逻辑。建模语言的助手可以是

在Prolog中执行cep

我还没有试过(唉),但我相信它很好。肯定会实现你所追求的,甚至更多

运行在SWI PROlog中,应该是可访问的,易于安装和操作,SWI+PROlog C++接口非常实用的数据交换。

< P>一个想法。 如果规则的条件是连词,则为每个未满足的条件保留一个未满足的术语。将规则仅放在该术语的检查表上。如果条件满足,则扫描其他条件,以确定条件已触发或存在另一个未满足的条件。(我想我是在SAT解算器的环境中学会这个技巧的。)

如果你有10条这样的条款 在多个节点上分发规则和输入似乎不太合适 也可以很好地工作,因为在某些情况下,系统中存在少数输入 超过95%的活动规则


分发规则,并将输入信息提供给所有机器。然后,您可以线性缩放规则的数量。。。如果你在局域网上,你可以将事件/输入作为多播发送,这样网络流量就不会增加。

etalis等人也有同样的问题,我不是要另一个解决这个问题的软件包,我是要寻找可以更有效地解决这个问题的新想法/策略。此外,我不确定像proto这样的编译时解决方案在这里有什么关系。看来您已经尝试过这些替代方案了!我对此表示赞赏。但我相当肯定ETALIS不会使用你在开始时引用的这种“脑死”策略…分解代码这是一种元语言优化,不太容易做对…分解需要对规则与输入/变量进行依赖性分析,这种依赖性分析的问题是循环依赖性的问题,以及发现互斥状态的问题。您分析过这一点以确定瓶颈在哪里吗?是在选择需要评估的规则时?还是在事件的实际评估和触发中?@JimMischel:规则的评估将花费特定的时间-诀窍是对给定的输入更新集执行最少/最少数量的评估。简言之,是的,我们已经分析了代码