当前位置: 首页 > 知识库问答 >
问题:

由于大量内存消耗,外部化和缓存流挂

苏鸿波
2023-03-14

当我刚接触drools时,我浏览了一些论坛,开发了一个使用KnowledgeBuilder api和StatefulKnowledgeSessions配置drools的应用程序。当时drools文件的数量较少,并且与应用程序打包在一起。分析时,我发现drools消耗了大量内存,内存分配率(TLAB)很高。这让我思考,是否需要有一个缓存解决方案,以避免每次有应用程序请求时都创建KnowledgeSessions。我的应用程序支持几乎100多种类型的事件,对于每个事件,我都有3种不同类型的drools文件,我一次执行一个,以中间过滤结果。此外,应用程序中drools文件的数量和更改/配置新文件的频率也在增加,我必须将drools从应用程序包中具体化。我有不同的drools文件来满足不同的需求,并不是每次都需要,所以我想在REST服务下备份一个NO-SQL数据库,无论何时我们想要更改,都会在其中注入这些数据。因此,我认为应用程序可以从服务中获得所需/所需的drool文件(我将有drools文件的命名约定),如果需要,则将其缓存到本地(如果不需要,将使用Guava缓存/任何进程内缓存相应地逐出),这样内存消耗/分配率可能会下降(猜测)我对上述设计正确吗?如果是这样,如何从缓存/stringbuilder/内存中读取drools?目前,我通过下面的api从文件系统读取它们

KnowledgeBuilder knowledgeBuilder = KnowledgeBuilderFactory.newKnowledgeBuilder();
knowledgeBuilder.add(ResourceFactory.newClassPathResource("drools_conventions.drl"), ResourceType.DRL);
KnowledgeBase kbase = KnowledgeBaseFactory.newKnowledgeBase();
kbase.addKnowledgePackages(knowledgeBuilder.getKnowledgePackages());
StatefulKnowledgeSession kSession = knowledgeBase.newStatefulKnowledgeSession();
List filter = new ArrayList<>();
kSession.insert(dispatchFactInput);
kSession.setGlobal("Rule", filter);
kSession.fireAllRules();
kSession.dispose(); ```

Can I cache Knowledgebase/StatefulKnowledgeSession?

Since I am new to drools I would like to take opinions/suggestions, learn to implement the best/possible solution to above situation.

共有1个答案

葛成济
2023-03-14

我想你可以看看无状态会话。我认为,如果你只是插入事实、违反规则,然后立即处理KieSession,这是你的最佳选择。除此之外,在较新的Drools版本中已经有了会话缓存机制。

 类似资料:
  • 似乎是正在消耗大量内存,即使在应该释放任何资源之后也是如此。简单的演示 产出: 如果替换部分, 使用率大幅下降: 我在这里误解了什么/做错了什么?正在加载的文件很大(~60MB),但即使XNode需要使用那么多内存,也不应该在时间?

  • 不是内存泄漏或类似的问题,因为第一次连接后内存使用量不会增加,所以优化可能是加载更少的模块或做一些不同的事情...

  • 我听说chrome已经为“img”元素实现了本机延迟加载,firefox也将很快跟进。 我找到的解释告诉我们,当您向img元素添加一个属性load=“lazy”时,它只会在浏览器认为它“靠近”视口时请求src url,“close”的定义取决于实际可用带宽。 我的问题实际上是关于内存消耗。在实际加载了延迟加载的图像,并且图像离视口足够远之后,浏览器是否会释放内存,在必要时再次延迟加载(可能是从磁盘

  • 问题内容: 该表包含大约一千万行。 这会导致内存使用量稳定增加到4 GB左右,这时行将快速打印。第一行打印之前漫长的延迟使我感到惊讶–我希望它几乎可以立即打印。 我也尝试过以相同的方式表现。 我不知道Django将什么加载到内存中或为什么这样做。我希望Django在数据库级别遍历结果,这意味着结果将以大致恒定的速率打印(而不是经过漫长的等待一次全部打印)。 我误会了什么? (我不知道它是否相关,但

  • 问题内容: 我是所有内存管理主题的新手,所以有很多我不了解的事情。 我正在尝试将图像缓存在我的应用程序中,但是我在内存消耗方面遇到了麻烦: 所有的Bitmap Chaching代码都可以从此处复制粘贴:http : //developer.android.com/training/displaying- bitmaps/index.html 我调试了代码,并在Eclipse的DDMS视图中检查了堆

  • 问题内容: 我需要监视应用程序产生的线程消耗的内存量。如果贪婪的线程消耗太多内存,则想法是采取纠正措施。我已提到Java线程占用多少内存?。关于该链接的建议之一是在我尝试以下工作时使用。 我在四个线程上运行了很长时间。尽管作业不会连续地累积内存,但是所返回的值会不断增加,甚至不会下降。这意味着不会返回线程使用的堆上的实际内存量。它返回自线程启动以来在堆上为线程分配的内存总量。我的平台详细信息如下: