0

Is there a size limit when using tree models with jpmml (version 1.1.16)?

When I have an extra large tree (PMML size is hundreds of MB, several millions of leaves) for some inputs I get this exception:

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$1.invoke(ResourceMethodInvocationHandlerFactory.java:81) at org.glassfish.jersey.server.model.internal.AbstractJavaResourceMethodDispatcher$1.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$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) 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$2.run(AbstractConnection.java:540) at org.eclipse.jetty.util.thread.QueuedThreadPool.runJob(QueuedThreadPool.java:635) at org.eclipse.jetty.util.thread.QueuedThreadPool$3.run(QueuedThreadPool.java:555) at java.lang.Thread.run(Unknown Source)

scf
  • 396
  • 2
  • 19

1 Answers1

1

There is no such limit, provided that you're using a 64-bit operating system, and have increased JVM heap size appropriately (eg. by setting -Xms8G -Xmx64G).

You should definitely consider upgrading to a more recent Openscoring/JPMML-Evaluator version (eg. from 1.1.16 to 1.2.12). Provided that you have capable hardware, then a single Openscoring instance can easily hold several hundred gigabytes (yes, GB not MB) worth of PMML models.

As for this particular exception, then it is known that some JAXB library/JVM combinations can corrupt data during unmarshalling. You're witnessing a situation, where the value of some SimplePredicate element attribute has been "lost". For example, this is known to happen when running Java 1.7 on Mac OS.

You can solve this exception by upgrading your Java version to Java 1.8.

user1808924
  • 4,563
  • 2
  • 17
  • 20
  • Thank you! I will try the upgrades (will take some time) and post another comment if it worked. – scf Mar 10 '16 at 13:44
  • Updated Java and jpmml to latest versions, now everything works smoothly. – scf Mar 27 '16 at 07:24