java与R语言的交互 —— Rserve多线程



java与R语言的交互 —— Rserve多线程

本人最近负责的一个项目:应用层采用了Java,数据分析部分采用了R语言,并且Java与R语言的交互采用了Rserve。
在项目开发的过程中,发现了一个严重的问题,是R语言不支持多线程,就导致Java使用Rserve与R交互时,必须等上一个R计算执行完毕才能进行下一个计算。这对于生产项目是完全不可行的,但是老板催的急,没有办法再换数据分析语言,只有硬着头皮想解决方案了。
在分析了整个项目之后,发现整个项目中比较耗时的计算只有一个,所有想到了再起一个服务,把这个耗时的计算独立出去。这就是下面要说的采用多连接的方式来实现伪多线程,毕竟R语言的弊端不是我们小白说解决就给解决的。
(有不对之处,望各位大佬斧正)

采用多连接的方式来实现Rserve的伪多线程(一个端口为一个连接)

一、Rserver 环境搭建

1.Rserve的安装

这里使用的环境为:Windows 10 64bit和R-3.3.3。
Step1:首先,在系统环境变量中添加R语言的2个路径:

R_HOME
F:\develop_tools\R\R-3.3.3

在这里插入图片描述

%R_HOME%\bin\i386
%R_HOME%\bin\x64

在这里插入图片描述

Step2:启动Windows的cmd。输入:“R”后,R语言若可以启动则说明环境变量设置正确,如下图所示。否则检查Step1中的环境变量设置是否正确。
在这里插入图片描述
Step3:安装并加载Rserve,即在上面的R会话中输入:

> install.packages("Rserve")
> library(Rserve)

Step4:启动R服务端。Rserve服务端启动有2种主要方式
1、在R会话环境中启动Rserve:在R环境中,若加载了Rserve程序包,则直接使用Rserve()函数即可。

> library(Rserve)
> Rserve()
Starting Rserve...
  "F:\develop_tools\R\R-33~1.3\library\Rserve\libs\i386\Rserve.exe"

2、在CMD命令行中,首先我们要R安装目录下/library/Rserve/libs中,将Rserve.exe和Rserve.dll复制到R安装目录的/bin对应的文件夹中。在本文64位系统下bin文件夹下面分别存在i386和x64二套程序,对应了~/library/Rserve/libs中2个文件夹。
随后,在命令行中输入

R CMD Rserve --help

在这里插入图片描述
结果如图,说明可以启动Rserve了

2. Rserve的配置

在Rserve初始启动时,我们还不能够设置远程客户端,这时需要配置一下Rserve。
先查看Rserve服务端默认配置信息。
启动cmd,输入:

R CMD Rserve --RS-settings

在这里插入图片描述

上图中可见,其配置文件在命令行当前路径下,名为 R s e r v e . c f g \color{red}Rserve.cfg Rserve.cfg
远程访问,认证,命令控制均为开启。
现需要修改默认配置。新建文件Rserve.cfg,输入如下:

workdir /tmp/Rserv
remote enable
fileio enable
interactive yes
port 6311
maxinbuf 262144
encoding utf8
control enable
source start.R
plaintext enable

其中,上述信息还包含了一个start.R脚本。我们新建一个start.R脚本里面输入:

cat("This is my Rserve!!")
print(paste("Server start at",Sys.time()))

将脚本文件和配置复制到命令行目录下,本文为F:\develop_tools\R\R-3.3.3\bin\x64。脚本文件用于提示我们启动服务端成功!
重新查看默认配置信息,R CMD Rserve --RS-settings
在这里插入图片描述

结果如上图所示,说明我们已经开启了远程连接,但是并没设置认证,此时远程客户端可以无认证访问服务端。

3. Rserve的启动

完成上述安装配置后,在命令中输入R CMD Rserve,即可启动Rserve服务端。可见,我们成功启动了Rserve
在这里插入图片描述

这个时候,我们可以在Windows下查看进程,里面会包含有一个Rserve进程

二.配置Rserve的多线程

采用主从服务器的方式,来实现R语言的多线程

R语言作为计算型语言,本人认为它没有像如今的python一样流行的主要原因是:R语言本身不支持多线程。
为了克服这一点,我采用主从服务器多连接的方式来达到伪多线程的效果。
步骤是:
启动两个Rserve服务,将这两个服务部署在不同的端口上面,以达到可以给客户端两个连接的效果。说白了就是重复上述2.Rserve配置,修改里面的端口号即可,然后分别启动6311和6312的Rserve。
在这里插入图片描述
下图是本地启动两个Rserve服务的效果图:
1.首先查看对应的端口号:

netstat -ano

在这里插入图片描述在这里插入图片描述2.在任务管理器中查看这两个进程
在这里插入图片描述在这里插入图片描述

  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
Java可以通过Rserve这个R语言的远程调用服务来调用R语言的函数。在Java中,我们需要使用Rserve连接到R语言的服务器,然后使用RConnection类创建一个与R语言的连接,最后使用RConnection类的assign()方法来调用R语言的赋值函数。 具体的操作步骤如下: 1. 在R语言中,使用Rserve库启动R语言服务器,可以使用以下命令启动: ```R library(Rserve) Rserve() ``` 2. 在Java中,使用Rserve连接到R语言的服务器,可以使用以下代码: ```java import org.rosuda.REngine.Rserve.RConnection; RConnection connection = new RConnection("localhost", 6311); // 连接到Rserve服务器 ``` 3. 调用R语言的赋值函数,例如: ```java connection.assign("x", new double[]{1.0, 2.0, 3.0}); // 将向量[1.0, 2.0, 3.0]赋值给变量x ``` 在这个例子中,我们使用RConnection类的assign()方法将一个Java数组赋值给了R语言中的变量x,这相当于在R语言中执行了以下命令: ```R x <- c(1.0, 2.0, 3.0) ``` 如果您想要调用其他的R语言函数,也可以使用RConnection类的eval()方法来执行R代码。例如,如果您想要调用一个名为myfunction的R函数,可以使用以下代码: ```java connection.eval("myfunction(x)"); // 调用名为myfunction的R函数,并传入变量x作为参数 ``` 其中,"myfunction(x)"是一个字符串,表示要在R语言中执行的代码。如果myfunction函数返回了一个结果,可以使用RConnection类的get()方法来获取这个结果。例如: ```java double[] result = connection.eval("myfunction(x)").asDoubles(); // 获取myfunction函数的返回结果,并将其转换为Java的double数组 ``` 以上就是Java调用R语言赋值函数的基本方法。需要注意的是,在使用Rserve时需要确保R语言Rserve都已经正确安装,并且已经启动了Rserve服务器。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值