Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/python-2.7/5.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
Drools 与从内存中检索Kiebase实例相比,执行Kiebase(从缓存检索的实例)需要更多的时间来触发所有规则_Drools_Kie - Fatal编程技术网

Drools 与从内存中检索Kiebase实例相比,执行Kiebase(从缓存检索的实例)需要更多的时间来触发所有规则

Drools 与从内存中检索Kiebase实例相比,执行Kiebase(从缓存检索的实例)需要更多的时间来触发所有规则,drools,kie,Drools,Kie,在第一次构建知识库时,我们将其实例存储在缓存中,以便通过使用该缓存实例节省构建时间。我注意到,当这个实例被直接使用x次时,触发所有规则所需的时间非常少,但当我们使用缓存实例时,触发所有规则所需的时间更多 以下是从内存中获取KieBase实例时,kieSession.fireAllRules()所花费的时间(即直接使用KieBase实例) 以下是每次执行时从缓存(Redis)获取KieBase实例时,kieSession.fireAllRules()所花费的时间 min: 35 ms, max:

在第一次构建知识库时,我们将其实例存储在缓存中,以便通过使用该缓存实例节省构建时间。我注意到,当这个实例被直接使用x次时,触发所有规则所需的时间非常少,但当我们使用缓存实例时,触发所有规则所需的时间更多

以下是从内存中获取
KieBase
实例时,
kieSession.fireAllRules()
所花费的时间(即直接使用
KieBase
实例)

以下是每次执行时从缓存(Redis)获取
KieBase
实例时,
kieSession.fireAllRules()
所花费的时间

min: 35 ms, max: 152 ms, avg: 51 ms  
Individual execution time:  [152, 42, 45, 51, 40, 79, 56, 42, 48, 42, 44, 44, 69, 38, 40, 39, 57, 40, 61, 53, 35, 41, 43, 45, 51, 43, 48, 41, 43, 60]

//NOTE: This does not include cache fetch time. It only reflects the time taken (in ms) by function `fireAllRules` of class `KieSession`.
在上面的例子中,我采用的规则数量非常少,但实际上我有数千条规则

如果您注意到,当使用的
KieBase
实例是从缓存检索到的实例时,所花费的时间更多

这种行为的原因是什么?如何确保从缓存中检索到的
KieBase
实例触发所有规则的时间更短?

KieSession kieSession = kbase.newKieSession();
kieSession.insert(...);
kieSession.fireAllRules();
kieSession.dispose();

遗憾的是,不支持KieBase序列化。除了性能,您可能会遇到意想不到的问题,因此请不要这样做(因此我不深入了解为什么速度慢)。您可以将KieBase存储在内存中。如果集群中有多个节点,请为每个JVM构建KieBase并将其存储在每个JVM的内存中。

如何缓存KieBase?您的计时是否包括从缓存检索Kiebase所需的时间?@RoddyOfFrozenpeas上述时间不包括缓存获取时间。它只反映类“KieSession”的函数“fireAllRules”所花费的时间。我将KieBase以字节数组的形式存储在缓存中(使用ByteArrayOutputStream,我还尝试使用DroolObjectOutputStream)。可能是KieBase在内部进行了一些缓存,当它存储在缓存中时,这些缓存并没有序列化(只是猜测)。
KieSession kieSession = kbase.newKieSession();
kieSession.insert(...);
kieSession.fireAllRules();
kieSession.dispose();