【问题标题】:how should we I use a modelEvaluator of JPMML evaluator in java multithreaded code?我们应该如何在java多线程代码中使用JPMML评估器的modelEvaluator?
【发布时间】:2017-02-22 18:19:23
【问题描述】:

我正在使用 JPMML 评估器库,并且 PMML 实例对于所有评估器都很常见,它会阻止评估器并创建锁定。同时以多线程方式处理。

//single threaded

PMML pmml = <new pmml>

//multithreaded
ModelEvaluator<MiningModel> someModelEvaluatorThread = new MiningModelEvaluator(genderPmml);

它会起作用还是会影响性能。我没有创建特定的 pmml 线程,因为我不想一次又一次地解析同一个文件。

【问题讨论】:

    标签: java multithreading pmml


    【解决方案1】:

    JPMML-Evaluator 库的 README.md 文件说:

    模型评估器类遵循函数式编程原则并且是完全线程安全的。

    如果您在所有线程之间共享相同的模型评估器实例,或者为每个线程创建一个单独的模型评估器实例,这无关紧要 - 它们都会相处得很好。可变状态封装在 org.jpmml.evaluator.EvaluationContext 对象实例中,对于每个评估请求都是“私有的”。

    此外,JPMML-Evaluator 库不包含任何synchronized 代码块,也不使用任何锁定机制。随着您启动更多线程,您的应用程序的吞吐量应该会线性增加。

    【讨论】:

    • 谢谢哥们,我发现问题是争用问题,因为 JPMML 使用了 java 库中的 parseDouble,它是同步的并导致线程阻塞,这在 java 8 中已修复
    • 非常有趣的观察!出于文档目的,这里是这个 JDK 问题的详细描述:bugs.openjdk.java.net/browse/JDK-7032154
    猜你喜欢
    • 1970-01-01
    • 2021-07-22
    • 2013-03-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多