在 servlet 中使用 renjin

Use renjin in a servlet

我已经在 R 中训练了一个模型,并想使用 renjin 在 servlet 中计算预测。预测始终使用相同的唯一模型。

为了避免花费资源实例化 renjin 并为每个请求加载相同的模型,我正在考虑在 servet 容器启动时(在 ServletContextListener 中)在单例对象中实例化 renjin 并加载一次模型。

我的问题是:这样进行是否是线程安全的?当多个预测请求同时完成时(使用在同一实例中加载的同一模型),它如何与 renjin 一起工作?这样做的正确方法是什么:我应该在 renjin 实例上使用锁来保证它的线程安全吗?还是创建一个线程池?

不应使用单个 Renjin Session 同时评估多个脚本。

然而,您可以维护 Renjin ScriptEngine 对象池,或者使用 ThreadLocal 简单地为每个线程维护一个对象,就像我在 RenjinServlet 示例中所做的那样。

如果您不希望出现高级别的并发请求,则同步访问单个 ScriptEngine 实例也可行。

数据可以共享会话,但是,如果内存有问题,那么你 可以先从类路径或 WEB-INF 加载模型,然后与每个 ScriptEngine 实例共享。