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
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值