0

将树模型与 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) 在 org.jpmml.evaluator.evaluator.TreeModelEvaluator.evaluateTree(TreeModelEvaluator.java:139) 在 org.jpmml.evaluator.TreeModelEvaluator.evaluateRegression(TreeModelEvaluator.java:94) 在 org.jpmml.evaluator.TreeModelEvaluator。评估(TreeModelEvaluator.java:77) 在 org.jpmml.evaluator.MiningModelEvaluator.evaluateRegression(MiningModelEvaluator.java:149) 在 org.jpmml.evaluator.MiningModelEvaluator.evaluate(MiningModelEvaluator.java:463) 在 org.jpmml.evaluator.MiningModelEvaluator.evaluateSegmentation(MiningModelEvaluator.java:463) :130) 在 org.jpmml.evaluator.MiningModelEvaluator.evaluate(MiningModelEvaluator.java:106) 在 org.jpmml.evaluator.ModelEvaluator.evaluate(ModelEvaluator.java:263) 在 org.openscoring.service.ModelResource.evaluate(ModelResource. java:550) 在 org.openscoring.service.ModelResource.doEvaluate(ModelResource.java:404) 在 org.openscoring.service.ModelResource.doEvaluateCsv(ModelResource.java:339) 在 org.openscoring.service.ModelResource.evaluateCsv(ModelResource .java:299) 在 sun.reflect。Sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source) 的 NativeMethodAccessorImpl.invoke0(Native Method) org.glassfish 的 java.lang.reflect.Method.invoke(Unknown Source) sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)。 jersey.server.model.internal.ResourceMethodInvocationHandlerFactory$1.invoke(ResourceMethodInvocationHandlerFactory.java:81) 在 org.glassfish.jersey.server.model.internal.AbstractJavaResourceMethodDispatcher$1.run(AbstractJavaResourceMethodDispatcher.java:143) 在 org.glassfish.jersey。 server.model.internal.AbstractJavaResourceMethodDispatcher.invoke(AbstractJavaResourceMethodDispatcher.java:160) 在 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)在 org.glassfish.jersey.server.model.ResourceMethodInvoker.apply(ResourceMethodInvoker.java:102)在 org.glassfish.jersey .server.ServerRuntime$2.run(ServerRuntime.java:303) at org.glassfish.jersey.internal.Errors$1.call(Errors.java:271) at org.glassfish.jersey.internal.Errors$1.call(Errors. java:267) 在 org.glassfish.jersey.internal.Errors.process(Errors.java:315) 在 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) 在 org.glassfish.jersey.server.ServerRuntime.process(ServerRuntime.java:286) 在 org.glassfish.jersey.server.ApplicationHandler.handle(ApplicationHandler.java:1072) 在 org.glassfish.jersey .servlet.WebComponent.service(WebComponent.java:399) 在 org.glassfish.jersey.servlet.ServletContainer.service(ServletContainer.java:381) 在 org.glassfish.jersey.servlet.ServletContainer.service(ServletContainer.java:344 ) 在 org.glassfish.jersey.servlet.ServletContainer.service(ServletContainer.java:221) 在 org.eclipse.jetty.servlet.ServletHolder.handle(ServletHolder.java:808) at org.eclipse.jetty.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) 在 org.eclipse.jetty.server.handler.ContextHandler.doScope(ContextHandler.java:1061) 在 org.eclipse.jetty.server.handler.ScopedHandler.handle(ScopedHandler .java:141) 在 org.eclipse.jetty.server.handler.ContextHandlerCollection.handle(ContextHandlerCollection.java:215) 在 org.eclipse.jetty.server.handler.HandlerWrapper.handle(HandlerWrapper.java:97) 在 org. eclipse.jetty.server.Server.handle(Server.java:497) 在 org.eclipse.jetty.server.HttpChannel.handle(HttpChannel.java:310) 在 org.eclipse.jetty.server。org.eclipse.jetty.io.AbstractConnection$2.run(AbstractConnection.java:540) 处的 HttpConnection.onFillable(HttpConnection.java:257) org.eclipse.jetty.util.thread.QueuedThreadPool.runJob(QueuedThreadPool.java:635) ) 在 org.eclipse.jetty.util.thread.QueuedThreadPool$3.run(QueuedThreadPool.java:555) 在 java.lang.Thread.run(Unknown Source)

4

1 回答 1

1

没有这样的限制,前提是您使用的是 64 位操作系统,并且适当地增加了 JVM 堆大小(例如,通过设置-Xms8G -Xmx64G)。

您绝对应该考虑升级到更新的 Openscoring/JPMML-Evaluator 版本(例如 from 1.1.16to 1.2.12)。如果您拥有强大的硬件,那么单个 Openscoring 实例可以轻松容纳数百 GB(是的,GB 不是 MB)的 PMML 模型。

至于这个特殊的例外,那么众所周知,一些 JAXB 库/JVM 组合可能会在解组期间损坏数据。您正在目睹一种情况,其中某些SimplePredicate元素属性的值已“丢失”。例如,已知在 Mac OS 上运行 Java 1.7 时会发生这种情况。

您可以通过将 Java 版本升级到 Java 1.8 来解决此异常。

于 2016-03-10T13:19:41.717 回答