从Java里挪用R – 利用Rserve
当前位置:以往代写 > 其他教程 >从Java里挪用R – 利用Rserve
2019-06-14

从Java里挪用R – 利用Rserve

从Java里挪用R – 利用Rserve

前段时间先容了在Java中配置与利用JRI的要领。这种方法有一些漏洞:

  • R需要与JVM运行在同一台呆板上,当R需要运行大型计较时,会耗用大量CPU与内存,因此会影响到JVM的机能
  • JRI的配置需要当地库的支持,运行的时候照旧有些贫苦的

  • Rserve可以办理这两个问题,同时也有JRI一样的易用性。它的道理是提供以HTTP方法毗连的R语言接口, 因此可以让专门一台呆板来运行RServe,然后让Java或其它语言的客户端来举办毗连。特另外长处是,可以支持Java在内的多种客户端。


    Rserve推荐在Linux下利用,因为在Windows平台上还很不完善(下面会先容)。但由于大都措施员照旧习惯于在Windows情况下举办开拓,照旧有须要找到在Windows长举办它的步伐。这篇文章主要先容这个情况的话题。


    安装RServe


    以下以Windows平台为例先容安装的要领。Rserve可以从其网站下载单独安装,但更利便的方法是从R中直接举办安装,只需运行


    install.packages(‘Rserve’)


    然后,需要手动复制$R_HOME/library/rserve/Rserve*.exe到bin/i386里(视平台而定)。


    运行时,在呼吁行输入:


    R CMD Rserve


    你会获得它乐成运行的提示。


    要想封锁处事,较好的要领是从任务打点器里直接杀死rserve.exe历程。我发此刻呼吁行窗口按Ctrl-C好像有时并不能乐成封锁处事, 这个很奇怪。


    利用与范围


    Windows上运行Rserve照旧有很大的范围性的。


    较大的问题是,所有的毗连城市在一个事情空间内运行。所以当客户端是多线程措施时,大概会造成线程间相互滋扰。我们需要在客户端做一些特另外事情,使它可以或许以线程安详的方法运行。Java端可以通过利用synchronize使得同一时间只有一个线程利用R处事。


    Rserve的另一个缺点是,它的错误处理惩罚过于简朴化,假如R端呈现错误,它抛出的异常对付找到问题的来源险些没有任何用处。所以我发起R端的措施必然要多写LOG,或以统一的方法处理惩罚异常。


    其次,开拓中需要留意的是,Rserve同时只答允一个客户端毗连。因此,假如第二个线程试图毗连时,它就会一直处在期待状态。别的,假如要更新R包,也需要封锁并从头启动Rserve。所以,假如发明客户端毗连时呈现异常环境,查察一下任务打点器,看是不是有多个Rserve的线程在运行,可能你的处事有没有重启,往往可以辅佐办理问题。


    以下源码是一个利用Rserve实现线程安详的R处事的Java客户端。包括了用Spring设置的RService工具, 以及相关的TestNG的测试。下载后需要做一些设置和修改才气利用,不外对象较量简朴,主要是演示这个idea。


    源码下载:RService.zip


    示例


    以下Java代码演示了利用上面zip包中的R处事工具来挪用R语言来生成图形的要领。

    RService rService = new RService();
    RConnection re = rService.startTransaction(); //开始独有事情空间

    double[][] xx = …; //生成两个二维数组
    double[][] yy = …;

    File tempFile = null;
    try {
    re.assign(“x”, xx); //给R的变量赋值
    re.assign(“y”, yy);
    tempFile = File.createTempFile(“test-“, “.jpg”); //把图像生成到文件
    String filePath = tempFile.getAbsolutePath();
    logger.info(“Plot file to be produced:” + filePath);
    re.eval(“jpeg(‘” + StringEscapeUtils.escapeJava(filePath) + “‘)”);
    re.eval(“qqplot(x,y)”); //画图
    re.eval(“dev.off()”);
    } catch (IOException e) {
    logger.warn(“Failed to create temp file”, e);
    } finally {
    this.rService.endTransaction(); //退出时必然要封锁此事情空间
    }

    Rserve网站已经移到RForge上:http://www.rforge.net/Rserve/

      关键字:

    在线提交作业