使用 jpmml 时树大小的限制
Limit of tree size when using jpmml
在jpmml(版本1.1.16)中使用树模型时有大小限制吗?
当我有一个超大树(PMML 大小为数百 MB,几百万片叶子)用于某些输入时,我得到此异常:
java.lang.NullPointerException
at org.jpmml.evaluator.PredicateUtil.evaluateSimplePredicate(PredicateUtil.java:79)
at org.jpmml.evaluator.PredicateUtil.evaluate(PredicateUtil.java:54)
at org.jpmml.evaluator.TreeModelEvaluator.evaluateNode(TreeModelEvaluator.java:171)
at org.jpmml.evaluator.TreeModelEvaluator.handleTrue(TreeModelEvaluator.java:186)
at org.jpmml.evaluator.TreeModelEvaluator.handleTrue(TreeModelEvaluator.java:197)
at org.jpmml.evaluator.TreeModelEvaluator.handleTrue(TreeModelEvaluator.java:197)
at org.jpmml.evaluator.TreeModelEvaluator.evaluateTree(TreeModelEvaluator.java:139)
at org.jpmml.evaluator.TreeModelEvaluator.evaluateRegression(TreeModelEvaluator.java:94)
at org.jpmml.evaluator.TreeModelEvaluator.evaluate(TreeModelEvaluator.java:77)
at org.jpmml.evaluator.MiningModelEvaluator.evaluateSegmentation(MiningModelEvaluator.java:463)
at org.jpmml.evaluator.MiningModelEvaluator.evaluateRegression(MiningModelEvaluator.java:149)
at org.jpmml.evaluator.MiningModelEvaluator.evaluate(MiningModelEvaluator.java:130)
at org.jpmml.evaluator.MiningModelEvaluator.evaluate(MiningModelEvaluator.java:106)
at org.jpmml.evaluator.ModelEvaluator.evaluate(ModelEvaluator.java:263)
at org.openscoring.service.ModelResource.evaluate(ModelResource.java:550)
at org.openscoring.service.ModelResource.doEvaluate(ModelResource.java:404)
at org.openscoring.service.ModelResource.doEvaluateCsv(ModelResource.java:339)
at org.openscoring.service.ModelResource.evaluateCsv(ModelResource.java:299)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
at java.lang.reflect.Method.invoke(Unknown Source)
at org.glassfish.jersey.server.model.internal.ResourceMethodInvocationHandlerFactory.invoke(ResourceMethodInvocationHandlerFactory.java:81)
at org.glassfish.jersey.server.model.internal.AbstractJavaResourceMethodDispatcher.run(AbstractJavaResourceMethodDispatcher.java:143)
at org.glassfish.jersey.server.model.internal.AbstractJavaResourceMethodDispatcher.invoke(AbstractJavaResourceMethodDispatcher.java:160)
at org.glassfish.jersey.server.model.internal.JavaResourceMethodDispatcherProvider$ResponseOutInvoker.doDispatch(JavaResourceMethodDispatcherProvider.java:158)
at org.glassfish.jersey.server.model.internal.AbstractJavaResourceMethodDispatcher.dispatch(AbstractJavaResourceMethodDispatcher.java:97)
at org.glassfish.jersey.server.model.ResourceMethodInvoker.invoke(ResourceMethodInvoker.java:389)
at org.glassfish.jersey.server.model.ResourceMethodInvoker.apply(ResourceMethodInvoker.java:347)
at org.glassfish.jersey.server.model.ResourceMethodInvoker.apply(ResourceMethodInvoker.java:102)
at org.glassfish.jersey.server.ServerRuntime.run(ServerRuntime.java:303)
at org.glassfish.jersey.internal.Errors.call(Errors.java:271)
at org.glassfish.jersey.internal.Errors.call(Errors.java:267)
at org.glassfish.jersey.internal.Errors.process(Errors.java:315)
at org.glassfish.jersey.internal.Errors.process(Errors.java:297)
at org.glassfish.jersey.internal.Errors.process(Errors.java:267)
at org.glassfish.jersey.process.internal.RequestScope.runInScope(RequestScope.java:317)
at org.glassfish.jersey.server.ServerRuntime.process(ServerRuntime.java:286)
at org.glassfish.jersey.server.ApplicationHandler.handle(ApplicationHandler.java:1072)
at org.glassfish.jersey.servlet.WebComponent.service(WebComponent.java:399)
at org.glassfish.jersey.servlet.ServletContainer.service(ServletContainer.java:381)
at org.glassfish.jersey.servlet.ServletContainer.service(ServletContainer.java:344)
at org.glassfish.jersey.servlet.ServletContainer.service(ServletContainer.java:221)
at org.eclipse.jetty.servlet.ServletHolder.handle(ServletHolder.java:808)
at org.eclipse.jetty.servlet.ServletHandler.doHandle(ServletHandler.java:587)
at org.eclipse.jetty.server.handler.ContextHandler.doHandle(ContextHandler.java:1127)
at org.eclipse.jetty.servlet.ServletHandler.doScope(ServletHandler.java:515)
at org.eclipse.jetty.server.handler.ContextHandler.doScope(ContextHandler.java:1061)
at org.eclipse.jetty.server.handler.ScopedHandler.handle(ScopedHandler.java:141)
at org.eclipse.jetty.server.handler.ContextHandlerCollection.handle(ContextHandlerCollection.java:215)
at org.eclipse.jetty.server.handler.HandlerWrapper.handle(HandlerWrapper.java:97)
at org.eclipse.jetty.server.Server.handle(Server.java:497)
at org.eclipse.jetty.server.HttpChannel.handle(HttpChannel.java:310)
at org.eclipse.jetty.server.HttpConnection.onFillable(HttpConnection.java:257)
at org.eclipse.jetty.io.AbstractConnection.run(AbstractConnection.java:540)
at org.eclipse.jetty.util.thread.QueuedThreadPool.runJob(QueuedThreadPool.java:635)
at org.eclipse.jetty.util.thread.QueuedThreadPool.run(QueuedThreadPool.java:555)
at java.lang.Thread.run(Unknown Source)
没有这样的限制,前提是您使用的是 64 位操作系统,并且适当地增加了 JVM 堆大小(例如通过设置 -Xms8G -Xmx64G
)。
您绝对应该考虑升级到更新的 Openscoring/JPMML-Evaluator 版本(例如,从 1.1.16
到 1.2.12
)。如果您拥有功能强大的硬件,那么单个 Openscoring 实例可以轻松容纳数百 GB(是的,GB 而不是 MB)的 PMML 模型。
至于这个特殊的异常,已知某些 JAXB library/JVM 组合会在解组期间损坏数据。您正在目睹这样一种情况,其中某些 SimplePredicate
元素属性的值为 "lost"。例如,已知当 运行 Java 1.7 on Mac OS.
时会发生这种情况
您可以通过将 Java 版本升级到 Java 1.8 来解决此异常。
在jpmml(版本1.1.16)中使用树模型时有大小限制吗?
当我有一个超大树(PMML 大小为数百 MB,几百万片叶子)用于某些输入时,我得到此异常:
java.lang.NullPointerException at org.jpmml.evaluator.PredicateUtil.evaluateSimplePredicate(PredicateUtil.java:79) at org.jpmml.evaluator.PredicateUtil.evaluate(PredicateUtil.java:54) at org.jpmml.evaluator.TreeModelEvaluator.evaluateNode(TreeModelEvaluator.java:171) at org.jpmml.evaluator.TreeModelEvaluator.handleTrue(TreeModelEvaluator.java:186) at org.jpmml.evaluator.TreeModelEvaluator.handleTrue(TreeModelEvaluator.java:197) at org.jpmml.evaluator.TreeModelEvaluator.handleTrue(TreeModelEvaluator.java:197) at org.jpmml.evaluator.TreeModelEvaluator.evaluateTree(TreeModelEvaluator.java:139) at org.jpmml.evaluator.TreeModelEvaluator.evaluateRegression(TreeModelEvaluator.java:94) at org.jpmml.evaluator.TreeModelEvaluator.evaluate(TreeModelEvaluator.java:77) at org.jpmml.evaluator.MiningModelEvaluator.evaluateSegmentation(MiningModelEvaluator.java:463) at org.jpmml.evaluator.MiningModelEvaluator.evaluateRegression(MiningModelEvaluator.java:149) at org.jpmml.evaluator.MiningModelEvaluator.evaluate(MiningModelEvaluator.java:130) at org.jpmml.evaluator.MiningModelEvaluator.evaluate(MiningModelEvaluator.java:106) at org.jpmml.evaluator.ModelEvaluator.evaluate(ModelEvaluator.java:263) at org.openscoring.service.ModelResource.evaluate(ModelResource.java:550) at org.openscoring.service.ModelResource.doEvaluate(ModelResource.java:404) at org.openscoring.service.ModelResource.doEvaluateCsv(ModelResource.java:339) at org.openscoring.service.ModelResource.evaluateCsv(ModelResource.java:299) at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source) at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source) at java.lang.reflect.Method.invoke(Unknown Source) at org.glassfish.jersey.server.model.internal.ResourceMethodInvocationHandlerFactory.invoke(ResourceMethodInvocationHandlerFactory.java:81) at org.glassfish.jersey.server.model.internal.AbstractJavaResourceMethodDispatcher.run(AbstractJavaResourceMethodDispatcher.java:143) at org.glassfish.jersey.server.model.internal.AbstractJavaResourceMethodDispatcher.invoke(AbstractJavaResourceMethodDispatcher.java:160) at org.glassfish.jersey.server.model.internal.JavaResourceMethodDispatcherProvider$ResponseOutInvoker.doDispatch(JavaResourceMethodDispatcherProvider.java:158) at org.glassfish.jersey.server.model.internal.AbstractJavaResourceMethodDispatcher.dispatch(AbstractJavaResourceMethodDispatcher.java:97) at org.glassfish.jersey.server.model.ResourceMethodInvoker.invoke(ResourceMethodInvoker.java:389) at org.glassfish.jersey.server.model.ResourceMethodInvoker.apply(ResourceMethodInvoker.java:347) at org.glassfish.jersey.server.model.ResourceMethodInvoker.apply(ResourceMethodInvoker.java:102) at org.glassfish.jersey.server.ServerRuntime.run(ServerRuntime.java:303) at org.glassfish.jersey.internal.Errors.call(Errors.java:271) at org.glassfish.jersey.internal.Errors.call(Errors.java:267) at org.glassfish.jersey.internal.Errors.process(Errors.java:315) at org.glassfish.jersey.internal.Errors.process(Errors.java:297) at org.glassfish.jersey.internal.Errors.process(Errors.java:267) at org.glassfish.jersey.process.internal.RequestScope.runInScope(RequestScope.java:317) at org.glassfish.jersey.server.ServerRuntime.process(ServerRuntime.java:286) at org.glassfish.jersey.server.ApplicationHandler.handle(ApplicationHandler.java:1072) at org.glassfish.jersey.servlet.WebComponent.service(WebComponent.java:399) at org.glassfish.jersey.servlet.ServletContainer.service(ServletContainer.java:381) at org.glassfish.jersey.servlet.ServletContainer.service(ServletContainer.java:344) at org.glassfish.jersey.servlet.ServletContainer.service(ServletContainer.java:221) at org.eclipse.jetty.servlet.ServletHolder.handle(ServletHolder.java:808) at org.eclipse.jetty.servlet.ServletHandler.doHandle(ServletHandler.java:587) at org.eclipse.jetty.server.handler.ContextHandler.doHandle(ContextHandler.java:1127) at org.eclipse.jetty.servlet.ServletHandler.doScope(ServletHandler.java:515) at org.eclipse.jetty.server.handler.ContextHandler.doScope(ContextHandler.java:1061) at org.eclipse.jetty.server.handler.ScopedHandler.handle(ScopedHandler.java:141) at org.eclipse.jetty.server.handler.ContextHandlerCollection.handle(ContextHandlerCollection.java:215) at org.eclipse.jetty.server.handler.HandlerWrapper.handle(HandlerWrapper.java:97) at org.eclipse.jetty.server.Server.handle(Server.java:497) at org.eclipse.jetty.server.HttpChannel.handle(HttpChannel.java:310) at org.eclipse.jetty.server.HttpConnection.onFillable(HttpConnection.java:257) at org.eclipse.jetty.io.AbstractConnection.run(AbstractConnection.java:540) at org.eclipse.jetty.util.thread.QueuedThreadPool.runJob(QueuedThreadPool.java:635) at org.eclipse.jetty.util.thread.QueuedThreadPool.run(QueuedThreadPool.java:555) at java.lang.Thread.run(Unknown Source)
没有这样的限制,前提是您使用的是 64 位操作系统,并且适当地增加了 JVM 堆大小(例如通过设置 -Xms8G -Xmx64G
)。
您绝对应该考虑升级到更新的 Openscoring/JPMML-Evaluator 版本(例如,从 1.1.16
到 1.2.12
)。如果您拥有功能强大的硬件,那么单个 Openscoring 实例可以轻松容纳数百 GB(是的,GB 而不是 MB)的 PMML 模型。
至于这个特殊的异常,已知某些 JAXB library/JVM 组合会在解组期间损坏数据。您正在目睹这样一种情况,其中某些 SimplePredicate
元素属性的值为 "lost"。例如,已知当 运行 Java 1.7 on Mac OS.
您可以通过将 Java 版本升级到 Java 1.8 来解决此异常。